機器學習實戰——樹迴歸 實現記錄
問題:同一個檔案下定義了兩個引數,如果需要呼叫另一個,需要把另一個放在前面定義
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 '……'的時候一般都是拼寫錯誤