《机器学习》第4章决策树之详解信息熵,信息增益

参考:信息熵的公式推导https://www.zhihu.com/question/22178202/answer/161732605

一、信息熵公式:

样本数据

二、信息熵的计算

约等于0.970954

信息熵的代码实现

import math

def informationEntropy(dataset):
    nums = len(dataset) #样本的数量
    lables = {}         #用来记录结果集
    for samples in dataset:
        if samples[-1] not in lables:
            lables[samples[-1]] = 1
        else:
            lables[samples[-1]] += 1
    ents = 0.0
    for key in lables.keys():
        ff = lables[key] / nums
        ents -= ff* math.log(ff,2)
    return ents
dataset = [[1,1,1],[1,1,1],[1,0,0],[0,1,0],[0,1,0]]
print(dataset)
print(informationEntropy(dataset))

其中dataset是样本集

三、信息增益

关于信息增益可以根据代码来看。

def splitDataSet(dataSet,axis,value):
    retDataSet = []
    for featVec in dataSet:
        if featVec[axis] == value:
            reducedFeatVec = featVec[:axis]
            reducedFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reducedFeatVec)
    return retDataSet

def chooseBestFeatureToSplit(dataset):
    numFeatures = len(dataset[0]) - 1
    baseEntropy = informationEntropy(dataset)
    bestInfoGain = 0.0
    bestFeature = -1
    for i in range(numFeatures):
        feaList = [example[i] for example in dataset]
        uniqueVals = set(feaList)
        newEntropy = 0.0
        for value in uniqueVals:
            subDataset = splitDataSet(dataset, i, value)
            print("subdataset:", subDataset)
            prob = len(subDataset) / float(len(dataset))
            newEntropy += prob * informationEntropy(subDataset)
            print("newEntropy", newEntropy)
        infoGain = baseEntropy - newEntropy
        print(i, "--", infoGain)
        if bestInfoGain < infoGain:
            bestInfoGain = infoGain
            bestFeature = i
    return (bestInfoGain, i)

print(chooseBestFeatureToSplit(dataset))

信息增益计算解析:

numFeatures = 2 也就是两个属性,一个是颜色,一个是形状。

baseEntropy->信息熵。bestInfoGain->记录最佳信息增益. bestFeature->记录最佳信息增益的属性列

下面for循环【  for i in range(numFeatures):】是遍历每个属性,,计算出每个属性对应的信息增益。

uniqueVals是每个属性的数量。例如红不红,只有两个情况,1或者0, 这里没有考虑绿色,青色,红色,白色等等。仅仅考虑两种红不红。

uniqueVals = {0,1}. 简单记录为 { 不红= 0, 红 = 1}

splitDataSet 的计算,

三个参数,第一个参数是元数据,第二个参数是属性列,第三个参数是属性列对应的属性值。

当苹果为不红的时候也就是取0的时候,求出splitDataSet = [[1,0],[1,0]]

首先将苹果是否红这列属性去掉,然后仅仅取苹果为0(不红)的时候的两行,也就是最后两行

剩下就是根据公式计算。

注意:

信息增益越大越好。

部分内容参考:https://www.jianshu.com/p/69dbb042a0e3

发布了20 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qd1308504206/article/details/102959353
今日推荐