決策樹 構造註解樹

2021-08-13 04:57:44 字數 3664 閱讀 1136

註解樹:將樹中的資訊新增到決策樹圖中。

note:繪製圖形的x軸有效範圍是0.0到1.0,y軸有效範圍也是0.0到1.0。

def

getnumleafs

(mytree):

#獲取葉節點樹

numleafs = 0

# firststr = mytree.keys()[0] #mytree的第乙個特徵值 python2寫法

first = list(mytree.keys())

firststr = first[0]

seconddict = mytree[firststr] #mytree經過第乙個特徵值分類後的字典

for key in seconddict.keys():

if type(seconddict[key]).__name__=='dict': #判斷是否分類過的資料為字典

numleafs += getnumleafs(seconddict[key]) #子節點數量+1 遞迴,判斷一共多少個子節點

else: numleafs += 1

return numleafs

defgettreedepth

(mytree):

#獲取樹深度

maxdepth = 0

# firststr = mytree.keys()[0] #mytree的第乙個特徵值 python2寫法

first = list(mytree.keys())

firststr = first[0]

seconddict = mytree[firststr] # mytree經過第乙個特徵值分類後的字典

for key in seconddict.keys():

if type(seconddict[key]).__name__ == 'dict': # 判斷是否分類過的資料為字典

thisdepth = 1 + gettreedepth(seconddict[key]) #數的深度+1

else: thisdepth = 1

if thisdepth > maxdepth: maxdepth = thisdepth

return maxdepth #最大深度

#二叉樹的深度是指有多少層, 而二元決策樹的深度是指經過多少層計算

#測試的樹資料

defretrievetree

(i):

listoftrees = [}}},

}, 1: 'no'}}}}]

return listoftrees[i]

defplotmidtext

(cntrpt, parentpt, txtstring):

#在座標點cntrpt和parentpt連線線上的中點,顯示文字txtstring

xmid = (parentpt[0]-cntrpt[0])/2.0 + cntrpt[0] #x座標

ymid = (parentpt[1]-cntrpt[1])/2.0 + cntrpt[1] #y座標

createplot.ax1.text(xmid, ymid, txtstring) #在(xmid, ymid)處顯示txtstring

defplottree

(mytree, parentpt, nodetxt):

numleafs = getnumleafs(mytree) #獲得當前樹葉節點個數

depth = gettreedepth(mytree) #獲得當前樹深度

# firststr = mytree.keys()[0] #mytree的第乙個特徵值 python2寫法

first = list(mytree.keys())

firststr = first[0] #第乙個分類的特徵值,即根節點

cntrpt = (plottree.xoff + (1.0 + float(numleafs))/2.0/plottree.totalw, plottree.yoff)

# plottree.xoff和plottree.yoff是用來追蹤已經繪製的節點位置,plottree.totalw為這個數的寬度,葉節點數

plotmidtext(cntrpt, parentpt, nodetxt) #顯示節點

plotnode(firststr, cntrpt, parentpt, decisionnode) #firststr為需要顯示的文字,cntrpt為文字的中心點,

# parentpt為箭頭指向文字的起始點,decisionnode為文字屬性

seconddict = mytree[firststr] #子樹

plottree.yoff = plottree.yoff - 1.0/plottree.totald #totald是這個數的深度,深度移下一層

for key in seconddict.keys():

if type(seconddict[key]).__name__=="dict":

plottree(seconddict[key], cntrpt, str(key)) #遞迴顯示子樹

else:

plottree.xoff = plottree.xoff + 1.0/plottree.totalw #x座標平移乙個單位

plotnode(seconddict[key], (plottree.xoff, plottree.yoff), cntrpt, leafnode) #畫葉節點

plotmidtext((plottree.xoff, plottree.yoff), cntrpt, str(key)) #顯示箭頭文字

plottree.yoff = plottree.yoff + 1.0/plottree.totald #下移一層深度

defcreateplot

(intree):

fig = plt.figure(1, facecolor = 'white') #建立乙個畫布,背景為白色

fig.clf() #畫布清空

axprops = dict(xticks=, yticks=) #定義橫縱座標軸,無內容

#ax1是函式createplot的乙個屬性,這個可以在函式裡面定義也可以在函式定義後加入也可以

# createplot.ax1 = plt.subplot(111, frameon = false, **axprops) #frameon表示是否繪製座標軸矩形,無座標軸

createplot.ax1 = plt.subplot(111, frameon = false) #frameon表示是否繪製座標軸矩形

plottree.totalw = float(getnumleafs(intree)) #樹的寬度

plottree.totald = float(gettreedepth(intree)) #樹的深度

plottree.xoff = -0.5/plottree.totalw #x軸起始值,之前一開始定義了1.0+,有乙個偏差

此樹葉節點為3,深度為2。

構造決策樹

注 先提交 和各行 的解釋,後續完善。參照機器學習實戰教材 from math import log import operator defcreatedataset 建立鑑定資料集 dataset 1,1,yes 1,1 yes 1,0 no 0,1 no 0,1 no labels no su ...

決策樹和CART決策樹

首先簡單介紹下決策樹 說到決策樹肯定離不開資訊熵 什麼是資訊熵 不要被這名字唬住,其實很簡單 乙個不太可能的時間居然發生了,要比乙個非常可能的時間發生提供更多的資訊。訊息說 今天早上太陽公升起 資訊量是很少的,以至於沒有必要傳送。但另一條訊息說 今天早上日食 資訊量就很豐富。概率越大資訊量就越少,與...

決策樹(二)決策樹回歸

回歸 決策樹也可以用於執行回歸任務。我們首先用sk learn的decisiontreeregressor類構造一顆回歸決策樹,並在乙個帶雜訊的二次方資料集上進行訓練,指定max depth 2 import numpy as np quadratic training set noise np.r...