我假设在构建 decision trees 的上下文中提到了熵。
为了说明,想象一下learning 到classify 名字到男性/女性组的任务。给定一个名称列表,每个名称都标有m 或f,我们想学习一个适合数据的model,可以用来预测一个新的看不见的名字的性别。
name gender
----------------- Now we want to predict
Ashley f the gender of "Amro" (my name)
Brian m
Caroline f
David m
第一步是decidingfeatures 的哪些数据与我们要预测的目标类相关。一些示例特征包括:第一个/最后一个字母、长度、元音的数量、是否以元音结尾等等。所以在特征提取之后,我们的数据看起来像:
# name ends-vowel num-vowels length gender
# ------------------------------------------------
Ashley 1 3 6 f
Brian 0 2 5 m
Caroline 1 4 8 f
David 0 2 5 m
目标是建立一个decision tree。 tree 的一个例子是:
length<7
| num-vowels<3: male
| num-vowels>=3
| | ends-vowel=1: female
| | ends-vowel=0: male
length>=7
| length=5: male
基本上每个节点代表对单个属性执行的测试,我们根据测试结果向左或向右移动。我们不断遍历树,直到到达包含类预测的叶节点(m 或 f)
因此,如果我们在这棵树上运行名称 Amro,我们首先测试“长度是否”,答案是 yes em>,所以我们沿着那个分支走。在分支之后,下一个测试“is the number of vowels”再次评估为 true。这导致标记为m 的叶节点,因此预测是男性(我恰好是,所以树预测了结果correctly)。
决策树是built in a top-down fashion,但问题是如何选择在每个节点拆分哪个属性?答案是找到最能将目标类拆分为最纯子节点的特征(即:不包含男性和女性混合的节点,而是只有一个类的纯节点)。
这种纯度的度量称为information。它代表expected 的information 数量,在给定到达节点的示例的情况下,指定新实例(名字)是否应分类为男性或女性。我们计算它
基于节点的男性和女性类的数量。
另一方面,
Entropy 是衡量杂质的指标(相反)。它是为 binary class 定义的,其值为 a/b 为:
Entropy = - p(a)*log(p(a)) - p(b)*log(p(b))
这个binary entropy function 如下图所示(随机变量可以取两个值之一)。它在概率为p=1/2 时达到最大值,这意味着p(X=a)=0.5 或类似的p(X=b)=0.5 有50%/50% 的机会成为a 或b(不确定性最大)。当概率完全确定为p=1 或p=0(分别为p(X=a)=1 或p(X=a)=0,后者暗示p(X=b)=1)时,熵函数的最小值为零。
当然,熵的定义可以推广到具有 N 个结果(不仅仅是两个)的离散随机变量 X:
(公式中的log通常取为logarithm to the base 2)
回到我们的名称分类任务,让我们看一个例子。想象一下,在构建树的过程中,我们正在考虑以下拆分:
ends-vowel
[9m,5f] <--- the [..,..] notation represents the class
/ \ distribution of instances that reached a node
=1 =0
------- -------
[3m,4f] [6m,1f]
如您所见,在拆分之前,我们有 9 男 5 女,即P(m)=9/14 和P(f)=5/14。根据熵的定义:
Entropy_before = - (5/14)*log2(5/14) - (9/14)*log2(9/14) = 0.9403
接下来,我们将其与通过查看两个子分支考虑拆分后计算的熵进行比较。在ends-vowel=1 的左分支中,我们有:
Entropy_left = - (3/7)*log2(3/7) - (4/7)*log2(4/7) = 0.9852
和ends-vowel=0的右分支,我们有:
Entropy_right = - (6/7)*log2(6/7) - (1/7)*log2(1/7) = 0.5917
我们使用每个分支下的实例数为weight factor 组合左/右熵(左侧7 个实例,右侧7 个实例),得到拆分后的最终熵:
Entropy_after = 7/14*Entropy_left + 7/14*Entropy_right = 0.7885
现在通过比较拆分前后的熵,我们获得了information gain 的度量,或者我们通过使用该特定特征进行拆分获得了多少信息:
Information_Gain = Entropy_before - Entropy_after = 0.1518
您可以将上述计算解释为:通过使用end-vowels 特征进行拆分,我们能够将子树预测结果中的不确定性减少 0.1518(以@987654340 为单位) @ as units of information)。
在树的每个节点,对每个特征都执行此计算,并以greedy 的方式选择具有最大信息增益的特征进行拆分(因此有利于产生纯分裂具有低不确定性/熵)。此过程从根节点向下递归应用,并在叶节点包含所有具有相同类的实例时停止(无需进一步拆分)。
请注意,我跳过了一些超出本文范围的details,包括如何处理numeric features、missing values、overfitting和pruning树等。