树模型与集成学习(决策树核心算法:ID3/C4.5/CART、随机森林、GBDT/XGBoost)

树模型与集成学习

一、决策树

决策树核心算法:ID3/C4.5/CART


ID3算法(基于信息增益)

核心原理

ID3(Iterative Dichotomiser 3)是最早的决策树算法之一,由Ross Quinlan于1975年提出。其核心思想是通过信息增益 选择最优划分特征,构建多叉树结构,递归分割数据直至纯度达标1,3

  1. 信息熵

    衡量数据集的混乱程度,公式为:
    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 为类别数。

  2. 信息增益

    特征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

算法步骤

  1. 计算数据集的总信息熵 H ( D ) H(D) H(D)。
  2. 对每个特征计算信息增益,选择增益最大的特征作为划分节点。
  3. 递归划分子集,直到子集纯度达标或特征耗尽。

优缺点

  • 优点
    • 原理简单,适合处理离散特征。
    • 生成树结构直观易解释。
  • 缺点
    • 偏向多值特征(如"编号"属性)。
    • 无法处理连续特征和缺失值。
    • 无剪枝策略,易过拟合。

C4.5算法(基于信息增益率)

核心改进

C4.5是ID3的升级版,引入信息增益率解决多值特征偏好问题,并支持连续值和剪枝。

  1. 信息增益率

    公式为:
    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∣

    通过归一化信息增益,减少多值特征的偏差。

  2. 连续值处理

    将连续特征离散化,取相邻值的平均点作为候选分割点,选择增益率最大的分割点。

算法流程

  1. 计算所有特征的信息增益率。
  2. 选择增益率最大的特征作为节点,若增益率低于阈值则停止分裂。
  3. 递归构建子树,支持后剪枝(如PEP剪枝)防止过拟合。

优缺点

  • 优点
    • 处理连续特征和缺失值。
    • 通过剪枝提升泛化能力。
  • 缺点
    • 计算复杂度高(大量对数运算)。
    • 多叉树结构效率低于二叉树。

CART算法(基于基尼系数)

核心原理

CART(Classification and Regression Trees)采用基尼系数作为分类标准,支持二叉树结构和回归任务。

  1. 基尼系数

    衡量数据不纯度,公式为:
    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

    基尼系数越小,纯度越高。

  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ˉ 是节点样本均值。

算法流程

  1. 排序连续特征值

    • 对连续特征A的m个样本值按升序排列,记为 a 1 , a 2 , . . . , a m a_1, a_2, ..., a_m a1,a2,...,am。
    • 目的:便于生成候选划分点并评估每个点的分割效果。
  2. 生成候选划分点

    • 取相邻两值的平均值作为候选点,共生成 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)。
  3. 计算候选点的基尼系数

    • 对每个候选点 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为类别数。
  4. 选择最优划分点

    • 遍历所有候选点,选择使基尼系数最小的 T i T_i Ti 作为分割点。
    • 示例:在年收入特征中,若候选点97的基尼系数为0.3(最低),则以97为阈值将数据划分为≤97和>97两类。
  5. 递归分支与特征复用

    • 在生成的子节点中,允许连续特征A再次参与后续分支(如左子树中可再次对A进行划分)。
    • 对比:ID3/C4.5的离散特征一旦被使用,后续节点不再复用。

优缺点

  • 优点
    • 支持分类和回归任务。
    • 二叉树结构效率高,适合大规模数据。
    • 基尼系数计算简单(无需对数运算)。
  • 缺点
    • 对类别分布敏感,可能偏向多值特征。
    • 剪枝策略依赖调参。

算法对比

特征 ID3 C4.5 CART
树结构 多叉树 多叉树 二叉树
特征选择标准 信息增益 信息增益率 基尼系数/均方误差
支持任务 分类 分类 分类 + 回归
连续值处理 不支持 支持(离散化) 支持(二分法)
缺失值处理 不支持 支持(概率分配) 支持(替代值)
剪枝策略 后剪枝(PEP) 后剪枝(CCP)
计算复杂度 高(对数运算) 中等(基尼系数)
适用场景 小规模离散数据集 噪声数据、多特征场景 大规模数据、回归问题

关键应用场景

  1. ID3:适用于特征取值少、需快速建模的场景(如文本分类)。
  2. C4.5:适合处理含噪声或缺失值的数据(如医疗诊断)。
  3. CART:广泛应用于工业预测(如房价回归、客户分群)。

二、随机森林

核心思想

  • Bagging:自助采样构建多个基学习器
  • 特征随机性 :分裂时随机选择特征子集(通常 m \sqrt{m} m 或 log ⁡ 2 m \log_2 m log2m个特征)

算法步骤

  1. 输入:训练集D,树数量T,特征子集大小k
  2. For t=1 to T:
    a. 自助采样得到子集 D t D_t Dt
    b. 构建决策树:
    • 在每个节点分裂时,从m个特征随机选择k个
    • 选择最优分裂特征和分割点
    • 完全生长不剪枝
  3. 输出:聚合所有树的预测结果(分类投票/回归平均)

优势特性

  • OOB估计:约36.8%未被采样的样本可用于验证
  • 特征重要性:通过平均Gini减少量或准确率下降评估

三、GBDT/XGBoost

