我们知道,在构建决策树的过程中,最重要的步骤就是计算信息熵以及信息增益,从而决定最优的分支,在下面的代码中,将实现这一过程
首先,在开始前,先说一下决策树构建中几个易混淆的点
假设一个样本中有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