模式识别与机器学习课程笔记(9):决策树
概述
决策树是一种可解释性极强的监督学习模型,其核心思想是“分而治之”——通过模拟人类决策过程,将复杂的分类/回归问题拆解为一系列简单的二元或多元判断,最终输出结果。它的结构类似一棵倒置的树,无需依赖特征标准化,既能处理离散型数据,也能适配连续型数据,是工业界(如风控、推荐系统)中常用的基础模型之一。
1.1 决策树的基本结构
决策树由三类节点和边组成,各部分功能明确:
- 根节点:代表整个样本集,是决策树的起点,仅包含一条出边;
- 内部节点:对应“特征判断”(如“年龄是否>30岁”“收入是否≥50k”),每个内部节点有多个出边,每条边代表一个判断结果;
- 叶节点:代表最终的分类结果(分类树)或回归预测值(回归树),无出边;
- 边:连接父节点与子节点,标注父节点特征的判断条件(如“是”“否”“[0,20)”)。
例如,“是否购买某商品”的决策树可表示为:根节点(所有用户)→ 内部节点1(收入≥50k?)→ 内部节点2(年龄≤35?)→ 叶节点(购买/不购买)。
1.2 决策树的核心优势
相比SVM、神经网络等“黑箱模型”,决策树的优势极为突出:
- 可解释性强:决策过程完全透明,能清晰输出“为什么做出该判断”(如“因收入≥50k且年龄≤35,判定为购买用户”);
- 数据要求低:无需对特征做标准化/归一化,可直接处理离散型和连续型混合数据;
- 训练效率高:基于贪心策略构建,不依赖复杂矩阵运算,适合中小规模数据集;
- 泛化能力基础好:通过剪枝或集成(如随机森林)可有效降低过拟合风险。
1.3 决策树的核心问题
构建决策树的关键在于解决两个核心问题:
- 特征选择:每次分裂时,选择哪个特征能让“数据纯度提升最大”(如分类树用信息熵、Gini系数,回归树用平方误差);
- 剪枝:避免决策树过度复杂(如深度过深)导致过拟合,分为“预剪枝”(提前停止分裂)和“后剪枝”(先构建完整树再删除冗余分支)。
一、ID3和C4.5算法
ID3(Iterative Dichotomiser 3)是最早的决策树算法之一,核心用信息增益选择特征;C4.5是ID3的改进版,通过信息增益比解决ID3偏向多值特征的问题,同时支持连续值、缺失值处理和剪枝,是更实用的分类决策树算法。
1.1 ID3算法:基于信息增益的特征选择
ID3仅适用于离散型特征的分类任务,其核心逻辑是“每次分裂时,选择信息增益最大的特征”——信息增益越大,分裂后数据的不确定性(熵)降低越多,数据纯度越高。
1.1.1 关键概念:信息熵与信息增益
要理解信息增益,需先掌握“信息熵”和“条件熵”:
-
信息熵(Entropy):衡量数据的不确定性,熵越大,数据越混乱(纯度越低)。对样本集 D D D,若类别数为 K K K,第 k k k类样本占比为 p k = ∣ D k ∣ ∣ D ∣ p_k = \frac{|D_k|}{|D|} pk=∣D∣∣Dk∣,则信息熵为:
H ( D ) = − ∑ k = 1 K p k log 2 p k H(D) = -\sum_{k=1}^K p_k \log_2 p_k H(D)=−k=1∑Kpklog2pk
特殊情况:若所有样本属于同一类( p 1 = 1 p_1=1 p1=1),则 H ( D ) = 0 H(D)=0 H(D)=0(完全确定);若两类样本各占50%( p 1 = p 2 = 0.5 p_1=p_2=0.5 p1=p2=0.5),则 H ( D ) = 1 H(D)=1 H(D)=1(最不确定)。 -
条件熵(Conditional Entropy):已知某特征 A A A的取值后,样本集 D D D的不确定性。若特征 A A A有 V V V个取值 { a 1 , a 2 , . . . , a V } \{a_1,a_2,...,a_V\} {a1,a2,...,aV}, D v D_v Dv是 D D D中特征 A A A取 a v a_v av的样本子集,则条件熵为:
H ( D ∣ A ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ H ( D v ) H(D|A) = \sum_{v=1}^V \frac{|D_v|}{|D|} H(D_v) H(D∣A)=v=1∑V∣D∣∣Dv∣H(Dv) -
信息增益(Information Gain):特征 A A A分裂后,信息熵的减少量,即“不确定性降低的程度”:
G ( D , A ) = H ( D ) − H ( D ∣ A ) G(D,A) = H(D) - H(D|A) G(D,A)=H(D)−H(D∣A)
信息增益 G ( D , A ) G(D,A) G(D,A)越大,说明特征 A A A对降低数据不确定性的贡献越大,越适合作为当前分裂特征。
1.1.2 ID3算法步骤(实例辅助)
以“天气与是否打球”的数据集(表1)为例,说明ID3的分裂过程:
| 样本序号 | 天气(A1) | 温度(A2) | 是否打球(类别) |
|---|---|---|---|
| 1 | 晴 | 高 | 否 |
| 2 | 晴 | 高 | 否 |
| 3 | 阴 | 高 | 是 |
| 4 | 雨 | 中 | 是 |
| 5 | 雨 | 低 | 是 |
| 6 | 雨 | 低 | 否 |
| 7 | 阴 | 低 | 是 |
步骤1:计算根节点的信息熵
H
(
D
)
H(D)
H(D)
样本集
D
D
D共7个样本,“是”(5个)占比
p
1
=
5
/
7
p_1=5/7
p1=5/7,“否”(2个)占比
p
2
=
2
/
7
p_2=2/7
p2=2/7:
H
(
D
)
=
−
5
7
log
2
5
7
−
2
7
log
2
2
7
≈
0.863
H(D) = -\frac{5}{7}\log_2\frac{5}{7} - \frac{2}{7}\log_2\frac{2}{7} \approx 0.863
H(D)=−75log275−72log272≈0.863
步骤2:计算各特征的信息增益
-
特征A1(天气):取值为“晴”(2个样本,均为“否”)、“阴”(2个样本,均为“是”)、“雨”(3个样本,2个“是”1个“否”):
H ( D ∣ A 1 ) = 2 7 H ( D 晴 ) + 2 7 H ( D 阴 ) + 3 7 H ( D 雨 ) H(D|A1) = \frac{2}{7}H(D_{晴}) + \frac{2}{7}H(D_{阴}) + \frac{3}{7}H(D_{雨}) H(D∣A1)=72H(D晴)+72H(D阴)+73H(D雨)
其中 H ( D 晴 ) = 0 H(D_{晴})=0 H(D晴)=0(全“否”), H ( D 阴 ) = 0 H(D_{阴})=0 H(D阴)=0(全“是”), H ( D 雨 ) = − 2 3 log 2 2 3 − 1 3 log 2 1 3 ≈ 0.918 H(D_{雨})=-\frac{2}{3}\log_2\frac{2}{3} - \frac{1}{3}\log_2\frac{1}{3} \approx 0.918 H(D雨)=−32log232−31log231≈0.918,代入得:
H ( D ∣ A 1 ) ≈ 2 7 × 0 + 2 7 × 0 + 3 7 × 0.918 ≈ 0.394 H(D|A1) \approx \frac{2}{7} \times 0 + \frac{2}{7} \times 0 + \frac{3}{7} \times 0.918 \approx 0.394 H(D∣A1)≈72×0+72×0+73×0.918≈0.394
信息增益 G ( D , A 1 ) = 0.863 − 0.394 = 0.469 G(D,A1) = 0.863 - 0.394 = 0.469 G(D,A1)=0.863−0.394=0.469。 -
同理计算特征A2(温度)的信息增益,最终会发现 G ( D , A 1 ) > G ( D , A 2 ) G(D,A1) > G(D,A2) G(D,A1)>G(D,A2),因此选择“天气”作为根节点的分裂特征。
步骤3:递归分裂子节点
对“天气=晴”“天气=阴”“天气=雨”三个子节点,重复步骤1-2:
- “天气=晴”和“天气=阴”的子节点已纯(全“否”或全“是”),成为叶节点;
- “天气=雨”的子节点仍有混合类别,继续选择下一个信息增益最大的特征(如“温度”)分裂,直到所有子节点纯或无特征可分。
步骤4:停止分裂
当满足以下任一条件时停止分裂:
- 当前节点的所有样本属于同一类别(纯度为1);
- 无剩余特征可用于分裂;
- 当前节点样本数过少(避免过拟合)。
1.1.3 ID3的局限性
ID3的缺陷明显,限制了其适用场景:
- 偏向多值特征:若存在“样本ID”这类多值特征(每个取值对应1个样本),其信息增益会最大(分裂后每个子节点均纯),但无实际意义;
- 不支持连续型特征:需手动将连续特征离散化(如将“年龄”分为“<20”“20-30”“>30”),过程繁琐且易丢失信息;
- 不支持缺失值:若样本某特征值缺失,需丢弃该样本或填充默认值,影响数据利用率;
- 易过拟合:不支持剪枝,构建的树易过深,对训练集以外的数据泛化能力差。
1.2 C4.5算法:ID3的改进与优化
C4.5针对ID3的局限性做了四大核心改进,使其成为更通用的分类决策树算法。
1.2.1 核心改进:用信息增益比替代信息增益
为解决“偏向多值特征”的问题,C4.5引入信息增益比(Gain Ratio),通过“特征固有值”惩罚多值特征:
- 特征固有值(Intrinsic Value):衡量特征取值的分散程度,取值越多,固有值越大:
I V ( A ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log 2 ∣ D v ∣ ∣ D ∣ IV(A) = -\sum_{v=1}^V \frac{|D_v|}{|D|} \log_2 \frac{|D_v|}{|D|} IV(A)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣ - 信息增益比:信息增益与特征固有值的比值:
G R ( D , A ) = G ( D , A ) I V ( A ) GR(D,A) = \frac{G(D,A)}{IV(A)} GR(D,A)=IV(A)G(D,A)
逻辑:多值特征的 I V ( A ) IV(A) IV(A)大,即使 G ( D , A ) G(D,A) G(D,A)大, G R ( D , A ) GR(D,A) GR(D,A)也可能较小,从而避免优先选择无意义的多值特征。
1.2.2 其他关键改进
-
支持连续型特征:
对连续特征 A A A,先将其取值排序,选择所有相邻值的中点作为候选分裂点(如“年龄”排序后候选点为“25.5”“30.5”等),计算每个候选点的信息增益比,选择最优分裂点(分裂后样本分为“≤分裂点”和“>分裂点”两类)。 -
支持缺失值处理:
- 计算特征增益比时,用“无缺失值样本的占比”加权(如某样本特征 A A A缺失,不参与 A A A的增益比计算,但参与其他特征的计算);
- 分配缺失值样本时,按子节点样本占比将其“分配到所有子节点”(如“天气=雨”的子节点占3/7,缺失天气的样本有70%分配到该子节点)。
-
支持剪枝:
C4.5采用后剪枝(Pruning After Construction):- 先构建完整的决策树;
- 从叶节点向上,对每个内部节点,计算“剪枝后子树的误差”与“不剪枝的误差”;
- 若剪枝后误差更小或相等(泛化能力更强),则剪枝该节点(将其变为叶节点)。
1.2.3 C4.5的局限性
C4.5虽解决了ID3的核心问题,但仍有不足:
- 仅适用于分类任务:无法处理回归问题(如预测房价、销量);
- 计算复杂度高:信息增益比、连续值分裂点选择均需大量计算,不适合大规模数据集;
- 生成多叉树:内部节点可对应多个特征取值(如“天气=晴/阴/雨”),后续集成学习(如随机森林)需二叉树结构时需额外调整。
二、分类与回归树(CART)
CART(Classification and Regression Tree)是一种既能分类也能回归的二叉决策树,通过“二分分裂”(每个内部节点仅分为两个子节点)简化结构,分类用Gini系数选择特征,回归用平方误差选择特征,同时支持剪枝,是目前工业界应用最广的决策树算法之一。
2.1 CART的核心特点
与ID3/C4.5相比,CART的核心差异的在于:
- 结构:二叉树:无论特征是离散型还是连续型,每个内部节点均分裂为两个子节点(如“天气=晴”和“天气≠晴”,“年龄≤30”和“年龄>30”);
- 任务:分类+回归:分类树用Gini系数衡量纯度,回归树用平方误差衡量拟合程度;
- 剪枝:成本复杂度剪枝:通过“成本复杂度”平衡树的复杂度与误差,比C4.5的后剪枝更高效。
2.2 分类树CART:基于Gini系数的特征选择
分类树CART的目标是“选择Gini系数最小的特征分裂”——Gini系数衡量数据的“不纯度”,值越小,数据纯度越高(类比信息熵,计算更简单,无需对数运算)。
2.2.1 Gini系数的定义
对样本集
D
D
D(类别数
K
K
K),第
k
k
k类样本占比
p
k
p_k
pk,则Gini系数为:
Gini
(
D
)
=
1
−
∑
k
=
1
K
p
k
2
\text{Gini}(D) = 1 - \sum_{k=1}^K p_k^2
Gini(D)=1−k=1∑Kpk2
- 特殊情况:若所有样本属于同一类( p 1 = 1 p_1=1 p1=1),则 Gini ( D ) = 0 \text{Gini}(D)=0 Gini(D)=0(完全纯);若两类样本各占50%( p 1 = p 2 = 0.5 p_1=p_2=0.5 p1=p2=0.5),则 Gini ( D ) = 0.5 \text{Gini}(D)=0.5 Gini(D)=0.5(最不纯)。
对特征
A
A
A(分裂后分为
D
1
D_1
D1和
D
2
D_2
D2两个子节点),则分裂后的Gini系数(加权平均)为:
Gini
(
D
,
A
)
=
∣
D
1
∣
∣
D
∣
Gini
(
D
1
)
+
∣
D
2
∣
∣
D
∣
Gini
(
D
2
)
\text{Gini}(D,A) = \frac{|D_1|}{|D|}\text{Gini}(D_1) + \frac{|D_2|}{|D|}\text{Gini}(D_2)
Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
CART分类树选择“分裂后Gini系数最小”的特征与分裂点。
2.2.2 分类树分裂实例
仍用“天气与是否打球”数据集,计算“天气”特征的Gini系数:
- 分裂为“天气=晴”(
D
1
D_1
D1:2个“否”)和“天气≠晴”(
D
2
D_2
D2:2个“是”+3个样本(1“是”1“否”)):
Gini ( D 1 ) = 1 − ( 1 2 + 0 2 ) = 0 \text{Gini}(D_1) = 1 - (1^2 + 0^2) = 0 Gini(D1)=1−(12+02)=0
Gini ( D 2 ) = 1 − ( 3 5 ) 2 − ( 2 5 ) 2 = 1 − 0.36 − 0.16 = 0.48 \text{Gini}(D_2) = 1 - (\frac{3}{5})^2 - (\frac{2}{5})^2 = 1 - 0.36 - 0.16 = 0.48 Gini(D2)=1−(53)2−(52)2=1−0.36−0.16=0.48
Gini ( D , 天气 ) = 2 7 × 0 + 5 7 × 0.48 ≈ 0.343 \text{Gini}(D,天气) = \frac{2}{7} \times 0 + \frac{5}{7} \times 0.48 \approx 0.343 Gini(D,天气)=72×0+75×0.48≈0.343 - 对比其他特征(如“温度”)的Gini系数,选择最小的特征分裂。
2.3 回归树CART:基于平方误差的特征选择
回归树CART的目标是“选择平方误差最小的特征分裂”——平方误差衡量子节点样本的“拟合程度”,值越小,子节点样本的预测值越接近真实值。
2.3.1 平方误差的定义
对样本集 D D D(每个样本的真实值为 y i y_i yi),回归树的叶节点预测值为“子节点样本的均值”(如 D 1 D_1 D1的预测值 y ^ 1 = 1 ∣ D 1 ∣ ∑ i ∈ D 1 y i \hat{y}_1 = \frac{1}{|D_1|}\sum_{i \in D_1} y_i y^1=∣D1∣1∑i∈D1yi)。
样本集
D
D
D的平方误差(SSE)为:
SSE
(
D
)
=
∑
i
∈
D
(
y
i
−
y
^
)
2
\text{SSE}(D) = \sum_{i \in D} (y_i - \hat{y})^2
SSE(D)=i∈D∑(yi−y^)2
其中
y
^
\hat{y}
y^是
D
D
D的预测值(
D
D
D的样本均值)。
对特征
A
A
A(分裂后分为
D
1
D_1
D1和
D
2
D_2
D2),分裂后的平方误差为:
SSE
(
D
,
A
)
=
SSE
(
D
1
)
+
SSE
(
D
2
)
\text{SSE}(D,A) = \text{SSE}(D_1) + \text{SSE}(D_2)
SSE(D,A)=SSE(D1)+SSE(D2)
CART回归树选择“分裂后SSE最小”的特征与分裂点。
2.3.2 回归树分裂实例
以“房屋面积与房价”数据集(表2)为例,说明回归树的分裂:
| 样本序号 | 面积(㎡) | 房价(万元) |
|---|---|---|
| 1 | 50 | 80 |
| 2 | 70 | 120 |
| 3 | 90 | 150 |
| 4 | 110 | 200 |
| 5 | 130 | 250 |
步骤1:计算根节点的SSE
根节点预测值
y
^
=
80
+
120
+
150
+
200
+
250
5
=
160
\hat{y} = \frac{80+120+150+200+250}{5} = 160
y^=580+120+150+200+250=160,SSE为:
SSE
(
D
)
=
(
80
−
160
)
2
+
(
120
−
160
)
2
+
(
150
−
160
)
2
+
(
200
−
160
)
2
+
(
250
−
160
)
2
=
18600
\text{SSE}(D) = (80-160)^2 + (120-160)^2 + (150-160)^2 + (200-160)^2 + (250-160)^2 = 18600
SSE(D)=(80−160)2+(120−160)2+(150−160)2+(200−160)2+(250−160)2=18600
步骤2:选择“面积”的分裂点
候选分裂点为“60、80、100、120”(相邻面积的中点),以分裂点“100”为例(分为
D
1
D_1
D1:面积≤100,
D
2
D_2
D2:面积>100):
- D 1 D_1 D1预测值 y ^ 1 = 80 + 120 + 150 3 = 116.67 \hat{y}_1 = \frac{80+120+150}{3} = 116.67 y^1=380+120+150=116.67, SSE ( D 1 ) = ( 80 − 116.67 ) 2 + ( 120 − 116.67 ) 2 + ( 150 − 116.67 ) 2 ≈ 2566.67 \text{SSE}(D_1) = (80-116.67)^2 + (120-116.67)^2 + (150-116.67)^2 \approx 2566.67 SSE(D1)=(80−116.67)2+(120−116.67)2+(150−116.67)2≈2566.67;
- D 2 D_2 D2预测值 y ^ 2 = 200 + 250 2 = 225 \hat{y}_2 = \frac{200+250}{2} = 225 y^2=2200+250=225, SSE ( D 2 ) = ( 200 − 225 ) 2 + ( 250 − 225 ) 2 = 1250 \text{SSE}(D_2) = (200-225)^2 + (250-225)^2 = 1250 SSE(D2)=(200−225)2+(250−225)2=1250;
- 分裂后SSE = 2566.67 + 1250 = 3816.67,远小于根节点的18600,因此“100”是优质分裂点。
2.4 CART的剪枝:成本复杂度剪枝
CART采用成本复杂度剪枝(Cost-Complexity Pruning),核心是在“树的误差”与“树的复杂度”之间找平衡,定义“成本复杂度函数”:
C
α
(
T
)
=
C
(
T
)
+
α
⋅
∣
T
∣
C_\alpha(T) = C(T) + \alpha \cdot |T|
Cα(T)=C(T)+α⋅∣T∣
- C ( T ) C(T) C(T):树 T T T的训练误差(分类树用错分率,回归树用SSE);
- ∣ T ∣ |T| ∣T∣:树 T T T的叶节点数(衡量复杂度,叶节点越多,树越复杂);
- α ≥ 0 \alpha \geq 0 α≥0:复杂度参数( α \alpha α越大,对复杂度的惩罚越重,树越简单)。
剪枝步骤:
- 构建完整的CART树 T 0 T_0 T0;
- 对 T 0 T_0 T0的每个内部节点,计算“剪枝后子树 T ′ T' T′的 C α ( T ′ ) C_\alpha(T') Cα(T′)”与“原子树 T T T的 C α ( T ) C_\alpha(T) Cα(T)”;
- 选择“ C α ( T ′ ) C_\alpha(T') Cα(T′)最小且小于 C α ( T ) C_\alpha(T) Cα(T)”的节点剪枝,得到树 T 1 T_1 T1;
- 重复步骤2-3,生成一系列剪枝树 T 0 , T 1 , . . . , T k T_0, T_1, ..., T_k T0,T1,...,Tk( T k T_k Tk为根节点);
- 用验证集选择“泛化误差最小”的树作为最终模型。
三、随机森林
随机森林(Random Forest)是基于CART的集成学习模型,属于“Bagging( Bootstrap Aggregating)”方法,核心是“通过多棵决策树的投票/平均降低方差,提升泛化能力”。它继承了决策树的可解释性,同时解决了单棵决策树易过拟合的问题,是工业界常用的“基线模型”之一。
3.1 随机森林的核心思想
随机森林的“随机性”体现在两个层面,正是这种随机性保证了多棵树的“多样性”,从而降低过拟合:
- 样本随机(Bootstrap采样):对原始样本集 D D D( N N N个样本),每棵树用“有放回抽样”(Bootstrap)抽取 N N N个样本,得到 N N N个Bootstrap样本集 D 1 , D 2 , . . . , D M D_1, D_2, ..., D_M D1,D2,...,DM( M M M为树的数量);
- 特征随机(随机选择特征子集):每棵树分裂时,从所有 d d d个特征中随机选择 k k k个特征(通常 k = d k = \sqrt{d} k=d),仅从这 k k k个特征中选择最优分裂特征。
最终预测规则:
- 分类任务:所有树的预测结果投票,得票最多的类别为最终结果;
- 回归任务:所有树的预测值取平均,作为最终结果。
3.2 随机森林的构建步骤
以分类任务为例,随机森林的详细构建步骤:
- 样本采样:对原始样本集 D D D( N N N个样本),执行 M M M次Bootstrap采样,得到 M M M个样本集 D 1 , D 2 , . . . , D M D_1, D_2, ..., D_M D1,D2,...,DM(每个 D i D_i Di含 N N N个样本,约36.8%的样本未被采样,称为“OOB样本”);
- 构建单棵CART树:对每个
D
i
D_i
Di,构建一棵未剪枝的CART分类树:
- 分裂时,随机选择 k = d k = \sqrt{d} k=d个特征( d d d为总特征数);
- 用Gini系数选择最优分裂特征与分裂点,不剪枝(单棵树过拟合,但多棵树投票可抵消);
- 生成森林:重复步骤2,生成 M M M棵CART树,组成随机森林;
- 预测:对新样本 x x x,每棵树输出预测类别,最终结果为“多数投票”的类别。
3.3 随机森林的关键概念:OOB误差
由于Bootstrap采样是“有放回”的,每棵树都有约36.8%的样本未被采样(OOB样本,Out-of-Bag)。这些OOB样本可作为“天然的验证集”,用于评估随机森林的泛化误差(OOB误差):
- 对每个OOB样本 x i x_i xi,收集“未采样 x i x_i xi的所有树”对 x i x_i xi的预测结果;
- 用这些预测结果计算 x i x_i xi的预测误差(分类用错分率,回归用SSE);
- 所有OOB样本的平均误差即为OOB误差,无需额外划分验证集。
3.4 随机森林的优势与参数选择
3.4.1 核心优势
- 泛化能力强:多棵树的多样性降低了单棵树的方差,过拟合风险低;
- 鲁棒性强:对异常值、缺失值不敏感(Bootstrap采样和特征随机可稀释异常值影响);
- 处理高维数据高效:特征随机选择避免了“维度灾难”,无需特征降维;
- 可解释性较好:可计算“特征重要性”(如某特征在所有树中降低Gini系数的总和),解释特征对预测的贡献。
3.4.2 关键参数选择
随机森林的性能主要依赖三个参数,实际应用中可通过网格搜索调优:
- M M M(树的数量): M M M越大,泛化能力越强,但计算成本越高,通常取100-1000( M M M超过一定值后,性能趋于稳定);
- k k k(每棵树的特征数):通常取 k = d k = \sqrt{d} k=d(分类任务)或 k = d / 3 k = d/3 k=d/3(回归任务);
- 单棵树的参数:如最大深度、最小样本分裂数(避免树过深,进一步降低过拟合)。
四、提升法(Boosting)组合学习
提升法(Boosting)是另一类重要的集成学习方法,与Bagging的“并行构建多棵树”不同,Boosting的核心是“串行构建多棵弱学习器(如决策树),通过权重调整让后续学习器聚焦于前序学习器的错误样本”,最终通过加权投票/平均提升整体性能。
常用的Boosting算法有AdaBoost(适用于分类)、GBDT(Gradient Boosting Decision Tree,适用于分类与回归),以及基于GBDT改进的XGBoost、LightGBM等。
4.1 Boosting的核心思想
Boosting的本质是“将多个弱学习器(泛化能力略优于随机猜测的学习器,如深度为1的决策树——决策桩)集成为强学习器”,核心逻辑包括:
- 权重调整:
- 样本权重:每次迭代后,增加前序学习器错分样本的权重,减少正确样本的权重,让后续学习器更关注错分样本;
- 学习器权重:泛化能力强的学习器(错分率低)赋予更高权重,泛化能力弱的学习器赋予更低权重;
- 串行构建:每棵学习器依赖前一棵学习器的结果,无法并行(区别于随机森林的并行);
- 加权集成:最终预测结果是所有学习器的加权投票(分类)或加权平均(回归)。
4.2 AdaBoost算法:基于指数损失的Boosting
AdaBoost(Adaptive Boosting)是最早的Boosting算法,适用于分类任务,核心用“指数损失函数”调整样本权重和学习器权重,弱学习器通常为决策桩(深度为1的CART树)。
4.2.1 AdaBoost的迭代步骤
设原始样本集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } D = \{(x_1,y_1), (x_2,y_2), ..., (x_N,y_N)\} D={(x1,y1),(x2,y2),...,(xN,yN)}( y i ∈ { + 1 , − 1 } y_i \in \{+1,-1\} yi∈{+1,−1}),弱学习器数量为 M M M,步骤如下:
步骤1:初始化样本权重
所有样本的初始权重相等:
w
1
,
i
=
1
N
(
i
=
1
,
2
,
.
.
.
,
N
)
w_{1,i} = \frac{1}{N} \quad (i=1,2,...,N)
w1,i=N1(i=1,2,...,N)
其中
w
m
,
i
w_{m,i}
wm,i表示第
m
m
m次迭代时第
i
i
i个样本的权重。
步骤2:迭代构建弱学习器( m = 1 m=1 m=1到 M M M)
- 基于权重 w m , i w_{m,i} wm,i的样本集,训练弱学习器 h m ( x ) h_m(x) hm(x)(决策桩);
- 计算
h
m
(
x
)
h_m(x)
hm(x)的加权错分率:
ϵ m = ∑ i = 1 N w m , i ⋅ I ( h m ( x i ) ≠ y i ) \epsilon_m = \sum_{i=1}^N w_{m,i} \cdot I(h_m(x_i) \neq y_i) ϵm=i=1∑Nwm,i⋅I(hm(xi)=yi)
其中 I ( ⋅ ) I(\cdot) I(⋅)是指示函数(条件成立为1,否则为0); - 计算
h
m
(
x
)
h_m(x)
hm(x)的权重(错分率越低,权重越高):
α m = 1 2 ln ( 1 − ϵ m ϵ m ) \alpha_m = \frac{1}{2} \ln \left( \frac{1 - \epsilon_m}{\epsilon_m} \right) αm=21ln(ϵm1−ϵm)
若 ϵ m > 0.5 \epsilon_m > 0.5 ϵm>0.5,则 α m < 0 \alpha_m < 0 αm<0,说明该学习器性能差,可丢弃; - 更新样本权重(错分样本权重增加,正确样本权重减少):
w m + 1 , i = w m , i ⋅ exp ( − α m y i h m ( x i ) ) Z m w_{m+1,i} = \frac{w_{m,i} \cdot \exp(-\alpha_m y_i h_m(x_i))}{Z_m} wm+1,i=Zmwm,i⋅exp(−αmyihm(xi))
其中 Z m = ∑ i = 1 N w m , i ⋅ exp ( − α m y i h m ( x i ) ) Z_m = \sum_{i=1}^N w_{m,i} \cdot \exp(-\alpha_m y_i h_m(x_i)) Zm=∑i=1Nwm,i⋅exp(−αmyihm(xi))是归一化因子,确保 w m + 1 , i w_{m+1,i} wm+1,i之和为1。
步骤3:集成弱学习器
最终分类器为所有弱学习器的加权投票:
H
(
x
)
=
sign
(
∑
m
=
1
M
α
m
h
m
(
x
)
)
H(x) = \text{sign} \left( \sum_{m=1}^M \alpha_m h_m(x) \right)
H(x)=sign(m=1∑Mαmhm(x))
其中
sign
(
⋅
)
\text{sign}(\cdot)
sign(⋅)是符号函数(输入为正输出+1,负输出-1)。
4.2.2 AdaBoost的特点
- 优点:实现简单,无需手动调参(仅需指定弱学习器数量 M M M),对噪声不敏感;
- 缺点:仅适用于分类任务,对异常值敏感(异常值易被多次调整权重,影响后续学习器)。
4.3 GBDT算法:基于梯度下降的Boosting
GBDT(Gradient Boosting Decision Tree)是Boosting的进阶算法,适用于分类与回归任务,核心是“用梯度下降的思想,让每棵决策树拟合前序模型的‘残差’(或梯度)”,弱学习器为CART回归树(即使是分类任务,也用回归树拟合梯度)。
4.3.1 GBDT的核心思想
GBDT将“模型的损失函数”作为优化目标,每次迭代时,用一棵CART回归树拟合“当前模型损失函数的负梯度”(可理解为“残差的近似”),逐步降低损失函数值。
以回归任务(损失函数为平方误差)为例,GBDT的核心逻辑:
- 初始模型 F 0 ( x ) F_0(x) F0(x):用所有样本的均值作为预测值( F 0 ( x ) = 1 N ∑ i = 1 N y i F_0(x) = \frac{1}{N}\sum_{i=1}^N y_i F0(x)=N1∑i=1Nyi);
- 第
m
m
m次迭代:
- 计算残差 r m , i = y i − F m − 1 ( x i ) r_{m,i} = y_i - F_{m-1}(x_i) rm,i=yi−Fm−1(xi)(平方误差的负梯度即为残差);
- 用CART回归树拟合残差 r m , i r_{m,i} rm,i,得到弱学习器 h m ( x ) h_m(x) hm(x);
- 计算步长 γ m \gamma_m γm(学习率,控制 h m ( x ) h_m(x) hm(x)的贡献,通常取0.1-0.3);
- 更新模型 F m ( x ) = F m − 1 ( x ) + γ m h m ( x ) F_m(x) = F_{m-1}(x) + \gamma_m h_m(x) Fm(x)=Fm−1(x)+γmhm(x);
- 最终模型 F M ( x ) = F 0 ( x ) + ∑ m = 1 M γ m h m ( x ) F_M(x) = F_0(x) + \sum_{m=1}^M \gamma_m h_m(x) FM(x)=F0(x)+∑m=1Mγmhm(x)。
4.3.2 GBDT的扩展:分类任务与损失函数
GBDT处理分类任务时,需将“类别标签转换为概率”,并选择适合分类的损失函数:
- 二分类:用“对数损失函数”,负梯度为 r m , i = y i − P ( y i = 1 ∣ x i ) r_{m,i} = y_i - P(y_i=1|x_i) rm,i=yi−P(yi=1∣xi)(真实标签与预测概率的差);
- 多分类:用“交叉熵损失函数”,为每个类别构建一棵决策树,最终预测概率为各类别概率的归一化。
此外,GBDT可通过更换损失函数提升鲁棒性:
- Huber损失:对异常值的惩罚小于平方误差,适合含异常值的回归任务;
- 绝对损失:对异常值更鲁棒,但导数不连续,需特殊处理。
4.3.3 GBDT的优缺点
- 优点:泛化能力强(比随机森林更适合复杂数据),可处理分类与回归任务,对特征尺度不敏感;
- 缺点:训练速度慢(串行构建),对异常值敏感(残差易受异常值影响),参数调优复杂(需调学习率、树深度、树数量等)。
4.4 Boosting的改进:XGBoost与LightGBM
GBDT的核心问题是“训练速度慢”,工业界常用XGBoost(eXtreme Gradient Boosting)和LightGBM(Light Gradient Boosting Machine)解决这一问题:
- XGBoost:通过“预排序特征”“并行计算分裂点”“正则化项(L1/L2)”提升速度与泛化能力;
- LightGBM:通过“直方图优化”(将连续特征离散为直方图)“梯度-based单边采样”进一步降低计算复杂度,训练速度比XGBoost快10-100倍。
总结
本文围绕决策树展开,从单棵决策树到集成模型,形成完整的技术链条:
- 单棵决策树:ID3(信息增益,离散分类)→ C4.5(信息增益比,支持连续/缺失值)→ CART(Gini/平方误差,二叉分类/回归树),核心是“特征选择”与“剪枝”;
- 集成模型:
- 随机森林(Bagging):通过样本+特征随机,多棵CART树投票,降低方差,适合作为基线;
- Boosting(AdaBoost/GBDT):通过串行权重调整,聚焦错分样本,提升泛化能力,适合复杂数据;
- 核心差异:单棵树易过拟合,集成模型通过“多样性”(随机森林)或“纠错”(Boosting)解决这一问题。
决策树及其集成模型的关键是“因地制宜”:若需可解释性和快速迭代,选单棵CART;若需平衡性能与速度,选随机森林;若需更高精度(如竞赛、复杂业务场景),选XGBoost/LightGBM。
1086

被折叠的 条评论
为什么被折叠?



