1. 程式人生 > >機器學習實戰錯誤校正

機器學習實戰錯誤校正

ron flow 函數代碼 set har nothing tail txt ack

機器學習實戰書中代碼用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

not word characters. Zero or more can be matched by "nothing", and if empty string is a match, where exactly do you expect splits will occur?

[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文件的第二段中有個“?”會帶來編碼問題,刪除即可。

機器學習實戰錯誤校正