机器学习中熵、信息熵、信息增益的基本介绍

文摘   其他   2024-11-11 08:39   湖北  
在学习机器学习模型的时候,经常遇到‘熵’这个概念,信息熵、信息增益、决策树剪枝等都与熵有关。

1.熵的基本概念

熵(entropy)泛指某些物质系统状态的一种量度,某些物质系统状态可能出现的程度。熵的概念是由德国物理学家克劳修斯于1865年所提出。最初是用来描述“能量退化”的物质状态参数之一,在热力学中有广泛的应用。熵的本质是一个系统“内在的混乱程度”。
如果用实际日常生活中举例,熵就是来衡量一种不确定性,熵越大,不确定性越高。如果某人去李宁旗舰店一定会买鞋子,他买到李宁的鞋子概率为100%,不确定性为0,熵也为0。

2.信息熵

1948年,香农提出了“信息熵”的概念,用来对信息的量化度量,来量化信息的不确定性程度。如果一个选择的可能性如下:[yes,yes,no,no,no]
其对应的信息熵公式为:

底数一般取2或者e,本例后面取2.

上式信息熵可以算出结果为:0.97

3.信息增益

信息增益,是指按特征变量把原数据集进行分类,新的信息熵是否相较于之前的信息熵有减少。往往新的信息熵减少了,说明该分类有意义。假如有数据集: 

[[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]

如果不拆分信息熵为0.97。

按第一个变量拆分为两个数据集。

[[1,1,'yes'],[1,1,'yes'],[1,0,'no']]和[[0,1,'no'],[0,1,'no']]

分类后第一个数据集的信息熵为:

其结果为:0.92

分类后第二个数据集的信息熵为:

注:结果只有一个选择的数据集信息熵为0 其结果为:0

可见按第一个变量拆分数据集,其信息熵下降,混乱程度降低。其对应的信息增益为:

0.97-0.551=0.42

4.python代码实现

拆分、信息熵、信息增益的代码实现如下:
#计算熵(熵越大说明该数据集变化程度越高、不确定性越强)
from math import log,exp
def calcShannonEnt(dataSet):
    numEntries = len(dataSet)
    labelCounts = {}
    for featVec in dataSet: #the the number of unique elements and their occurance
        currentLabel = featVec[-1]
        if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0
        labelCounts[currentLabel] += 1
    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key])/numEntries
        shannonEnt -= prob * log(prob, 2) #log base 2
    return shannonEnt
#拆分数据集,方便后续求不同的熵
def splitDataSet(dataSet, axis, value):
    retDataSet = []
    for featVec in dataSet:
        if featVec[axis] == value:
            reducedFeatVec = featVec[:axis]     #chop out axis used for splitting
            reducedFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reducedFeatVec)
    return retDataSet
def chooseBestFeatureToSplit(dataSet):
    numFeatures = len(dataSet[0]) - 1      #the last column is used for the labels
    baseEntropy = calcShannonEnt(dataSet)
    bestInfoGain = 0.0; bestFeature = -1
    for i in range(numFeatures):        #iterate over all the features
        featList = [example[i] for example in dataSet]#create a list of all the examples of this feature
        uniqueVals = set(featList)       #get a set of unique values
        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     #calculate the info gain; ie reduction in entropy
        print("按第几个变量拆分:"+str(round(i,3)),"未拆分前的信息熵:"+str(round(baseEntropy,3)),
              "拆分后的信息熵:"+str(round(newEntropy,3)),"信息增益:"+str(round(infoGain,3)))
chooseBestFeatureToSplit([[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']])


理解熵、信息熵、信息增益的概念和算法之后,可以再好好理解决策树模型、随机森林、xgboost等,因为这些模型都是以熵为基础,通过一些算法来进行树模型的剪枝,尽可能的提升模型的预测效果。

Python学习杂记
数据分析与挖掘、运筹优化、机器学习、AI 、数据可视化等。
 最新文章