【机器学习】决策树-02
心得体会:
1。使用字典树和matplotlib绘图
2.决策树可以用二进制方法‘wb+’存储到文本文件,用‘rb+’从文本文件提取
#3.2Matplotlib注解绘制树形图 #使用文本注解绘制树节点 import matplotlib 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): #annotate是在plt的subplot上标记的函数 createPlot.ax1.annotate(nodeTxt,xy=parentPt,xycoords='axes fraction',xytext=centerPt,\ textcoords='axes fraction',va="center",bbox=nodeType,arrowprops=arrow_args) # def createPlot(): # fig=plt.figure(1,facecolor='white')#图像编号1,背景色白色 # fig.clf() # Clear figure清除所有轴,但是窗口打开,这样它可以被重复使用 # createPlot.ax1=plt.subplot(111,frameon=False)# 1行1列,位置是1的子图——createPlot.ax1是plt子图的索引,可以通过ax1设计plt子图 # plotNode('决策节点',(0.5,0.1),(0.1,0.5),decisionNode) # plotNode('叶节点',(0.8,0.1),(0.0,0.0),leafNode) # plt.show() #注意:使用matplotlib时不要用qq输入法 # createPlot() #构造注解树 #获取叶节点的数目 def getNumLeafs(myTree): numLeafs=0 firstStr=list(myTree.keys())[0] secondDict=myTree[firstStr] for key in secondDict.keys(): if type(secondDict[key])==dict: numLeafs+=getNumLeafs(secondDict[key]) else:numLeafs+=1 return numLeafs #获得树的层数 def getTreeDepth(myTree): maxDepth=0 firstStr=list(myTree.keys())[0] secondDict=myTree[firstStr] for key in secondDict.keys(): if type(secondDict[key])==dict: thisDepth=1+getTreeDepth(secondDict[key]) else:thisDepth=1 if thisDepth>maxDepth:maxDepth=thisDepth return maxDepth #获得一颗树的数据 def retrieveTree(): myDat, labels = createDataSet() mytree = createTree(myDat, labels) return mytree # mytree=retrieveTree() # print(getNumLeafs(mytree)) # print(getTreeDepth(mytree)) #plotTree函数 def plotMidTest(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) plotMidTest(cntrPt,parentPt,nodeTxt) plotNode(firstStr,cntrPt,parentPt,decisionNode) secondDict=myTree[firstStr] plotTree.yOff=plotTree.yOff-1.0/plotTree.totalD for key in secondDict.keys(): if type(secondDict[key])==dict: plotTree(secondDict[key],cntrPt,str(key)) else: plotTree.xOff=plotTree.xOff+1.0/plotTree.totalW plotNode(secondDict[key],(plotTree.xOff,plotTree.yOff),cntrPt,decisionNode) plotMidTest((plotTree.xOff,plotTree.yOff), cntrPt, str(key)) plotTree.yOff=plotTree.yOff+1.0/plotTree.totalD def createPlot(inTree): fig=plt.figure(1,facecolor='white')#建立背景色白色图 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() # createPlot(retrieveTree()) # 3-3测试和存储分类器 def classify(inputTree,featLabels,testVec):#testVec存储着对每个featLabel的答案 firstStr=list(inputTree.keys())[0] secondDict=inputTree[firstStr] featIndex=featLabels.index(firstStr) for key in secondDict.keys(): if testVec[featIndex]==key: if type(secondDict[key])==dict: classLabel=classify(secondDict[key],featLabels,testVec) else: classLabel=secondDict[key] return classLabel #使用算法:决策树的存储 def storeTree(inputTree,filename): import pickle fw=open(filename,'wb') #二进制存 pickle.dump(inputTree,fw) fw.close() def grabTree(filename): import pickle fr=open(filename,'rb') ##二进制取 return pickle.load(fr) # myTree=retrieveTree() # storeTree(myTree,"E:/Python/PycharmProjects/机器学习实战/Include/第03章_决策树/s.txt") # print(grabTree("E:/Python/PycharmProjects/机器学习实战/Include/第03章_决策树/s.txt"))
#示例:使用决策树预测隐形眼镜的类型
fr=open("E:/Python/《机器学习实战》代码/Ch03/lenses.txt")
lenses=[]
for data in fr.readlines():
lenses.append(data.strip().split('\t'))
lensesLabels=['age','prescript','astigmatic','tearRate']
lensesTree=createTree(lenses,lensesLabels)
createPlot(lensesTree)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2019-07-09 【Java笔记】【Java核心技术卷1】chapter3 D5运算符
2019-07-09 【Java笔记】【Java核心技术卷1】chapter3 D3数据类型
2019-07-09 【Java笔记】【Java核心技术卷1】chapter3 D4变量
2019-07-09 【Java笔记】【Java核心技术卷1】chapter3 D2注释
2019-07-09 【Java笔记】【Java核心技术卷1】chapter3 D1JavaStandard