《机器学习实战》第九章

来源:互联网 发布:移动网络测速器在线测网速 编辑:程序博客网 时间:2024/05/19 17:52

在学习《Machine Learning in Active》的第九章时,由于自己使用的是python3所以在测试代码时出现了不少错误,下面就做一下整合,并给出解决方法

1.NameError: name 'errType' is not defined

最开始提示NameError: name 'errType' is not defined错误,所以我就把函数createTree()和chooseBestSplit()的声明改了一下。

原来的是:

def createTree(dataSet, leafType = regLeaf, errType = regErr, ops = (1, 4)):

def chooseBestSplit(dataSet, leafType = regLeaf, errType = regErr, ops = (1, 4)):

我的改法:

def createTree(dataSet, ops = (1, 4)):

def createTree(dataSet, ops = (1, 4)):

但是要记住要把两个函数中出现的所有leafType换成regLeaf,所有errType换成regErr,一定要注意,改了之后还要注意createTree()函数是一个迭代函数,函数里面的迭代语句里的四个参数也要改成2个,还有就是之后的算法中会修改leafType和errType的值,因为我们把它去掉了,所以要修改算法中的每一个leafType和errType

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

注意:后来发现,一定要把regLeaf和regErr放在createTree函数之前就可以编译通过了,这样就不用一直去修改函数名了

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

2.TypeError: unhashable type: 'matrix'

然后就出现了这个错误TypeError: unhashable type: 'matrix',错误出现在for splitVal in set(dataSet[:,featIndex]):这一条语句上,问题出现在set()函数的使用上,代码上边有这样一条语句:if len(set(dataSet[:,-1].T.tolist()[0])) == 1:

所以很容易就可以把原语句改成

for splitVal in set(dataSet[:,featIndex].T.tolist()[0]):

3.IndexError: index 0 is out of bounds for axis 0 with size 0

这个错误没啥可说的,直接把函数binSplitDataSet()里的mat0和mat1赋值语句的最后的[0]去掉就可以了

4.TypeError: unsupported operand type(s) for /: 'map' and 'int'

 这个错误困扰我很久,最后才想到它的错误不在提示的那一行,而是在最开始文件导入的函数loadDataSet()里,将

fltLine = map(float, curLine)

改成

fltLine = list(map(float, curLine))

就可以了