机器学习实战错误校正
机器学习实战书中代码用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文件的第二段中有个“?”会带来编码问题,删除即可。