5

我正在阅读Machine Learning In Action并且正在阅读决策树章节。我了解决策树的构建使得拆分数据集为您提供了一种构建分支和叶子的方法。这会在树的顶部为您提供更有可能的信息,并限制您需要做出多少决定。

这本书展示了一个确定数据集香农熵的函数:

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

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

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

我不明白为什么本书中的香农熵函数只查看特征数组中的最后一个元素?看起来它只计算“是”或“否”项目的熵,而不是任何其他特征的熵?

在此处输入图像描述

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

dataSet = [[1, 1, 'yes'],
    [1, 'asdfasdf', 'yes'],
    [1900, 0, 'no'],
    [0, 1, 'no'],
    ['ddd', 1, 'no']]

与上面的熵相同,尽管它有更多不同的数据。

为了给出数据集的总熵,不应该计算其他特征元素,还是我误解了熵计算应该做什么?

如果有人好奇,本书的完整源代码(即代码的来源)位于 Chapter03 文件夹下。

4

1 回答 1

8

这里潜在的歧义是您正在查看的数据集同时包含特征和结果变量,结果变量位于最后一列。您要解决的问题是“功能 1 和功能 2 是否可以帮助我预测结果”?

另一种表述方式是,如果我根据特征 1 拆分数据,我能否获得有关结果的更好信息?

在这种情况下,不进行拆分,结果变量为 [ yes, yes, no, no, no ]。如果我在功能 1 上拆分,我会得到 2 个组:功能 1 = 0 -> 结果是 [否,否] 功能 1 = 1 -> Ouctome 是 [是,是,否]

这里的想法是看看你是否会更好地进行拆分。最初,你有一个特定的信息,由 [是,是,否,否,否] 的香农熵描述。拆分后,您有两个组,其中特征 1 = 0 的组具有“更好的信息”:您知道在这种情况下结果为否,并且由 [no, no] 的熵来衡量。

换句话说,该方法是确定在您可用的功能中是否有一个,如果使用,可以增加您关心的信息,即结果变量。树构建将在每一步贪婪地选择具有最高信息增益的特征,然后查看是否值得进一步拆分结果组。

于 2013-05-19T20:07:51.793 回答