《机器学习实战》是一本很不错的书,其采用的是py2的语法格式,在用最新的python3.6编写代码的过程中,书中有一些代码因为格式不对就会报错,本人记录了学习过程中遇到的BUG,综合了网上的解决办法,现整理如下,供后来者参考
BUG1.程序清单2 - 2 将文本记录到转换NumPy的解析程序
报错:
ValueError: invalid literal for int() with base 10: 'largeDoses'
错误定位:
def file2matrix(filename): ...
>>> reload(kNN)
>>> datingDataMat,datingLabels = kNN.file2matrix('datingTestSet.txt')
原因及解决办法:
file2matrix并没有错误,错误的是传入的filename出错了,更准确的说是要用‘datingTestSet2.txt’,这两个文件的区别在于第四列类别的表示方法不同,如第一个文件中的“很喜欢”表示为“largeDoses”(也就是上面报错的那一个),它不能被处理为int型,而第二个文件就直接用1,2,3来代表didntLike,smallDoses,largeDoses。所以第二章所有的程序要改用目录下的’datingTestSet2.txt’。
BUG2.程序清单2 - 5 约会网站预测函数
报错:
NameError: name 'raw_input' is not defined
错误定位:
percentTats = float(raw_input(\
"percentage of time spent playing video game? " ))
原因及解决办法:
python3将raw_input和input进行了整合,只有input,所以将raw_input()改为input()即可
BUG1.程序清单3 - 8 使用决策树的分类函数:
报错:
TypeError: 'dict_keys' object does not support indexing
错误定位:
firstStr = inputTree.keys()[0]
原因及解决办法:
这是因为python3改变了dict.keys,返回的是dict_keys对象,支持iterable 但不支持indexable,我们可以将其明确的转化成list,如下
firstStr = list(inputTree.keys())[0]
注:本章中3.2小节的程序treePlotter.py也会多处出现此问题,按此方法解决。
BUG2.程序清单3 - 9 使用pickle模块存储决策树
报错:
TypeError: write() argument must be str, not bytes
错误定位:
def storeTree(inputTree,filename):
import pickle
fw = open(filename,'w')
pickle.dump(inputTree,fw) # 此句报错
fw.close()
原因及解决办法:
pickle模块默认二进制格式保存,所以修改一下open函数就可以了
fw = open(filename,'wb') # 二进制方式
注:文件保存成功后,二进制部分会显示为乱码,可不用管它,pickle模块能识别。
BUG3.程序清单3 - 9 使用pickle模块存储决策树
报错:
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 0: illegal multibyte sequence
错误定位:
def grabTree(filename):
import pickle
fr = open(filename)
return pickle.load(fr) # 此句报错
原因及解决办法:
也是BUG2中的同样原因,修改open函数如下即可正常读取。
fr = open(filename,'rb') # 二进制方式