1. 程式人生 > >關於決策樹可視化的treePlotter(學習筆記)

關於決策樹可視化的treePlotter(學習筆記)

AC 註意 屬性 desc 而且 box 顯示 ict 中心

網上的版本好像好久都沒更新了treePlotter是沒有人用了麽。今天學習的時候發現有些地方已經改了,我改的是在python 3.6 上的運行版本,需要導入matplotlib.pyplot

import matplotlib.pyplot as plt
# 定義決策樹決策結果屬性
descisionNode = dict(boxstyle=‘sawtooth‘, fc=‘0.8‘)
leafNode = dict(boxstyle=‘round4‘, fc=‘0.8‘)
arrow_args = dict(arrowstyle=‘<-‘)
# myTree = {‘no surfacing‘: {0: ‘no‘, 1: {‘flippers‘: {0: ‘no‘, 1: ‘yes‘}}}} def plotNode(nodeTxt, centerPt, parentPt, nodeType): # nodeTxt為要顯示的文本,centerNode為文本中心點, nodeType為箭頭所在的點, parentPt為指向文本的點 createPlot.ax1.annotate(nodeTxt, xy=parentPt, xycoords=‘axes fraction‘, xytext=centerPt, textcoords=‘axes fraction‘, va=‘center‘, ha=‘center‘, bbox=nodeType, arrowprops=arrow_args) # def createPlot(): # fig = plt.figure(1, facecolor=‘white‘) # fig.clf() # # createPlot.ax1為全局變量,繪制圖像句柄 # # frameon表示是否繪制坐標軸矩形 # createPlot.ax1 = plt.subplot(111, frameon=False) # plotNode(‘a decision node‘, (0.5, 0.1), (0.1, 0.5), descisionNode) # plotNode(‘a leaf node‘, (0.8, 0.1), (0.3, 0.8), leafNode) # plt.show() # 這個是用來測試的 # -----------分割線------------- # 獲取樹的葉子數和樹的深度 def getNumLeafs(myTree): numLeafs = 0 firstStr = list(myTree.keys())[0] secondDict = myTree[firstStr] for key in secondDict.keys(): if type(secondDict[key]).__name__ == ‘dict‘: numLeafs += getNumLeafs(secondDict[key]) else: numLeafs += 1 return numLeafs def getTreeDepth(myTree): maxDepth = 0 firstStr = list(myTree.keys())[0] # 這個是改的地方,原來myTree.keys()返回的是dict_keys類,不是列表,運行會報錯。有好幾個地方這樣 secondDict = myTree[firstStr] for key in secondDict.keys(): if type(secondDict[key]).__name__ == ‘dict‘: thisDepth = 1 + getTreeDepth(secondDict[key]) else: thisDepth = 1 if thisDepth > maxDepth: maxDepth = thisDepth return maxDepth # ---------分割線------------- # 制圖 def createPlot(inTree): fig = plt.figure(1, facecolor=‘white‘) fig.clf() axprops = {‘xticks‘: None, ‘yticks‘: None} createPlot.ax1 = plt.subplot(111, frameon=False) plotTree.totalW = float(getNumLeafs(inTree)) # 全局變量寬度 = 葉子數目 plotTree.totalD = float(getTreeDepth(inTree)) # 全局變量高度 = 深度 plotTree.xOff = -0.5/plotTree.totalW plotTree.yOff = 1.0 plotTree(inTree, (0.5, 1.0), ‘‘) plt.show() def plotTree(myTree, parentPt, nodeTxt): numLeafs = getNumLeafs(myTree) depth = getTreeDepth(myTree) firstStr = list(myTree.keys())[0] # cntrPt文本中心點, parentPt指向文本中心的點 cntrPt = (plotTree.xOff + (1.0 + float(numLeafs))/2.0/plotTree.totalW, plotTree.yOff) plotMidText(cntrPt, parentPt, nodeTxt) plotNode(firstStr, cntrPt, parentPt, descisionNode) seconDict = myTree[firstStr] plotTree.yOff = plotTree.yOff - 1.0/plotTree.totalD for key in seconDict.keys(): if type(seconDict[key]).__name__ == ‘dict‘: plotTree(seconDict[key], cntrPt, str(key)) else: plotTree.xOff = plotTree.xOff + 1.0/plotTree.totalW plotNode(seconDict[key], (plotTree.xOff, plotTree.yOff), cntrPt, leafNode) plotMidText((plotTree.xOff, plotTree.yOff), cntrPt, str(key)) plotTree.yOff = plotTree.yOff + 1.0/plotTree.totalD def plotMidText(cntrPt, parentPt, txtString): xMid = (parentPt[0] - cntrPt[0])/2.0 + cntrPt[0] yMid = (parentPt[1] - cntrPt[1])/2.0 + cntrPt[1] createPlot.ax1.text(xMid, yMid, txtString, va=‘center‘, ha=‘center‘, rotation=30) # createPlot(myTree)

  這個treePlotter導入了就可以把原來得到的決策樹模型導入啦,而且要註意是以字典形式導入,所以保存和導入文件的時候最好用json。

發布5分鐘之後,突然發現已經有人改過了,那就只算是個學習筆記吧 - -

關於決策樹可視化的treePlotter(學習筆記)