1. GBDT(梯度提升决策树)

GBDT(Gradient Boosting Decision Tree,梯度提升决策树)是一种基于Boosting思想的集成学习算法,通过迭代构建多棵决策树逐步逼近目标值。其核心思想是:

  1. 加法模型:最终预测结果为所有弱学习器(CART回归树)的加权和。
  2. 梯度优化:利用损失函数的负梯度(残差的近似值)指导每棵新树的生成,逐步减少预测误差。
  3. 残差拟合:每棵新树拟合前一棵树的预测残差,最终通过叠加所有树的预测值得到强学习器。

算法流程
  1. 初始化模型

    • 首轮预测值为目标值的均值(回归任务)或对数几率(分类任务。
    • 公式: 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ˉ。
  2. 迭代训练

    • 残差计算 :第 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)
      通过加权叠加避免过拟合。
  3. 终止条件

    • 达到预设树的数量(如100棵)或残差收敛(损失函数变化率低于阈值)。

数学推导与损失函数
  1. 目标函数
    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通常未显式引入,但通过树深度和叶子节点数间接控制复杂度。
  2. 泰勒展开优化

    通过二阶泰勒展开近似损失函数,加速梯度计算:
    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分别为一阶和二阶梯度。


优势与局限性

优势

  1. 高精度:能捕捉复杂的非线性关系,尤其适合结构化数据。
  2. 灵活性:支持回归、分类、排序任务,适配多种损失函数。
  3. 鲁棒性:对缺失值和噪声数据有较好容忍度。

局限性

  1. 计算开销大 :串行训练导致难以并行化,大规模数据效率低。

  2. 过拟合风险 :树深度过大或迭代次数过多时易过拟合,需依赖早停法或参数调优。

  3. 高维数据挑战:处理文本、图像等高维稀疏数据效果弱于深度学习模型。

2. XGBoost 创新点

XGBoost(eXtreme Gradient Boosting)是梯度提升决策树(GBDT)的优化版本。其核心目标是通过集成多个弱学习器(CART树)逐步修正预测误差,同时引入正则化机制防止过拟合。
核心机制

  1. 目标函数优化

目标函数由损失函数(预测误差)和正则化项(模型复杂度)组成:
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),平衡模型精度与复杂度。

  1. 二阶泰勒展开

损失函数通过二阶导数近似优化,提升收敛速度:
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 为二阶梯度。

  1. 树分裂增益计算

分裂增益公式为:
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 γ 控制分裂阈值以防止过拟合。

关键改进

  1. 二阶泰勒展开:使用一阶导( g i g_i gi)和二阶导( h i h_i hi)

  2. 分裂增益计算:
    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]−γ

  3. 工程优化:

  • 特征预排序(加权分位数草图)
  • 并行化设计(特征粒度)
  • 稀疏感知算法(自动处理缺失值)

四、常见问题深度解析

Q:随机森林 vs GBDT 核心差异

维度 随机森林 GBDT
学习方式 Bagging(并行) Boosting(串行)
优化目标 降低方差 降低偏差
基学习器 完全生长树 浅层树(通常4-8层)
数据敏感 对噪声鲁棒 对异常值敏感
过拟合 通过样本&特征随机性控制 依赖早停法/收缩率
训练速度 快速(可并行) 较慢(必须串行)
参数调优 树数量、特征子集大小 学习率、树深度、子采样比例

典型应用场景

  • 随机森林:特征维度高、需要快速原型验证
  • GBDT:数据质量高、需要高预测精度
  • XGBoost:大规模数据、需要处理缺失值/定制损失函数

补充细节:XGBoost vs 传统GBDT

  1. 正则化控制:
    • 显式加入L2正则项(叶子权重惩罚)
    • 树复杂度控制(max_depth, min_child_weight)
  2. 二阶导数信息:
    • 更精确的梯度方向估计
    • 提升收敛速度
  3. 分裂策略优化:
    • 精确贪心算法(小数据集)
    • 近似分位数算法(大规模数据)
  4. 内存优化:
    • 块结构存储(Column Block)
    • 缓存访问优化
相关推荐
小王努力学编程几秒前
美团2024年春招第一场笔试 C++
开发语言·数据结构·c++·学习·算法
superior tigre4 分钟前
C++学习:六个月从基础到就业——STL算法(一) 基础与查找算法
c++·学习·算法
刚入门的大一新生4 分钟前
C++初阶-类和对象(下)
开发语言·c++·算法
清羽_ls40 分钟前
leetcode-位运算
前端·算法·leetcode·位运算
猫猫头有亿点炸1 小时前
C语言中小写字母转大写字母
c语言·开发语言·算法
天天扭码1 小时前
一杯珍珠奶茶的时间吃透一道高频面试算法题——搜索二位矩阵Ⅱ
前端·算法·面试
pljnb1 小时前
聚类算法(K-means、DBSCAN)
算法·kmeans·聚类
2301_807611492 小时前
46. 全排列
c++·算法·leetcode·深度优先·回溯
天天扭码2 小时前
一杯蜜桃四季春的时间吃透一道高频面试算法题——旋转图像
前端·算法·面试
爱的叹息2 小时前
【java实现+4种变体完整例子】排序算法中【堆排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
java·算法·排序算法