决策树函数代码解析

这里简单的利用机器学习实战的案例,走一遍程序代码,理论没搞清楚,程序就更难理解了,真实心累a!中间一些代码没有贴。。。

#创建数据集
def creatDataSet():
    dataSet=[[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]
    labels=['no surfacing','flippers']
    return dataSet,labels

#创建树的函数代码
def createTree(dataSet,labels):
    classList=[example[-1] for example in dataSet]
    #复制最后一列的标签列表‘yes’,‘no’
    if classList.count(classList[0])==len(classList):
        #list.count(CL[0]),对第一个元素标签计数,如果标签个数与列表长度相同,则标签只有一种,返回标签
        return classList[0]
    if len(dataSet[0])==1:
        #列表的第0个元素长度为1,仅剩一个特征了但是也无法将数据按标签分开
        return majorityCnt(classList)
        #返回一个出现次数最多的类别标签
    bestFeat=chooseBestFeatureToSplit(dataSet)
    #选择一个最好的划分方式,并返回最佳特征的位置,第几个特征
    bestFeatLabel=labels[bestFeat]
    #获取最佳特征的标签
    myTree={bestFeatLabel:{}}
    #创建带有最佳特征标签的嵌套字典的树
    del(labels[bestFeat])
    #每划分一层,特征就减少一个,去除最佳特征的标签
    featValues=[example[bestFeat] for example in dataSet]
    #最佳特征的特征值
    uniqueVals=set(featValues)
    #set将列表划分为集合,删除重复的特征值(0,1)
    for value in uniqueVals:
        subLabels=labels[:]
        #减少后的特征标签
        myTree[bestFeatLabel][value]=createTree(splitDataSet(dataSet,bestFeat,value),subLabels)
        #splitDataSet再根据最佳特征划分数据集,考虑属于不同特征值的子数据集
    return myTree
myTree=Tree.createTree(my,lab)
bestFeatLabel:
no surfacing
myTree:
{'no surfacing': {}}
featValues:
[1, 1, 1, 0, 0]
uniqueVals:
{0, 1}
subLabels:
['flippers']
myTree:
{'no surfacing': {0: 'no'}}
subLabels:
['flippers']
bestFeatLabel:
flippers
myTree:
{'flippers': {}}
featValues:
[1, 1, 0]
uniqueVals:
{0, 1}
subLabels:
[]
myTree:
{'flippers': {0: 'no'}}
subLabels:
[]
myTree:
{'flippers': {0: 'no', 1: 'yes'}}
myTree:
{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}

首先选择的第一个最佳特征是“0”,标签是"no surfacing",创建一个字典{‘no surfacing’: {}},获取其特征值[1, 1, 1, 0, 0],去重{0, 1},进入for循环,value=0,下一个子标签(也就是下一层)‘flippers’,但是这一层还没处理完别着急!将原数据集中value=0的数据集创建分支,可知 classList只有‘no‘,出现的次数与长度相等,所以就直接返回classList[0]了,现在的树是这样的{‘no surfacing’: {0: ‘no’}}。继续进行下一循环value=1,下一个子标签还是’flippers’(目前还在第一层),将原数据集中value=1的数据集创建分支,可知 classList有‘no’ ‘yes’,无法判别哪一类,由此进入下一层(寻找下一个最佳特征)!
最佳特征标签’flippers’(终于用上了!),创建树{‘flippers’: {}},获取特征值[1, 1, 0],去重{0, 1},进入for循环,此时已经没有多余的特征了,所以subLabels为空列表,value=0,数据列表元素只有只有一个,classList只’no‘,’0‘的个数和classList长度又相等了,所以直接返回标签,得到字典{‘flippers’: {0: ‘no’}},继续循环value=1,此时数据列表有两个,classList只有’yes‘,’1‘的个数和classList长度又相等了,所以直接返回标签,得到字典{‘flippers’: {0: ‘no’, 1: ‘yes’}},这是第二层!

最终树为:{‘no surfacing’: {0: ‘no’, 1: {‘flippers’: {0: ‘no’, 1: ‘yes’}}}}三个叶子节点’0‘,’0‘,’1‘,两个判断节点’no surfacing’,‘flippers’

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值