ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

机器学习实战2.3--决策树之选择最好的数据集划分方式

2019-08-08 12:37:22  阅读:376  来源: 互联网

标签:实战 特征 newShannon 增益 dataSet 划分 2.3 数据 决策树


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.按照特征和这些特征值对数据集进行划分,并求得划分后数据集的熵,进行比较。找出划分数据集的最好特征并返回。

 

 

标签:实战,特征,newShannon,增益,dataSet,划分,2.3,数据,决策树
来源: https://blog.csdn.net/beautiful77moon/article/details/98855776

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有