【问题标题】:Understanding shannon entropy of a data set了解数据集的香农熵
【发布时间】:2013-05-14 08:43:48
【问题描述】:

我正在阅读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 文件夹下的 here

【问题讨论】:

    标签: python machine-learning decision-tree entropy


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-02
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      相关资源
      最近更新 更多