机器学习实战-决策树ID3

import matplotlib.pyplot as plt
# boxstyle是文本框类型 fc是边框粗细 sawtooth是锯齿形
'''xy是终点坐标
xytext是起点坐标
可能疑问:为什么说是终点,但是却是箭头从这出发的?
解答:arrowstyle="<-" 看到没有,这是个反向的箭头'''
decisionNode=dict(boxstyle="sawtooth",fc="0.8")
leafNode=dict(boxstyle="round4",fc="0.8")
arrow_args=dict(arrowstyle="<-")

#createPlot 主函数,调用即可画出决策树,其中调用登了剩下的所有的函数,inTree的形式必须为嵌套的决策树

def createPlot():
    fig=plt.figure(1,facecolor='white') # 新建一个画布,背景设置为白色的
    fig.clf()# 将画图清空
    createPlot.ax1=plt.subplot(111,frameon=False)# 设置一个多图展示,但是设置多图只有一个,
    # 但是设置参数是111,构建了一个1*1的模块,并操作对象指向第一个图。
    plotNode('decision', (0.5,0.1),(0.1,0.5),decisionNode)
    plotNode('leaf', (0.8,0.5),(0.3,0.7),leafNode)
    plt.show()

def plotNode(nodeTxt,centerPt,parentPt,nodeType):#plotNode函数有nodeTxt,centerPt, parentPt, nodeType这四个参数。
                                                 # nodeTxt用于记录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)#annotate是注释的意思,
                                                                        # 也就是作为原来那个框的注释,也是添加一些新的东西
def getNumLeafs(mytree):
    numLeafs=0
    firstSides = list(myTree.keys())# python3支持语句,和后面mytree.key()[0]功能一样
    firstStr = firstSides[0]
    #firstStr=mytree.key()[0]# 找到输入的第一个元素,第一个关键词为划分数据集类别的标签
    secondDict=mytree[firstStr]# mytree经过第一个特征值分类后的字典
    for key in secondDict.keys():#测试数据是否为字典形式
        if type(secondDict[key]).__name__=='dict':#  type(secondDict[key]).__name__输出的是括号里面的变量的类型,即判断secondDict[key]对应的内容是否为字典类型
            numLeafs+=getNumLeafs(secondDict[key])
        else:  numLeafs+=1
    return numLeafs
##这部分内容详细解释如下图,两个图中每一步画的数字是相对应的内容,有助于大家理解。

def getTreeDepth(myTree):
    maxDepth=0
    firstSides = list(myTree.keys())# python3支持语句,和后面mytree.key()[0]功能一样
    firstStr = firstSides[0]
    #firstStr=myTree.keys()[0]# 找到输入的第一个元素,第一个关键词为划分数据集类别的标签
    secondDict=myTree[firstStr]# mytree经过第一个特征值分类后的字典
    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

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值