树模型与集成学习(决策树核心算法:ID3/C4.5/CART、随机森林、GBDT/XGBoost)
树模型与集成学习
一、决策树
决策树核心算法:ID3/C4.5/CART
ID3算法(基于信息增益)
核心原理
ID3(Iterative Dichotomiser 3)是最早的决策树算法之一,由Ross Quinlan于1975年提出。其核心思想是通过信息增益选择最优划分特征,构建多叉树结构,递归分割数据直至纯度达标1,3。
-
信息熵:
衡量数据集的混乱程度,公式为:
H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ log 2 ∣ C k ∣ ∣ D ∣ H(D) = -\sum_{k=1}^{K} \frac{|C_k|}{|D|} \log_2 \frac{|C_k|}{|D|} H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣
其中 C k C_k Ck 为第k类样本集合, K K K 为类别数。 -
信息增益:
特征A的信息增益就是特征a划分后各子集信息熵的加权平均,定义为:
g ( D , A ) = H ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ H ( D v ) g(D,A) = H(D) - \sum_{v=1}^V \frac{|D_v|}{|D|} H(D_v) g(D,A)=H(D)−v=1∑V∣D∣∣Dv∣H(Dv)
其中 D v D_v Dv 是特征A取第v个值的子集,选择信息增益最大的特征作为节点1,2。
算法步骤
- 计算数据集的总信息熵 H ( D ) H(D) H(D)。
- 对每个特征计算信息增益,选择增益最大的特征作为划分节点。
- 递归划分子集,直到子集纯度达标或特征耗尽。
优缺点
- 优点:
- 原理简单,适合处理离散特征。
- 生成树结构直观易解释。
- 缺点:
- 偏向多值特征(如“编号”属性)。
- 无法处理连续特征和缺失值。
- 无剪枝策略,易过拟合。
C4.5算法(基于信息增益率)
核心改进
C4.5是ID3的升级版,引入信息增益率解决多值特征偏好问题,并支持连续值和剪枝。
-
信息增益率:
公式为:
g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A) = \frac{g(D,A)}{H_A(D)} gR(D,A)=HA(D)g(D,A)
其中 H A ( D ) H_A(D) HA(D) 是特征A的固有值(特征不平衡信息),计算方式为:
H A ( D ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log 2 ∣ D v ∣ ∣ D ∣ H_A(D) = -\sum_{v=1}^V \frac{|D_v|}{|D|} \log_2 \frac{|D_v|}{|D|} HA(D)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
通过归一化信息增益,减少多值特征的偏差。 -
连续值处理:
将连续特征离散化,取相邻值的平均点作为候选分割点,选择增益率最大的分割点。
算法流程
- 计算所有特征的信息增益率。
- 选择增益率最大的特征作为节点,若增益率低于阈值则停止分裂。
- 递归构建子树,支持后剪枝(如PEP剪枝)防止过拟合。
优缺点
- 优点:
- 处理连续特征和缺失值。
- 通过剪枝提升泛化能力。
- 缺点:
- 计算复杂度高(大量对数运算)。
- 多叉树结构效率低于二叉树。
CART算法(基于基尼系数)
核心原理
CART(Classification and Regression Trees)采用基尼系数作为分类标准,支持二叉树结构和回归任务。
-
基尼系数:
衡量数据不纯度,公式为:
Gini ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 \text{Gini}(D) = 1 - \sum_{k=1}^K \left( \frac{|C_k|}{|D|} \right)^2 Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2
基尼系数越小,纯度越高。 -
回归树:
使用均方误差(MSE) 作为划分标准:
MSE ( D ) = 1 ∣ D ∣ ∑ i = 1 ∣ D ∣ ( y i − y ˉ ) 2 \text{MSE}(D) = \frac{1}{|D|} \sum_{i=1}^{|D|} (y_i - \bar{y})^2 MSE(D)=∣D∣1i=1∑∣D∣(yi−yˉ)2
其中 y ˉ \bar{y} yˉ 是节点样本均值。
算法流程
-
排序连续特征值
- 对连续特征A的m个样本值按升序排列,记为 a 1 , a 2 , . . . , a m a_1, a_2, ..., a_m a1,a2,...,am。
- 目的:便于生成候选划分点并评估每个点的分割效果。
-
生成候选划分点
- 取相邻两值的平均值作为候选点,共生成 m − 1 m-1 m−1 个候选划分点 T i T_i Ti,计算公式为:
T i = a i + a i + 1 2 ( i = 1 , 2 , . . . , m − 1 ) T_i = \frac{a_i + a_{i+1}}{2} \quad (i=1,2,...,m-1) Ti=2ai+ai+1(i=1,2,...,m−1) - 示例:若连续值为[60, 70, 85],候选点为65((60+70)/2)、77.5((70+85)/2)。
- 取相邻两值的平均值作为候选点,共生成 m − 1 m-1 m−1 个候选划分点 T i T_i Ti,计算公式为:
-
计算候选点的基尼系数
- 对每个候选点 T i T_i Ti,将数据集分为两部分:
- 左子集 D L D_L DL:满足 A ≤ T i A \leq T_i A≤Ti
- 右子集 D R D_R DR:满足 A > T i A > T_i A>Ti
- 计算划分后的加权基尼系数:
Gini ( D , T i ) = ∣ D L ∣ ∣ D ∣ Gini ( D L ) + ∣ D R ∣ ∣ D ∣ Gini ( D R ) \text{Gini}(D, T_i) = \frac{|D_L|}{|D|} \text{Gini}(D_L) + \frac{|D_R|}{|D|} \text{Gini}(D_R) Gini(D,Ti)=∣D∣∣DL∣Gini(DL)+∣D∣∣DR∣Gini(DR)
其中 Gini ( D k ) = 1 − ∑ j = 1 K ( ∣ C k j ∣ ∣ D k ∣ ) 2 \text{Gini}(D_k) = 1 - \sum_{j=1}^K \left( \frac{|C_{kj}|}{|D_k|} \right)^2 Gini(Dk)=1−∑j=1K(∣Dk∣∣Ckj∣)2, K K K为类别数。
- 对每个候选点 T i T_i Ti,将数据集分为两部分:
-
选择最优划分点
- 遍历所有候选点,选择使基尼系数最小的 T i T_i Ti 作为分割点。
- 示例:在年收入特征中,若候选点97的基尼系数为0.3(最低),则以97为阈值将数据划分为≤97和>97两类。
-
递归分支与特征复用
- 在生成的子节点中,允许连续特征A再次参与后续分支(如左子树中可再次对A进行划分)。
- 对比:ID3/C4.5的离散特征一旦被使用,后续节点不再复用。
优缺点
- 优点:
- 支持分类和回归任务。
- 二叉树结构效率高,适合大规模数据。
- 基尼系数计算简单(无需对数运算)。
- 缺点:
- 对类别分布敏感,可能偏向多值特征。
- 剪枝策略依赖调参。
算法对比
特征 | ID3 | C4.5 | CART |
---|---|---|---|
树结构 | 多叉树 | 多叉树 | 二叉树 |
特征选择标准 | 信息增益 | 信息增益率 | 基尼系数/均方误差 |
支持任务 | 分类 | 分类 | 分类 + 回归 |
连续值处理 | 不支持 | 支持(离散化) | 支持(二分法) |
缺失值处理 | 不支持 | 支持(概率分配) | 支持(替代值) |
剪枝策略 | 无 | 后剪枝(PEP) | 后剪枝(CCP) |
计算复杂度 | 低 | 高(对数运算) | 中等(基尼系数) |
适用场景 | 小规模离散数据集 | 噪声数据、多特征场景 | 大规模数据、回归问题 |
关键应用场景
- ID3:适用于特征取值少、需快速建模的场景(如文本分类)。
- C4.5:适合处理含噪声或缺失值的数据(如医疗诊断)。
- CART:广泛应用于工业预测(如房价回归、客户分群)。
二、随机森林
核心思想
- Bagging:自助采样构建多个基学习器
- 特征随机性:分裂时随机选择特征子集(通常 m \sqrt{m} m或 log 2 m \log_2 m log2m个特征)
算法步骤
- 输入:训练集D,树数量T,特征子集大小k
- For t=1 to T:
a. 自助采样得到子集 D t D_t Dt
b. 构建决策树:- 在每个节点分裂时,从m个特征随机选择k个
- 选择最优分裂特征和分割点
- 完全生长不剪枝
- 输出:聚合所有树的预测结果(分类投票/回归平均)
优势特性
- OOB估计:约36.8%未被采样的样本可用于验证
- 特征重要性:通过平均Gini减少量或准确率下降评估
三、GBDT/XGBoost
1. GBDT(梯度提升决策树)
GBDT(Gradient Boosting Decision Tree,梯度提升决策树)是一种基于Boosting思想的集成学习算法,通过迭代构建多棵决策树逐步逼近目标值。其核心思想是:
- 加法模型:最终预测结果为所有弱学习器(CART回归树)的加权和。
- 梯度优化:利用损失函数的负梯度(残差的近似值)指导每棵新树的生成,逐步减少预测误差。
- 残差拟合:每棵新树拟合前一棵树的预测残差,最终通过叠加所有树的预测值得到强学习器。
算法流程
-
初始化模型
- 首轮预测值为目标值的均值(回归任务)或对数几率(分类任务。
- 公式: F 0 ( x ) = arg min γ ∑ i = 1 N L ( y i , γ ) F_0(x) = \arg\min_{\gamma} \sum_{i=1}^N L(y_i, \gamma) F0(x)=argminγ∑i=1NL(yi,γ),对于均方误差损失,初始值为 y ˉ \bar{y} yˉ。
-
迭代训练
- 残差计算:第 t t t 轮中,计算样本的负梯度(残差):
r t i = − ∂ L ( y i , F t − 1 ( x i ) ) ∂ F t − 1 ( x i ) r_{ti} = -\frac{\partial L(y_i, F_{t-1}(x_i))}{\partial F_{t-1}(x_i)} rti=−∂Ft−1(xi)∂L(yi,Ft−1(xi))
例如,均方误差损失下的残差为 y i − F t − 1 ( x i ) y_i - F_{t-1}(x_i) yi−Ft−1(xi)。 - 树分裂:训练新树 h t ( x ) h_t(x) ht(x)拟合残差,分裂时以最小化损失函数为目标:
θ t = arg min θ ∑ i = 1 N [ r t i − h t ( x i ; θ ) ] 2 \theta_t = \arg\min_{\theta} \sum_{i=1}^N [r_{ti} - h_t(x_i; \theta)]^2 θt=argθmini=1∑N[rti−ht(xi;θ)]2
使用CART回归树进行节点划分(如基尼指数或均方误差)。 - 模型更新:引入学习率 η \eta η(通常0.05~0.1)控制拟合速度:
F t ( x ) = F t − 1 ( x ) + η ⋅ h t ( x ) F_t(x) = F_{t-1}(x) + \eta \cdot h_t(x) Ft(x)=Ft−1(x)+η⋅ht(x)
通过加权叠加避免过拟合。
- 残差计算:第 t t t 轮中,计算样本的负梯度(残差):
-
终止条件
- 达到预设树的数量(如100棵)或残差收敛(损失函数变化率低于阈值)。
数学推导与损失函数
-
目标函数
Objective = ∑ i = 1 N L ( y i , F ( x i ) ) + ∑ t = 1 T Ω ( h t ) \text{Objective} = \sum_{i=1}^N L(y_i, F(x_i)) + \sum_{t=1}^T \Omega(h_t) Objective=i=1∑NL(yi,F(xi))+t=1∑TΩ(ht)- L L L为损失函数(如均方误差、对数损失)。
- Ω ( h t ) \Omega(h_t) Ω(ht)为正则化项,原版GBDT通常未显式引入,但通过树深度和叶子节点数间接控制复杂度。
-
泰勒展开优化
通过二阶泰勒展开近似损失函数,加速梯度计算:
L ( t ) ≈ ∑ i = 1 N [ g i h t ( x i ) + 1 2 h i h t 2 ( x i ) ] + Ω ( h t ) L^{(t)} \approx \sum_{i=1}^N [g_i h_t(x_i) + \frac{1}{2} h_i h_t^2(x_i)] + \Omega(h_t) L(t)≈i=1∑N[giht(xi)+21hiht2(xi)]+Ω(ht)
其中 g i g_i gi和 h i h_i hi分别为一阶和二阶梯度。
优势与局限性
优势:
- 高精度:能捕捉复杂的非线性关系,尤其适合结构化数据。
- 灵活性:支持回归、分类、排序任务,适配多种损失函数。
- 鲁棒性:对缺失值和噪声数据有较好容忍度。
局限性:
4. 计算开销大:串行训练导致难以并行化,大规模数据效率低。
5. 过拟合风险:树深度过大或迭代次数过多时易过拟合,需依赖早停法或参数调优。
6. 高维数据挑战:处理文本、图像等高维稀疏数据效果弱于深度学习模型。
2. XGBoost 创新点
XGBoost(eXtreme Gradient Boosting)是梯度提升决策树(GBDT)的优化版本。其核心目标是通过集成多个弱学习器(CART树)逐步修正预测误差,同时引入正则化机制防止过拟合。
核心机制:
8. 目标函数优化:
目标函数由损失函数(预测误差)和正则化项(模型复杂度)组成:
O b j ( t ) = ∑ i = 1 n L ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + Ω ( f t ) Obj^{(t)} = \sum_{i=1}^n L(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)) + \Omega(f_t) Obj(t)=i=1∑nL(yi,y^i(t−1)+ft(xi))+Ω(ft)
其中正则项: Ω ( f t ) = γ T + 1 2 λ ∣ ∣ w ∣ ∣ 2 \Omega(f_t) = \gamma T + \frac{1}{2}\lambda ||w||^2 Ω(ft)=γT+21λ∣∣w∣∣2,包含叶子节点权重(L1/L2正则)和叶子数量惩罚( γ T \gamma T γT),平衡模型精度与复杂度。
9. 二阶泰勒展开:
损失函数通过二阶导数近似优化,提升收敛速度:
L ( t ) ≈ ∑ [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) L^{(t)} \approx \sum \left[ g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) \right] + \Omega(f_t) L(t)≈∑[gift(xi)+21hift2(xi)]+Ω(ft)
其中 g i g_i gi 为一阶梯度, h i h_i hi 为二阶梯度。
10. 树分裂增益计算:
分裂增益公式为:
Gain = G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ − γ \text{Gain} = \frac{G_L^2}{H_L+\lambda} + \frac{G_R^2}{H_R+\lambda} - \frac{(G_L+G_R)^2}{H_L+H_R+\lambda} - \gamma Gain=HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2−γ
增益最大化决定分裂方向, γ \gamma γ 控制分裂阈值以防止过拟合。
关键改进:
11. 二阶泰勒展开:使用一阶导( g i g_i gi)和二阶导( h i h_i hi)
12. 分裂增益计算:
G a i n = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ ] − γ Gain = \frac{1}{2} \left[ \frac{G_L^2}{H_L+\lambda} + \frac{G_R^2}{H_R+\lambda} - \frac{(G_L+G_R)^2}{H_L+H_R+\lambda} \right] - \gamma Gain=21[HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2]−γ
13. 工程优化:
- 特征预排序(加权分位数草图)
- 并行化设计(特征粒度)
- 稀疏感知算法(自动处理缺失值)
四、常见问题深度解析
Q:随机森林 vs GBDT 核心差异
维度 | 随机森林 | GBDT |
---|---|---|
学习方式 | Bagging(并行) | Boosting(串行) |
优化目标 | 降低方差 | 降低偏差 |
基学习器 | 完全生长树 | 浅层树(通常4-8层) |
数据敏感 | 对噪声鲁棒 | 对异常值敏感 |
过拟合 | 通过样本&特征随机性控制 | 依赖早停法/收缩率 |
训练速度 | 快速(可并行) | 较慢(必须串行) |
参数调优 | 树数量、特征子集大小 | 学习率、树深度、子采样比例 |
典型应用场景:
- 随机森林:特征维度高、需要快速原型验证
- GBDT:数据质量高、需要高预测精度
- XGBoost:大规模数据、需要处理缺失值/定制损失函数
补充细节:XGBoost vs 传统GBDT
- 正则化控制:
- 显式加入L2正则项(叶子权重惩罚)
- 树复杂度控制(max_depth, min_child_weight)
- 二阶导数信息:
- 更精确的梯度方向估计
- 提升收敛速度
- 分裂策略优化:
- 精确贪心算法(小数据集)
- 近似分位数算法(大规模数据)
- 内存优化:
- 块结构存储(Column Block)
- 缓存访问优化