我正在阅读Machine Learning In Action
并正在浏览决策树章节。我知道决策树的构建使得分割数据集为您提供了构建分支和叶子的方法。这为您提供了更多可能在树顶部的信息,并限制了您需要经历的决策数量。
本书展示了确定数据集的shannon熵的函数:
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']]
我没有得到的是为什么本书中的shannon熵函数只能查看特征数组中的最后一个元素?看起来它只计算“是”或“否”项的熵,而不是任何其他特征的熵?
这对我来说没有意义,因为这个数据集的熵
dataSet = [[1, 1, 'yes'],
[1, 'asdfasdf', 'yes'],
[1900, 0, 'no'],
[0, 1, 'no'],
['ddd', 1, 'no']]
与上面的熵相同,即使它有更多不同的数据。
为了给出数据集的总熵,是否也不应计算其他要素元素,或者我是否误解了熵计算应该做什么?
如果有人好奇,本书的完整来源(此代码来自哪里)是Chapter03文件夹下的here。
答案 0 :(得分:8)
这里潜在的歧义是您正在查看的数据集包含要素和结果变量,结果变量位于最后一列。您要解决的问题是“功能1和功能2可以帮助我预测结果”吗?
说明这一点的另一种方法是,如果我根据功能1分割数据,我是否可以获得有关结果的更好信息?
在这种情况下,没有拆分,Outcome变量是[yes,yes,no,no,no]。如果我在功能1上拆分,我会得到2组: 特征1 = 0 - >结果是[不,不] 特征1 = 1 - > Ouctome是[是的,是的,不是]
这里的想法是看看你是否对这种分裂更好。最初,你有一些信息,由Shannon Entropy描述[是,是,不,不,不]。在拆分之后,你有两个组,其中特征1 = 0的组具有“更好的信息”:在这种情况下你知道结果是否,并且这是由[no,no]的熵测量的。
换句话说,方法是弄清楚,如果您使用的功能中有一个,如果使用的话,可以增加您关注的信息,即结果变量。树形建筑将贪婪地选择在每一步中获得最高信息增益的特征,然后查看是否值得进一步分割所得到的组。