机器学习实战——决策树:matplotlib绘图
2017-11-12 19:48
381 查看
书籍:《机器学习实战》中文版
IDE:PyCharm Edu 4.02
环境:Adaconda3 python3.6
第一个例子:
结果:
注释:
关于matplotlib中的annotate:http://matplotlib.org/users/annotations_intro.html
第二个例子:
结果:
小结—类型的判断问题:
(1)使用type().__name__
比如本文中的使用
(2)使用isinstance
比如上一篇中决策树分类函数的定义
IDE:PyCharm Edu 4.02
环境:Adaconda3 python3.6
第一个例子:
import matplotlib.pyplot as plt #定义文本框和箭头格式 decisionNode = dict(boxstyle="sawtooth",fc="0.8") leafNode = dict(boxstyle="round4",fc="0.8") arrow_args = dict(arrowstyle="<-") #使用反转箭头 # 绘制带箭头的注解 def plotNode(nodeTxt,centerPt,parentPt,nodeType): 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 = plt.subplot(111,frameon=False) plotNode('a decision node',(0.5,0.1),(0.1,0.5),decisionNode) plotNode('a leaf node',(0.8,0.1),(0.3,0.8),leafNode) plt.show() print(createPlot())
结果:
注释:
关于matplotlib中的annotate:http://matplotlib.org/users/annotations_intro.html
第二个例子:
import matplotlib.pyplot as plt # 得到叶子节点数目 以便确定x轴范围 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 # 得到树的深度 以便确定y轴范围 # 即树(字典)中字典类型的数目 def getTreeDepth(myTree): maxDepth = 0 firstStr = list(myTree.keys())[0] 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 retrieveTree(i): listOfTrees =[{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}, {'no surfacing': {0: 'no', 1: {'flippers': {0: {'head': {0: 'no', 1: 'yes'}}, 1: 'no'}}}} ] return listOfTrees[i] #定义文本框和箭头格式 decisionNode = dict(boxstyle="sawtooth",fc="0.8") leafNode = dict(boxstyle="round4",fc="0.8") arrow_args = dict(arrowstyle="<-") #使用反转箭头 # 绘制带箭头的注解 def plotNode(nodeTxt,centerPt,parentPt,nodeType): createPlot.ax1.annotate(nodeTxt,xy=parentPt,xycoords='axes fraction', xytext=centerPt,textcoords='axes fraction', va="center",ha="center",bbox=nodeType,arrowprops=arrow_args) #文本信息的填充 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) #树的绘制 def plotTree(myTree,parentPt,nodeTxt): numLeafs = getNumLeafs(myTree) #depth = getTreeDepth(myTree) 没有用到此变量 firstStr = list(myTree.keys())[0] cntrPt = (plotTree.xOff + (1.0 + float(numLeafs))/2.0/plotTree.totalW, plotTree.yOff) plotMidText(cntrPt,parentPt,nodeTxt) plotNode(firstStr,cntrPt,parentPt,decisionNode) #cntrPt,parentPt坐标相同时,不绘制箭头。 secondDict = myTree[firstStr] plotTree.yOff = plotTree.yOff - 1.0/plotTree.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 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 # 主函数 def createPlot(inTree): fig = plt.figure() fig.clf() axprops = dict(xticks=[],yticks=[]) #表示不显示坐标轴 createPlot.ax1 = plt.subplot(111,frameon=False,**axprops) 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() print(createPlot(retrieveTree(0)))
结果:
小结—类型的判断问题:
(1)使用type().__name__
比如本文中的使用
for key in secondDict.keys(): if type(secondDict[key]).__name__=='dict': numLeafs += getNumLeafs(secondDict[key]) else: numLeafs += 1
(2)使用isinstance
比如上一篇中决策树分类函数的定义
def classify(inputTree,featLabels,testVec): firstStr = list(inputTree.keys())[0] secondDict = inputTree[firstStr] featIndex = featLabels.index(firstStr) key = testVec[featIndex] valueOfFeat = secondDict[key] if isinstance(valueOfFeat,dict): classLabel = classify(valueOfFeat,featLabels,testVec) else: classLabel = valueOfFeat return classLabel
相关文章推荐
- 机器学习实战之 决策树——ID3算法
- 机器学习实战---读书笔记: 第3章 决策树
- 机器学习实战第三章(决策树)
- 【机器学习实战】笔记二:决策树
- 机器学习实战之决策树(1)---ID3算法与信息熵,基尼不纯度
- [机器学习实战]-决策树
- 【机器学习实战】决策树预测Titanic遇难者生还情况
- 机器学习实战 决策树代码 计算香农熵 Error return arrays must be of ArrayType
- 机器学习python实战——决策树
- Python机器学习实战-决策树
- 【10月31日】机器学习实战(二)决策树:隐形眼镜数据集
- 机器学习实战第三章-决策树
- 机器学习实战第三章决策树
- 机器学习理论与实战(二)决策树
- 机器学习实战笔记3(决策树与随机森林)
- 决策树,decision的pyton代码和注释(机器学习实战)
- Python机器学习实战(二)--决策树
- 机器学习实战之决策树(1)---ID3算法与信息熵,基尼不纯度
- 机器学习实战-3决策树
- 机器学习实战第三章,决策树的实现