从零构建一棵决策树
CART 算法的 Gini 分裂全流程
本页以"西瓜是否好瓜"分类任务为例,逐步演示 CART 决策树如何通过计算 Gini 不纯度与基尼增益,逐层选择最优分裂特征,最终生成一棵完整的分类决策树。每一步都附有可交互的计算工具。
Gini 不纯度基础
公式与含义
Gini 不纯度(Gini Impurity)是 CART 决策树用于衡量节点混乱程度的核心指标。其计算公式为:
其中 $p_i$ 表示第 $i$ 类样本在当前节点中所占的比例。
简单算例
10 个全是红球:$p_{\text{红}}=1$
完全纯净
$p_{\text{红}}=0.5,\ p_{\text{蓝}}=0.5$
混乱程度最大
$p_{\text{红}}=0.6,\ p_{\text{蓝}}=0.4$
较为混乱
交互式 Gini 计算器
输入各类别的样本数量,实时观察 Gini 不纯度的变化。
分裂准则:基尼增益
决策树每次分裂时,会尝试所有可用特征和分割点,计算分裂后的加权 Gini,然后与分裂前的 Gini 比较,差值称为"基尼增益":
加权 Gini 按子节点样本数量加权计算:
数据集与分类任务
任务定义
分类目标:根据西瓜的外观特征,判断该西瓜是否为"好瓜"(标签:是 / 否)。
用于判断的特征共 3 个:
训练数据集
训练集共包含 8 条样本:
| 编号 | 纹理 | 根蒂 | 敲声 | 是否好瓜 |
|---|---|---|---|---|
| 1 | 清晰 | 蜷缩 | 浊响 | 是 |
| 2 | 清晰 | 蜷缩 | 沉闷 | 是 |
| 3 | 清晰 | 硬挺 | 浊响 | 否 |
| 4 | 清晰 | 硬挺 | 沉闷 | 否 |
| 5 | 模糊 | 蜷缩 | 浊响 | 否 |
| 6 | 模糊 | 蜷缩 | 沉闷 | 否 |
| 7 | 模糊 | 硬挺 | 浊响 | 否 |
| 8 | 模糊 | 硬挺 | 沉闷 | 否 |
根节点 Gini 计算(分裂前)
在进行任何分裂之前,全部 8 条样本都在根节点中。我们先计算根节点的 Gini 不纯度,作为后续比较的基准。
第一层分裂:逐个特征计算基尼增益
决策树依次尝试"纹理""根蒂""敲声"三个特征,对每个特征都执行:分组统计 → 子节点 Gini 计算 → 加权 Gini 计算 → 基尼增益计算,最后选择增益最大的特征。
按【纹理】分裂
分组统计:
样本:1、2、3、4
好瓜 2 坏瓜 2
样本:5、6、7、8
好瓜 0 坏瓜 4
按【根蒂】分裂
分组统计:
样本:1、2、5、6
好瓜 2 坏瓜 2
样本:3、4、7、8
好瓜 0 坏瓜 4
按【敲声】分裂
分组统计:
样本:1、3、5、7
好瓜 1 坏瓜 3
样本:2、4、6、8
好瓜 1 坏瓜 3
第一层分裂结果对比与选择
分裂后各子节点状态
样本:5、6、7、8(全部坏瓜)
$\mathrm{Gini}=0$,节点纯净,停止分裂,预测"坏瓜"
样本:1、2、3、4(好瓜 2,坏瓜 2)
$\mathrm{Gini}=0.5$,节点仍然混乱,需要继续分裂
第二层分裂:纹理清晰子节点
当前节点状态
进入第二层的是"纹理 = 清晰"子节点,包含样本 1、2、3、4,共 4 条:
按【根蒂】分裂
样本:1、2 → 好瓜 2 坏瓜 0
Gini = 0(完全纯净)
样本:3、4 → 好瓜 0 坏瓜 2
Gini = 0(完全纯净)
按【敲声】分裂
样本:1、3 → 好瓜 1 坏瓜 1
Gini = 0.5
样本:2、4 → 好瓜 1 坏瓜 1
Gini = 0.5
第二层分裂结果选择
选择【根蒂】作为第二层分裂特征。分裂后:
样本 1、2,全部好瓜,Gini = 0
叶子节点,预测"好瓜"
样本 3、4,全部坏瓜,Gini = 0
叶子节点,预测"坏瓜"
最终决策树结构
经过两层分裂,最终得到的决策树结构如下:
根节点:纹理?
├── 纹理 = 模糊 ──→ 叶子节点:预测【坏瓜】(Gini=0,4条样本)
└── 纹理 = 清晰 ──→ 根蒂?
├── 根蒂 = 蜷缩 ──→ 叶子节点:预测【好瓜】(Gini=0,2条样本)
└── 根蒂 = 硬挺 ──→ 叶子节点:预测【坏瓜】(Gini=0,2条样本)
新样本预测过程
训练完成后,对新样本进行预测时,不需要再计算任何 Gini 值,只需将新样本的特征值沿决策树的判断规则逐层向下走,直到到达叶子节点,输出该叶子的预测类别即可。
交互式预测工具
选择一个新西瓜的特征值,点击"开始预测",观察决策树如何逐层判断。
预测示例 1
新来一个西瓜,特征为:纹理 = 清晰,根蒂 = 蜷缩,敲声 = 沉闷。
预测示例 2
新西瓜:纹理 = 模糊,根蒂 = 蜷缩,敲声 = 浊响。
关键要点总结
分裂规则
- 决策树每次分裂时,遍历所有可用特征,计算每个特征的基尼增益,永远选择增益最大的特征进行分裂。
- 基尼增益 = 分裂前 Gini − 分裂后加权 Gini,增益越大说明分裂越有效。
特征有效性
- 一个特征必须与标签存在统计关联,才会产生正的基尼增益。
- 如果特征与标签完全无关(如本例的敲声),分裂后子节点的类别比例与父节点相同,基尼增益为 0,决策树不会选用该特征。
- 决策树只学习数据中的统计关联,不判断因果关系。特征是否"有道理"不影响算法选择,只看数据分布。
加权 Gini 的重要性
- 比较分裂效果时,必须使用加权 Gini(按子节点样本数量加权),而不是单独看某个子节点的 Gini。
- 样本多的子节点对整体混乱度的贡献更大。
停止条件
- 节点样本全部属于同一类(Gini = 0,纯净),停止分裂。
- 节点样本数量过少(低于阈值),停止分裂。
- 树的深度达到预设上限,停止分裂(防止过拟合)。
- 所有可用特征的基尼增益均为 0,停止分裂。
训练与预测的区别
需要反复计算 Gini 和基尼增益,选择最优分裂特征,构建树结构。计算量大,是"学习"的过程。
不需要计算任何 Gini,只需将新样本沿树的判断规则走到叶子节点,输出叶子的类别即可。速度极快。