Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 理解数据集的香农熵_Python_Machine Learning_Decision Tree_Entropy - Fatal编程技术网

Python 理解数据集的香农熵

Python 理解数据集的香农熵,python,machine-learning,decision-tree,entropy,Python,Machine Learning,Decision Tree,Entropy,我正在阅读《机器学习在行动》,正在浏览决策树一章。我知道决策树是这样构建的,拆分数据集可以为您提供一种构造分支和叶的方法。这将在树的顶部为您提供更多可能的信息,并限制您需要执行的决策数量 本书展示了一个确定数据集香农熵的函数: def calcShannonEnt(dataSet): numEntries = len(dataSet) labelCounts = {} for featVec in dataSet: #the the number of unique el

我正在阅读《机器学习在行动》,正在浏览决策树一章。我知道决策树是这样构建的,拆分数据集可以为您提供一种构造分支和叶的方法。这将在树的顶部为您提供更多可能的信息,并限制您需要执行的决策数量

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

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文件夹下。

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

另一种表述方式是,如果我根据功能1分割数据,我是否能获得关于结果的更好信息

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

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

换言之,方法是找出在您可用的功能中,是否有一个功能(如果使用)增加了您所关心的信息,即结果变量。树构建将贪婪地挑选在每一步中信息增益最高的特性,然后查看是否值得进一步拆分结果组