1.划分数据集的依据
划分数据集最大的原则是:将无序的数据变得更加有序。在划分数据集之前之后信息发生的变化称为信息增益,获得信息增益最高的特征就是最好的选择。
怎样恒量信息增益呢?之前的一篇博客介绍了熵的概念。信息增益是上的减少或者数据无序度的减少。也就是说熵越小说明数据越有序。
2.怎样选择最好的数据集划分方式
遍历整个数据集,对每个特征划分数据集的结果计算一次信息熵,通过对比信息熵的大小,找到最好的划分方式。熵越小说明划分后的数据集越有序。
3.代码实现:
#选择最好的数据集划分方式
def chooseBestFeatureToSplit(dataSet):
numOfFeature=len(dataSet[0])-1
baseShannon=calcShannonEnt(dataSet) #计算原始香农熵
bestShannon=0.0
bestFeature=-1
for i in range(numOfFeature):
featureList=[featureVector[i]for featureVector in dataSet]#用列表推导式将第i个特征的值提取出来
featureSet=set(featureList) #利用集合的互异性找出特征的不同取值
newShannon=0.0
for value in featureSet:
subDataSet=splitDataSet(dataSet,i,value) #按照不同的特征划分数据集
#求新划分的数据集的香农熵
prob=float(len(subDataSet))/float(len(dataSet))
newShannon+=prob*calcShannonEnt(subDataSet)
shannon=baseShannon-newShannon #新划分数据集的熵越小,差值越大
if(shannon>bestShannon):
bestShannon=shannon
bestFeature=i
return bestFeature #返回特征的索引
测试这个函数:
dataSet=[[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]
print(chooseBestFeatureToSplit(dataSet))
运行结果:0
4.上述代码中涉及的其他函数:
1.计算熵:calcShannonEnt(dataSet) https://blog.csdn.net/beautiful77moon/article/details/98787824
2.划分数据集:splitDataSet(dataSet,feature,value) https://blog.csdn.net/beautiful77moon/article/details/98849123
5.代码步骤:
1.计算整个数据集的原始香农熵,保存最初的无序度量值,用以与划分完后的数据集计算的熵值进行比较。
2.第一个for循环遍历所有特征,使用列表推导式将数据集中所有第i个特征值写入这个新的列表中。列表推导式:https://blog.csdn.net/beautiful77moon/article/details/88935973
3.利用集合set的互异性,找出i特征的不同取值。
4.按照特征和这些特征值对数据集进行划分,并求得划分后数据集的熵,进行比较。找出划分数据集的最好特征并返回其索引。