使用信息增益和熵的决策树归纳

数据挖掘 决策树
2022-02-22 16:58:22

我正在尝试构建一个决策树算法,但我认为我误解了信息增益的工作原理。

假设我们有一个平衡的分类问题。因此,初始熵应该等于 1。

让我们定义信息增益如下:

info_gain = initial_entropy weighted_average(entropy(left_node)+entropy(right_node))

如果我们减少初始熵,我们就会获得信息,也就是说, if info_gain > 0. If info_gain == 0 这意味着

weighted_average(entropy(left_node) + entropy(right_node)) == initial_entropy.

假设我们有 4 个特征

weighted_average(entropy(left_node) + entropy(right_node))是这个顺序

wa_of_feature_0 > wa_of_feature_1 > … > wa_of_feature_4。

info_gain 大于 0 越大,该特征在系统中的排序越多。

因此,基于我们的 4 个特征,最大信息增益将是

info_gain_max = initial_entropy - wa_of_feature_4 

因为这会给我们比使用 1<=n<4 的 wa_of_feature_n 更大的数字。

这是正确的解释吗?

2个回答

让我们首先定义您要在决策树中实现的目标。

所以我们想要一棵正确分类数据的树?对于可用的特征数量,我想选择那些能给我关于我的类的最佳信息的特征,即一个特征对我的数据的分割程度如何?这将有助于我更好地分类。

现在是这样的技术,它可以帮助我理解我的子集是多么“纯”,即如果我选择 feature_1 来分割它应该如何分割我的数据,大多数类标签都来自同一类

所以熵是一种杂质度量。如果所有实例都来自同一类,则杂质为 0,因此E = 0,如果两个类的实例数量相同,则杂质最高E=1

现在,我们需要先选择最适合拆分的属性,然后递归地选择哪些属性稍后再拆分?

信息增益来了

信息增益只是告诉我一个属性与其他属性相比有多少有用/好。为此,我们将分裂前的“父节点”的熵与分裂后的“子节点”的杂质进行比较。差异越大,属性测试条件越好。

Higher gain = purer class

因此,初始熵应该等于 1。

1 是最高熵,这意味着如果我有 4 个实例,2 表示 +ve 和 2 表示 -Ve,因此它非常不纯。如果类是 4+ 和 0 -ve,它很可能是 0。依此类推。

如果我们减少初始熵,我们会获得信息

这个初始熵是分裂前数据集的熵或父节点的熵。它取决于数据。

info_gain 大于 0 越大,该特征在系统中的排序越多。

不,不是和0比较,而是所有属性的增益相互比较,

gain(w_1) = .4, g(W_2) = 1.2

然后最高增益为 W_2,因此 DT 将使用 W_2 进行拆分。

想象一下,如果您有一个具有 3 个属性 A1、A2、A3 的数据集,那么您应该首先测试哪个属性?

因此,计算完整集的熵,即 E(complete)

同样的方式 E(A1), E(A2), E(A3),

现在

gain(A1) = E(complete)-E(A1) = .2, gain(A2) = E(complete)-E(A2) = .5,gain(A3) = E(complete)-E(A3) =1

highest gain = 1因此我们将在 A3 上拆分

如果属性有相同的增益,那么我们会考虑顺序。

我们将子熵与父熵进行比较。所以我们必须按照分割尺寸给孩子称重,而不是 50-50。

直觉-
一个非常大的“丑陋”孩子和一个“伟大”的小孩子
在不考虑各自大小的情况下权衡这两个,会给你一个不错的熵,但实际上它并不是一个很好的分裂。

代码例如

a = [0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
p(0) = 0.4, p(1) = 0.6
entropy = -(0.4*np.log2(0.4) +  0.6*np.log2(0.6)) #It's equal to - 0.97

#Let's split and calculate the weighted dip
a1 = [0] ; a2 = [0, 0, 0, 1, 1, 1, 1, 1, 1]

#Without weight
a1 = 0
a2 = -(0.33*np.log2(0.66) +  0.66*np.log2(0.33)) #It's equal to - 1.25
Average = 1.25/2 #It's equal to - 0.625

熵看起来像一个很大的下降(0.97 --> 0.625),但数据看起来与父数据没有任何不同

#With weight
a1 = 0
a2 = -(0.33*np.log2(0.66) +  0.66*np.log2(0.33)) #It's equal to - 1.25
Weighted average = (9/10) * 1.25 #It's equal to - 1.125

它比父母的来得更多(0.97 --> 1.125)