当前位置: 首页 > news >正文

树模型与集成学习(决策树核心算法: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=1KDCklog2DCk
    其中 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=1VDDvH(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=1VDDvlog2DDv
    通过归一化信息增益,减少多值特征的偏差。

  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)=1k=1K(DCk)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)=D1i=1D(yiyˉ)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 m1 个候选划分点 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,...,m1)
    • 示例:若连续值为[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 ATi
      • 右子集 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)=DDLGini(DL)+DDRGini(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)=1j=1K(DkCkj)2 K K K为类别数。
  4. 选择最优划分点

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

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

优缺点

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

算法对比

特征ID3C4.5CART
树结构多叉树多叉树二叉树
特征选择标准信息增益信息增益率基尼系数/均方误差
支持任务分类分类分类 + 回归
连续值处理不支持支持(离散化)支持(二分法)
缺失值处理不支持支持(概率分配)支持(替代值)
剪枝策略后剪枝(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=Ft1(xi)L(yi,Ft1(xi))
      例如,均方误差损失下的残差为 y i − F t − 1 ( x i ) y_i - F_{t-1}(x_i) yiFt1(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=1N[rtiht(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)=Ft1(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=1NL(yi,F(xi))+t=1TΩ(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=1N[giht(xi)+21hiht2(xi)]+Ω(ht)
    其中 g i g_i gi h i h_i hi分别为一阶和二阶梯度。


优势与局限性

优势

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

局限性
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=1nL(yi,y^i(t1)+ft(xi))+Ω(ft)
其中正则项: Ω ( f t ) = γ T + 1 2 λ ∣ ∣ w ∣ ∣ 2 \Omega(f_t) = \gamma T + \frac{1}{2}\lambda ||w||^2 Ω(ft)=γT+21λ∣∣w2,包含叶子节点权重(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+λGR2HL+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+λGR2HL+HR+λ(GL+GR)2]γ
13. 工程优化:

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

四、常见问题深度解析

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)
    • 缓存访问优化

相关文章:

  • Python自动化selenium-一直卡着不打开浏览器怎么办?
  • Unity中的数字孪生项目:两种输入方式对观察物体的实现
  • 从代码实现理解Vision Permutator:WeightedPermuteMLP模型解析
  • 大麦缺货状态进订单源码
  • 编译原理|| 实验一:词法分析程序设计
  • 《浔川代码编辑器v2.0内测(完整)报告》
  • 学习笔记二十二—— 并发五大常见陷阱
  • 中科院数据生成赋能具身导航!WCGEN:基于世界一致性数据生成的视觉语言导航
  • XAML基本语法与例子
  • Promise 原理、用法与在 Vue 中的最佳实践
  • BGP路由控制实验
  • 【第16届蓝桥杯软件赛】CB组第一次省赛
  • xpath选择器
  • jax 备忘录
  • 多表查询之连接查询
  • 微服务划分的思考
  • [陇剑杯 2021]内存分析(问1)
  • 你学会了些什么220622?--搭建UI自动化
  • 论文速报《Being-0:结合视觉语言模型与模块化技能的人形机器人智能体》
  • 53、Spring Boot 详细讲义(十)(Spring Boot 高级主题)
  • 常方舟评《心的表达》|弗洛伊德式精神分析在我们时代的延展
  • 独家丨远洋渔船船长被害案嫌犯移送检方报捕,船上两段视频曝光
  • 申花迎来中超三连胜,这一次终于零封对手了
  • 对话地铁读书人|来自大学教授的科普:读书日也是版权日
  • 华夏幸福:累计未能如期偿还债务金额合计为227.91亿元
  • 刘国梁:奥运会乒乓球项目增至六金,国乒机遇与挑战并存