理解数据集的shannon熵

dev*_*rts 5 python machine-learning entropy decision-tree

我正在阅读Machine Learning In Action并正在阅读决策树章节.我知道决策树的构建使得分割数据集为您提供了构建分支和叶子的方法.这为您提供了更多可能在树顶部的信息,并限制了您需要经历的决策数量.

该书显示了确定数据集的shanon熵的函数:

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
Run Code Online (Sandbox Code Playgroud)

输入数据集是一个数组数组,其中每个数组代表一个潜在的可分类特征:

dataSet = [[1, 1, 'yes'],
    [1, 1, 'yes'],
    [1, 0, 'no'],
    [0, 1, 'no'],
    [0, 1, 'no']]
Run Code Online (Sandbox Code Playgroud)

我没有得到的是为什么本书中的shannon熵函数只能查看特征数组中的最后一个元素?看起来它只计算"是"或"否"项的熵,而不是任何其他特征的熵?

在此输入图像描述

这对我来说没有意义,因为这个数据集的熵

dataSet = [[1, 1, 'yes'],
    [1, 'asdfasdf', 'yes'],
    [1900, 0, 'no'],
    [0, 1, 'no'],
    ['ddd', 1, 'no']]
Run Code Online (Sandbox Code Playgroud)

与上面的熵相同,即使它有更多不同的数据.

为了给出数据集的总熵,是否也不应计算其他要素元素,或者我是否误解了熵计算应该做什么?

如果有人好奇,完整的源代码(这是该代码的来源)的书是这里的Chapter03文件夹下.

Mat*_*ias 8

这里潜在的模糊性是您正在查看的数据集包含要素和结果变量,结果变量位于最后一列.您要解决的问题是"功能1和功能2可以帮助我预测结果"吗?

说明这一点的另一种方法是,如果我根据功能1分割数据,我是否可以获得有关结果的更好信息?

在这种情况下,没有拆分,Outcome变量是[yes,yes,no,no,no].如果我在功能1上拆分,我得到2组:功能1 = 0 - >结果是[不,不]功能1 = 1 - >组织是[是,是,否]

这里的想法是看看你是否对这种分裂更好.最初,你有一些信息,由Shannon Entropy描述[是,是,不,不,不].在拆分之后,你有两个组,其中特征1 = 0的组具有"更好的信息":在这种情况下你知道结果是否,并且这是由[no,no]的熵测量的.

换句话说,该方法是要弄清楚,如果您使用的功能中有一个,如果使用的话,会增加您关注的信息,即结果变量.树形建筑将贪婪地选择在每一步中具有最高信息增益的特征,然后查看是否值得进一步分割所得到的组.