1. 程式人生 > >機器學習實戰——樹迴歸 實現記錄

機器學習實戰——樹迴歸 實現記錄

問題:同一個檔案下定義了兩個引數,如果需要呼叫另一個,需要把另一個放在前面定義

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 '……'的時候一般都是拼寫錯誤