机器学习实战——决策树(读书笔记)

这篇博客详细探讨了机器学习中的决策树算法,从香农熵的概念出发,解释了信息熵如何衡量数据的无序程度。接着,博主介绍了如何计算香农熵,并逐步讲解了如何根据熵来划分数据集,为理解决策树的构建过程提供了实践指导。
摘要由CSDN通过智能技术生成

1.香农熵


信息熵是什么?

参考

https://www.zhihu.com/question/22178202/answer/49929786 知乎大神

香农熵代表数据的无序程度,香农熵越高,无序程度越高

2.计算香农熵

def calcShannonEnt(dataSet):
    """
            计算香农熵
    """
    numEntries = len(dataSet)#获取行数
    labelCounts = {}
    #计算出现的次数p(x)
    for featVec in dataSet: 
        currentLabel = featVec[-1]
        if currentLabel not in labelCounts.keys():
            labelCounts[currentLabel] = 0
        labelCounts [currentLabel] += 1
    
    #累计p(x)*log2p(x)
    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key])/numEntries
        shannonEnt -= prob*log(prob,2)
    return shannonEnt

给出数据集合

def createDataSet():
    dataSet = [[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]
    labels = ['no surfacing', 'flippers']
    return dataSet, labels

调用

import org.gfzs.machineLearning.decisionTree as dsTree

myDat, labels = dsTree.createDataSet()
print("myDat:{}".format(myDat))
shannonEnt = dsTree.calcShannonEnt(myDat)
print("shannonEnt:{}".format(shannonEnt))

输出结果

myDat:[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
shannonEnt:0.9709505944546686

3.划分数据集

def splitDataSet(dataSet, axis, value):
    """
           划分数据集 形成特征树的分支
    dataSet:待划分的数据集合
    axis: 划分数据集的特征
    value: 需要返回的特征的值
    """
    retDataSet = []
    for featVec in dataSet:
        if featVec[axis] == value:
            reduceFeatVec = featVec[:axis]
            reduceFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reduceFeatVec)
        
    return retDataSet

选择最优的数据划分方式,也就是根据某项特征值完成划分之后的数据集合的香农熵大,也就是说,要选择最优的特征值划分使得数据无序的程度大,这样分组能更优的表示数据

def chooseBestFeatureToSplit(dataSet):
    numFeatures = len(dataSet[0])-1 #特征值得数量
    baseEntropy = calcShannonEnt(dataSet) #计算香农熵
    bestInfoGain = 0.0
    bestFeature = -1
    for i in range(numFeatures) :
        #创建唯一的特征值集合
        featList = [example[i] for example in dataSet] #第i列的特征值集合
        uniqueVals = set(featList)#去重
        
        #计算每种划分方式的香农熵
        newEntropy = 0.0
        for value in uniqueVals:
            subDataSet = splitDataSet(dataSet, i, value)
            prob = len(subDataSet)/float(len(dataSet))
            newEntropy += prob*calcShannonEnt(subDataSet)
        infoGain = baseEntropy - newEntropy
        
        #选择最大的香农熵
        if (infoGain > bestInfoGain):
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature

根据实例来看:第0个特征值是最优的。再验证一下数据,根据第0个特征值,若是否那么非鱼类,而根据第1个特征值,划分后,无论是否,需要再次划分。那么就认为特征0划分的效果更好。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值