机器学习实战——树回归 实现记录

问题:同一个文件下定义了两个参数,如果需要调用另一个,需要把另一个放在前面定义

def regLeaf(dataSet):#returns the value used for each leaf
    return mean(dataSet[:,-1])

def regErr(dataSet):
    return var(dataSet[:,-1]) * shape(dataSet)[0]

def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)):#assume dataSet is NumPy Mat so we can array filtering
    feat, val = chooseBestSplit(dataSet, leafType, errType, ops)#choose the best split
    if feat == None: return val #if the splitting hit a stop condition return val
    retTree = {}
    retTree['spInd'] = feat
    retTree['spVal'] = val
    lSet, rSet = binSplitDataSet(dataSet, feat, val)
    retTree['left'] = createTree(lSet, leafType, errType, ops)
    retTree['right'] = createTree(rSet, leafType, errType, ops)
    return retTree  

问题参考:https://blog.csdn.net/sinat_17196995/article/details/69621687

此节代码对于Python3不适用过多

问题:TypeError: unsupported operand type(s) for /: 'map' and 'int'

# python3不适用:fltLine = map(float,curLine)

修改为: fltLine = list(map(float, curLine))#将每行映射成浮点数,python3返回值改变,所以需要

mat0 = dataSet[nonzero(dataSet[:, feature] > value)[0], :]
mat1 = dataSet[nonzero(dataSet[:, feature] <= value)[0], :]
#下面原书代码报错 index 0 is out of bounds,使用上面两行代码
#mat0 = dataSet[nonzero(dataSet[:, feature] > value)[0], :][0]
#mat1 = dataSet[nonzero(dataSet[:, feature] <= value)[0], :][0]


# for splitVal in set(dataSet[:,featIndex]): python3报错修改为下面
  for splitVal in set((dataSet[:, featIndex].T.A.tolist())[0]):#遍历每个特征里不同的特征值

测试代码前,有三处错误: 
1、TypeError: unsupported operand type(s) for /: ‘map‘ and ‘int‘ 
修改loadDataSet函数某行为fltLine = list(map(float,curLine)),因为python3中map的返回值变了,所以要加list() 
2、TypeError: unhashable type: ‘matrix’ 
修改chooseBestSplit函数某行为:for splitVal in set((dataSet[:,featIndex].T.A.tolist())[0]): matrix类型不能被hash。 
3、TypeError: index 0 is out of bounds 
函数修改两行binSplitDataSet 
mat0 = dataSet[nonzero(dataSet[:, feature] > value)[0], :] 
mat1 = dataSet[nonzero(dataSet[:, feature] <= value)[0], :]
 

问题:TypeError: string indices must be integers

问题:_tkinter.TclError: can't invoke "label" command: application has been destro

yed

>>> root = Tk()

运行完出来框以后不要关闭

>>> root=Tk() #创建一个空的tk窗口,注意弹出后不要关闭,然后继续输入下一行
>>> myLabel=Label(root,text="hello,Tkinter!")

问题:AttributeError: 'FigureCanvasTkAgg' object has no attribute 'show'

解决: The FigureCanvasTk.show function was deprecated in version 2.2. Use FigureCanvasTk.draw instead.

这是运用命令行的输出得到的修改提示。

C:\Windows\system32>cd C:/Users/34856/Desktop

C:\Users\34856\Desktop>python treeExplore.py
treeExplore.py:49: MatplotlibDeprecationWarning: The FigureCanvasTk.show function was deprecated in version 2.2. Use FigureCanvasTk.draw instead.
  reDraw.canvas.show()
Traceback (most recent call last):
  File "treeExplore.py", line 70, in <module>
    reDraw(1.0,10)
  File "treeExplore.py", line 21, in reDraw
    reDraw.a.scatter(reDraw.rawDat[:,0],reDraw.rawDat[:,1],s= 5)
  File "F:\anaconda\lib\site-packages\matplotlib\__init__.py", line 1855, in inner
    return func(ax, *args, **kwargs)
  File "F:\anaconda\lib\site-packages\matplotlib\axes\_axes.py", line 4287, in scatter
    x, y, s, c, colors, edgecolors, linewidths)
  File "F:\anaconda\lib\site-packages\matplotlib\cbook\__init__.py", line 1657, in delete_masked_points
    raise ValueError("Masked arrays must be 1-D")
ValueError: Masked arrays must be 1-D

C:\Users\34856\Desktop>

然鹅出现了另一个问题:ValueError: Masked arrays must be 1-D

不清楚是什么原理,只要加上array()就好了 = =

大概意思就是说矩阵对象不是一维(1-D)的,变成一维数组就好了。

reDraw.a.scatter(reDraw.rawDat[:,0],reDraw.rawDat[:,1],s= 5)

#正确:

reDraw.a.scatter(array(reDraw.rawDat[:,0]),array(reDraw.rawDat[:,1]),s= 5)

问题:AttributeError: 'numpy.ndarray' object has no attribute 'regTree'

yHat = regTree.createForeCast(myTree,reDraw.testDat.regTree.modelTreeEval)
#更改为
yHat = regTree.createForeCast(myTree,reDraw.testDat,regTree.modelTreeEval)

一般出现……has  no attribute '……'的时候一般都是拼写错误

猜你喜欢

转载自blog.csdn.net/ihiefoxboq/article/details/83109931