机器学习实战错误校正

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

原文地址:https://www.cnblogs.com/zhhy236400/p/9860894.html