带有基尼杂质的决策树如何计算根节点?

数据挖掘 机器学习 Python scikit-学习 决策树
2022-02-25 20:38:09

我不知道它是如何选择根节点的<=7.5,它的基尼杂质是0.45,但我试图手动计算它,但我得到的加权基尼杂质是0.27

谁能解释一下这里的计算是如何为根节点完成的?

这是我生成的一个小数据集,

import pandas as pd
import numpy as np

a = [5, 6, 7, 8, 9]
a1 = [1, 0, 1, 0, 0]
df = pd.DataFrame(np.c_[a, a1], columns=['val','target'])

   val  target
0    5       1
1    6       0
2    7       1
3    8       0
4    9       0

这是我的代码,

from sklearn.tree import DecisionTreeClassifier    
from IPython.display import Image
import pydot

dt = DecisionTreeClassifier()
dt.fit(df.val.to_frame(), df.target.to_frame())

data_dot = export_graphviz(dt, out_file=None, class_names=['0', '1'])
graph= pydot.graph_from_dot_data(data_dot)
Image(graph[0].create_png())

在此处输入图像描述

2个回答

来自 ISLR:

...我们考虑所有预测因素X1, . . . ,Xp,以及每个预测变量的切点 s 的所有可能值,然后选择预测变量和切点,以使生成的树具有最低的 RSS ...

由于这是一个分类问题,因此通过最大化 Gini Gain 来选择最佳拆分,该 Gini Gain 是通过从原始 Gini 杂质中减去分支的加权杂质来计算的。

对于 c 个总类,具有选择具有类的数据点的概率,i 是 p(i),则基尼杂质计算如下:

G=i=1c[p(i)(1p(i))]

1. 基尼杂质

这里, c = 2 , P(0) = 3/5 和 P(1) = 2/5

G = [P(0) * (1 - P(0))] + [P(1) * (1 - P(1))]

G = [3/5 * (1 - 3/5)] + [2/5 * (1 - 2/5)] = 12/25

G = 0.48

2. 基尼增益

现在,让我们通过加权每个分支的杂质来确定每个拆分的质量。这个值 - Gini Gain 用于在决策树中挑选最佳分割。
通俗地说,Gini Gain = original Gini impurity - weighted Gini impurities因此,基尼增益越高,分裂越好。

拆分为 6.5:

Gini Impurity G_left  = [1/2 * (1 - 1/2)] + [1/2 * (1 - 1/2)] = 0.50
Gini Impurity G_right = [2/3 * (1 - 2/3)] + [1/3 * (1 - 1/3)] = 0.44
Weighted Gini  = (1/5 * .50) + (4/5 * 0.44) = 0.45
Gini Gain = 0.48 - 0.45 = 0.03

拆分为 7.5:

Gini Impurity G_left  = [2/3 * (1 - 2/3)] + [1/3 * (1 - 1/3)] = 0.444
Gini Impurity G_right = [2/2 * (1 - 2/2)] = 0
Weighted Gini  = (3/5 * 0.444) + (2/5 * 0) = 0.27
Gini Gain = 0.48 - 0.27 = 0.21

拆分为 8.5:

Gini Impurity G_left  = [2/4 * (1 - 2/4)] + [2/4 * (1 - 2/4)] = 0.500
Gini Impurity G_right$ = [1/1 * (1 - 1/1)] = 0
Weighted Gini  = (4/5 * 0.5) + (1/5 * 0) = 0.40
Gini Gain = 0.48 - 0.40 = 0.08

因此,将选择最佳拆分 7.5,因为它具有最高的基尼增益。

为每个节点计算的基尼系数是为分配给该节点的所有观测值计算的基尼系数。因此,在根节点中,您有 2 个 1 和 3 个 0,如预期的那样导致 0.49。要选择最佳分割,您需要计算实例左右节点的基尼系数,然后选择这些系数总和最小的那个