机器学习之手写实现决策树的核心代码(构建过程+逐句讲解)

我们知道,在构建决策树的过程中,最重要的步骤就是计算信息熵以及信息增益,从而决定最优的分支,在下面的代码中,将实现这一过程

首先,在开始前,先说一下决策树构建中几个易混淆的点

假设一个样本中有N个属性,设a是其中的一个属性,这个属性,可以把这个样本分成多种情况,例如a1,a2,a3等等......(例如a是西瓜的色泽,a1=青绿,a2=乌黑,a3=浅白,之后通过得到这三种情况下正例,反例的个数,来计算这三种分类下的信息熵,并以此得到属性a的信息增益)

信息熵是针对划分后的样本而言,而不是对属性而言。如果按照某个属性对样本进行划分,使得划分后的样本在某个类别中占比更高,那么就说按照这个属性划分的样本具有更低的信息熵,而“信息增益”是对于属性而言的,信息增益越大,说明按照该属性进行划分能取得更好的效果。

所以,我们需要先计算按照属性a划分下每种情况的信息熵,再以此为基础计算信息增益。

信息熵的计算公式如下:

def information_entropy(dataSet):
    data_rows=len(dataSet)
    attrCount_dict = {}
    for i in dataSet:
        attribute=i[-1]#得到每一行样本的类别
        if attribute not in attrCount_dict.keys():
            attrCount_dict[attribute]+=1
            pass
        pass
    Entropy=0.0#信息熵
    #信息熵的计算公式
    for j in attrCount_dict:
        pk=float(attrCount_dict[j]/data_rows)
        Entropy=pk*math.log(pk,2)
        pass
    return Entropy

计算好了信息熵后,下面再来计算信息增益,想要得到信息增益,要得到根结点划分情况下的信息熵Ent(D)(在上一个例子中,就是属性a划分下样本的信息熵),根节点某一个代求分支属性下,该属性下不同的属性值的个数Dv(在上面的例子上来说,Dv就包括了a1,a2,a3,v从1到3),样本总数D,以及不同属性对应的每一个情况的信息熵Ent(Dv),信息增益的计算公式如下:

代码如下图所示:

def chooseBestFeature(dataSet):
    #信息熵
    Entropy=information_entropy(dataSet)
    #最小信息增益
    bestInfo=0.0
    #属性个数
    featureNum=len(dataSet[0]-1)
    #最优分支属性
    bestFeature=0.0
    for i in featureNum:
        valueList=[]
        for j in dataSet:
            valueList.append(j[i])
            pass
        uniqueValue=set(valueList)
        #计算信息增益
        for k in uniqueValue:
            subDataSet=splitDataSet(dataSet,i,k)
            prob=float(len(subDataSet)/len(dataSet))
            new_Entropy=prob*information_entropy(subDataSet)
            pass
        #infoGain是某一个属性下的信息增益
        infoGain=Entropy-new_Entropy
        if(infoGain>bestInfo):
            bestInfo=infoGain
            bestFeature=i
            pass
    return bestFeature

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值