python3学习《机器学习实战》书中的报错及解决办法

python3学习《机器学习实战》书中的报错及解决办法(更新中)

《机器学习实战》是一本很不错的书,其采用的是py2的语法格式,在用最新的python3.6编写代码的过程中,书中有一些代码因为格式不对就会报错,本人记录了学习过程中遇到的BUG,综合了网上的解决办法,现整理如下,供后来者参考

第二章 KNN

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()即可

第三章 决策树

发现一个排版问题,见红框处:
python3学习《机器学习实战》书中的报错及解决办法_第1张图片

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')    # 二进制方式

你可能感兴趣的:(机器学习,&,深度学习)