特征选择---编写代码计算信息增益splitDataSet函数是用来选择各个特征的子集的,比如选择年龄(第0个特征)的青年(用0代表)的自己

特征选择---编写代码计算信息增益

splitDataSet函数是用来选择各个特征的子集的,比如选择年龄(第0个特征)的青年(用0代表)的自己,我们可以调用splitDataSet(dataSet,0,0)这样返回的子集就是年龄为青年的5个数据集。chooseBestFeatureToSplit是选择选择最优特征的函数。

代码如下:

# -*- coding: UTF-8 -*-

"""

函数说明:按照给定特征划分数据集

Parameters:

    dataSet - 待划分的数据集

    axis - 划分数据集的特征

    value - 需要返回的特征的值

Returns:

    无

"""

def splitDataSet(dataSet, axis, value):      

    retDataSet = [] #创建返回的数据集列表

    for featVec in dataSet: #遍历数据集

        if featVec[axis] == value:

            reducedFeatVec = featVec[:axis] #去掉axis特征

            reducedFeatVec.extend(featVec[axis+1:]) #将符合条件的添加到返回的数据集

            retDataSet.append(reducedFeatVec)

    return retDataSet #返回划分后的数据集

   

"""

函数说明:选择最优特征

Parameters:

    dataSet - 数据集

Returns:

    bestFeature - 信息增益最大的(最优)特征的索引值

"""

def chooseBestFeatureToSplit(dataSet):

    numFeatures = len(dataSet[0]) - 1                    #特征数量

    baseEntropy = calcShannonEnt(dataSet)                 #计算数据集的香农熵

    bestInfoGain = 0.0                                  #信息增益

    bestFeature = -1                                    #最优特征的索引值

    for i in range(numFeatures):                         #遍历所有特征

        #获取dataSet的第i个所有特征

        featList = [example[i] for example in dataSet]

        uniqueVals = set(featList)                         #创建set集合{},元素不可重复

        newEntropy = 0.0                                  #经验条件熵

        for value in uniqueVals:                         #计算信息增益

            subDataSet = splitDataSet(dataSet, i, value)         #subDataSet划分后的子集

            prob = len(subDataSet) / float(len(dataSet))           #计算子集的概率

            newEntropy += prob * calcShannonEnt(subDataSet)     #根据公式计算经验条件熵

        infoGain = baseEntropy - newEntropy                     #信息增益

        print("第%d个特征的增益为%.3f" % (i, infoGain))            #打印每个特征的信息增益

        if (infoGain > bestInfoGain):                             #计算信息增益

            bestInfoGain = infoGain                             #更新信息增益,找到最大的信息增益

            bestFeature = i                                     #记录信息增益最大的特征的索引值

    return bestFeature                                             #返回信息增益最大的特征的索引值

dataSet, features = createDataSet()

print("最优特征索引值:" + str(chooseBestFeatureToSplit(dataSet)))

  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小嘤嘤怪学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值