機器學習實戰錯誤校正
機器學習實戰書中代碼用python2實現,當使用python3時會出現一些錯誤,這些錯誤由語法不同或者代碼不夠完善引起,學習過程中修改如下,方便大家學習。
1、page40,majorityCnt中的iteritems()
(1)在Python2.x中,iteritems() 用於返回本身字典列表操作後的叠代器【Returns an iterator on all items(key/value pairs) 】,不占用額外的內存。
(2)在Python 3.x 裏面,iteritems()方法已經廢除了。在3.x裏用 items()替換iteritems() ,可以用於 for 來循環遍歷。
[https://blog.csdn.net/program_developer/article/details/78657908]
[https://blog.csdn.net/liukai2918/article/details/78307271]
2、page41,創建樹的函數代碼
def createTree(dataset,featureList):
參數featureList傳進來後應該首先進行深拷貝出另一個list用來操作,按照書中的代碼,featureList會被刪除第一個特征,因為傳遞的是引用型,所以函數外部的featureList也會改變而且難以察覺,此處改為:
def createTree(dataset,featureList): #數據集,特征列表,產生決策樹,返回值是字典 featureListCopy=featureList[:]
函數內的featureList均改為featureListCopy。
3、page65,切分文本
regEx=re.compile(‘\\W*‘)
\w表示數字字母下劃線
\W表示非數字非字母非下劃線,即對\w取反
*表示匹配0次、1次或者多次
運行後拋出警告:
FutureWarning: split() requires a non-empty pattern match.
原因:用\W*匹配文本時表示非數字字母下劃線任意次,也就是說0次也符合匹配要求,0次就是nothing
Your regular expression (‘\\W*‘
) is invalid - it means zero or more
[https://stackoverflow.com/questions/37642284/futurewarning-split-requires-a-non-empty-pattern-match]
解決辦法:把*改成+即可。
4、page66,range()
python3中的range()返回的是range類型,不是list類型,此處需要修改:
將:
trainingSet=rang(50)
改為:
trainingSet=list(range(50))
5、用於分類的郵件中ham文件夾下第23.txt文件的第二段中有個“?”會帶來編碼問題,刪除即可。
機器學習實戰錯誤校正