机器学习实战——决策树练习

'''
project:决策树

date:2018.08.22
'''
from math import log

def creatDataSet():
    dataSet=[[1,1,'yes'],
             [1,1,'yes'],
             [1,0,'no'],
             [0,1,'no'],
             [0,1,'no']]

    labels=['no surfacing','flippers']

'''
计算香农熵
'''
def calcShannonEnt(dataSet):                                #香农熵定义
    numlabels=len(dataSet)
    labelCounts = {}                                        #定义字典记录各,key为标签,value为对应标签出现次数
    for feaVec in dataSet:
        currentLabel=feaVec[-1]
        if currentLabel not in labelCounts:
            labelCounts[currentLabel]=0                     #若字典中没有该标签,则添加进字典中,在下一行代码记录一次
        labelCounts[currentLabel]+=1

    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key])/numlabels
        shannonEnt -= prob * log(prob,2)

    return shannonEnt


'''
划分数据
'''
def splitDataSet(dataSet,axis,value):
    retDataSet=[]                                         #创建列表
    for dataLine in dataSet:
        if dataLine[axis] == value:                       #找出第axis (从0开始数)个特征对应的值与和我们指定的value相等的行
            retDataSetVec = dataLine[:axis]
            retDataSetVec.extend(dataLine[axis+1:])        #将找到的行切割掉特征所在的列切割并将结果存放在新创建的列表中
            retDataSet.append(retDataSetVec)
    return retDataSet


'''
选择最好的数据集划分方式
'''

def chooseBestFeatureToSplit(dataSet):
    numFeatures = len(dataSet[0]) - 1
    baseEntropy = calcShannonEnt(dataSet)
    bestInfoGain = 0.0
    bestFeaturn = -1
    for i in range(numFeatures):
        featList = [example[i] for example in dataSet]          #获取dataSet中所有第i个特征值
        uniqfeatList = set(featList)
        newEntropy = 0.0
        for value in uniqfeatList:
            subDataSet = splitDataSet(dataSet,i,value)
            prob = len(subDataSet)/float(len(featList))
            newEntropy += prob * log(prob,2)

        infoGain = baseEntropy - newEntropy

        if(infoGain > bestInfoGain):
            bestInfoGain = infoGain
            bestFeaturn = i
        return bestFeaturn


if __name__ == '__main__':
    dataSet = [[1, 1, 'yes'],
               [1, 1, 'yes'],
               [1, 0, 'no'],
               [0, 1, 'no'],
               [0, 1, 'no']]

    labels = ['no surfacing', 'flippers']
    print("最优特征索引值:" + str(chooseBestFeatureToSplit(dataSet)))

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值