集成学习(Ensemble Learning)

集成学习(Ensemble Learning)

核心概念

通过构建并结合多个学习器(基学习器/弱学习器)来完成学习任务

"三个臭皮匠,顶个诸葛亮" (The wisdom of crowds)

目标

获得比单一学习器更好的泛化性能 (Generalization)鲁棒性 (Robustness)

两大基石

  1. 个体准确性:每个基学习器必须优于随机猜测(Error < 0.5)。
  2. 个体多样性 (Diversity):基学习器之间的错误不能高度相关(即"好而不同")

三大主流流派

1. Bagging (装袋法) ------ 并行独立

逻辑

同时训练多个模型,互不干扰,最后投票或平均。

机制:

  • Bootstrap Sampling:有放回地随机采样训练数据(每棵树看到的数据略有不同)。
  • 特征随机性:分裂节点时随机选择部分特征。

作用

主要降低 方差 (Variance),防止过拟合,提高稳定性。

  • 数学直觉 :若 NNN 个独立同分布模型的平均方差为 σ2σ^2σ2 ,则集成后的方差约为 σ2/Nσ^2/Nσ2/N。

适用场景:

高维数据、噪声较多、需要快速得到稳定基线 (Baseline) 的场景。

代表算法:

  • Random Forest (随机森林):Bagging + 决策树 + 特征随机选择。
  • Extra Trees:在随机森林基础上,节点分裂阈值也随机选取。
Random Forest (随机森林)

是一种基于 Bagging(Bootstrap Aggregating) 思想的集成学习算法。它通过构建大量决策树并进行集成,显著提升了模型的泛化能力和鲁棒性,同时有效降低了过拟合风险。

核心思想

随机森林 = Bagging + 随机特征选择

  • Bagging :每棵树在从原始数据集中有放回地随机抽取样本(Bootstrap 样本)上训练。
  • 随机特征选择 :在每个节点分裂时,只从所有特征中随机选取一个子集 (通常为 p\sqrt{p}p 个特征,ppp 为总特征数),再从中选择最佳分裂特征。

这种"双重随机性"使得每棵树彼此低相关性,从而提升整体性能。

弱学习器的训练样本既有交集也有差异数据,更容易发挥投票表决效果

算法流程

  1. 设定参数
    • 树的数量 TTT (如 100、500)
    • 每棵树使用的特征数 mmm (通常 m=总特征数m=\sqrt{总特征数}m=总特征数 )
    • 样本采样方式:有放回抽样(Bootstrap)
  2. 对每棵树 t=1,2,...,Tt=1,2,...,Tt=1,2,...,T
    • 从训练集 DDD 中有放回地抽取 NNN 个样本,构成 Bootstrap 数据集 DtD_tDt
    • 在 DtD_tDt上训练一棵未剪枝的决策树
      • 节点分裂时,仅从随机选取的 mmm 个特征中选择最优分裂特征和阈值
      • 不进行剪枝(允许树充分生长)
  3. 预测阶段
    • 分类任务:所有树投票,取多数类(或平均概率)
    • 回归任务:所有树输出取平均值

关键特性:

特性 说明
抗过拟合能力强 因集成多棵差异化的树,且每棵树在子样本+子特征上训练
无需剪枝 单棵树可深度生长,整体泛化靠集成实现
内置特征重要性评估 可通过"不纯度减少"或"排列重要性"衡量特征贡献
支持高维数据 对无关特征不敏感
天然支持并行训练 各树独立训练,适合分布式/多核计算
对缺失值和异常值鲁棒 决策树本身对此不敏感,集成进一步增强鲁棒性

优缺点

优点:

  • 准确率高,常作为基线模型
  • 几乎不需要调参(默认参数表现良好)
  • 可处理数值型和类别型特征
  • 提供特征重要性,有助于解释
  • 不易过拟合(相比单棵决策树)

缺点:

  • 相比线性模型,可解释性较差(虽优于黑盒模型如神经网络)
  • 训练和预测速度较慢(尤其树很多时)
  • 噪声标签仍有一定敏感性
  • 高维稀疏数据(如文本 TF-IDF)上可能不如线性模型
  • 预测结果是分段常数(回归任务中不够平滑)

重要概念:Out-of-Bag (OOB) 误差

  • 每次 Bootstrap 抽样约有 36.8% 的样本未被选中(称为 OOB 样本)
  • 这些 OOB 样本可作为验证集来评估模型性能,无需单独划分验证集
  • OOB 误差 ≈ 模型的泛化误差估计

例如:某样本被 100 棵树中的 70 棵未使用,则用这 70 棵树对其预测,计算误差。

典型应用场景

  • 金融风控(信用评分)
  • 医疗诊断(疾病预测)
  • 推荐系统(用户行为预测)
  • 图像分类(结合手工特征)
  • 特征选择与重要性分析

与 Bagging 的区别

方法 是否随机选特征? 树之间的相关性 泛化能力
Bagging(如 Bagged Trees) 否(使用全部特征) 较高 一般
Random Forest 是(每次分裂随机选特征子集) 更强

常用超参数(以 scikit-learn 为例)

python 复制代码
RandomForestClassifier(
    n_estimators=100,      # 树的数量
    max_features='sqrt',   # 分裂时考虑的特征数('sqrt', 'log2', int, float)
    max_depth=None,        # 树的最大深度(None 表示不限制)
    min_samples_split=2,   # 内部节点再分裂所需最小样本数
    min_samples_leaf=1,    # 叶节点最少样本数
    bootstrap=True,        # 是否使用 Bootstrap
    oob_score=True,        # 是否计算 OOB 误差
    random_state=42
)

随机森林 = 大量"随机但弱相关"的决策树 + 投票/平均 → 高精度、高鲁棒性的集成模型

2. Boosting (提升法) ------ 串行迭代

逻辑

分步训练,后一个模型专注于修正前一个模型的错误。

机制

  • 提高被前一轮错分样本的权重。
  • 或者拟合前一轮的残差 (Residuals)。

作用

主要降低 偏差 (Bias),将弱学习器提升为强学习器。

适用场景

表格数据竞赛、金融风控、需要高精度的回归/分类任务。

代表算法

  • AdaBoost:自适应加权,对噪声敏感。
  • GBDT (Gradient Boosting Decision Tree):利用梯度下降拟合残差。
  • XGBoost:二阶泰勒展开 + 正则化 + 并行处理(工业界标杆)。
  • LightGBM:基于直方图 + GOSS (单边梯度采样) + EFB (互斥特征捆绑),速度极快。
  • CatBoost:专门处理类别特征,防止目标泄露。
① AdaBoost(Adaptive Boosting,自适应提升)

它通过迭代训练一系列弱分类器 ,并将它们加权组合 成一个强分类器,核心思想是:让后续模型专注于前序模型预测错误的样本

核心思想:

"三个臭皮匠,胜过诸葛亮" ------ 但 AdaBoost 的聪明之处在于:它知道哪些"臭皮匠"在哪类问题上容易犯错,并针对性地加强训练

  • 自适应(Adaptive):每轮根据前一轮的错误动态调整样本权重。
  • 聚焦难例:被错分的样本在下一轮获得更高权重,迫使新模型重点学习这些"难点"。
  • 加权投票 :最终预测时,表现好的弱分类器拥有更大话语权(权重 αtα_tαt 更大)。

算法流程(以二分类为例,标签 yi∈−1,+1y_{i}∈\text{{−1,+1}}yi∈−1,+1):

输入:

  • 训练集(x1,y1),...,(xn,yn){(x_1,y_1),...,(x_n,y_n)}(x1,y1),...,(xn,yn)
  • 弱学习器(如决策树桩)
  • 迭代次数 TTT

步骤:

  1. 初始化样本权重
    对于所有 nnn 个训练样本,初始化权重为均匀分布:
    wi(1)=1n,i=1,2,...,n w_i^{(1)} = \frac{1}{n}, \quad i = 1, 2, \dots, n wi(1)=n1,i=1,2,...,n
  2. 迭代训练过程
    对每一轮 t=1t = 1t=1 到 TTT 执行以下步骤:
  • 训练弱分类器

    使用当前样本权重 w(t)w^{(t)}w(t) 训练一个弱分类器 ht(x)h_t(x)ht(x)。

  • 计算加权错误率

    计算该分类器在加权数据集上的错误率 εt\varepsilon_tεt:
    εt=∑i=1nwi(t)⋅I(ht(xi)≠yi) \varepsilon_t = \sum_{i=1}^{n} w_i^{(t)} \cdot \mathbb{I}(h_t(x_i) \neq y_i) εt=i=1∑nwi(t)⋅I(ht(xi)=yi)

    其中 I(⋅)\mathbb{I}(\cdot)I(⋅) 为指示函数,当条件成立时值为 1,否则为 0。

    εt\varepsilon_tεt表示第 ttt 个弱学习器的错误率(样本中测错的占比, 0~0.5,超过0.5则模型比随机猜测还糟)

    注意 :若 εt≥0.5\varepsilon_t \geq 0.5εt≥0.5,说明该分类器性能不优于随机猜测,应放弃该分类器并终止当前轮的迭代(或重新采样)。

  • 计算分类器权重

    计算当前弱分类器的重要性系数 αt\alpha_tαt:
    αt=12ln⁡(1−εtεt) \alpha_t = \frac{1}{2} \ln \left( \frac{1 - \varepsilon_t}{\varepsilon_t} \right) αt=21ln(εt1−εt)

  • 更新样本权重

    根据分类结果更新样本权重。被错分的样本权重增加,正确分类的样本权重降低:
    wi(t+1)=wi(t)⋅exp⁡(−αtyiht(xi)) w_i^{(t+1)} = w_i^{(t)} \cdot \exp \left( -\alpha_t y_i h_t(x_i) \right) wi(t+1)=wi(t)⋅exp(−αtyiht(xi))
    注:此处假设 yi,ht(xi)∈{−1,+1}y_i, h_t(x_i) \in \{-1, +1\}yi,ht(xi)∈{−1,+1}。若 yi≠ht(xi)y_i \neq h_t(x_i)yi=ht(xi),指数项为正,权重增大;反之权重减小。

    情况 A:样本被正确分类

    • 此时预测值与真实值符号相同,即 yi=ht(xi)y_i=h_t(x_i)yi=ht(xi) 。
    • 那么乘积 yi⋅ht(xi)=1y_i⋅h_t(x_i)=1yi⋅ht(xi)=1。
    • 指数部分变为: −αt⋅1=−αt−α_t⋅1=−α_t−αt⋅1=−αt(因为 αt>0α_{t}>0αt>0 ,所以这是一个负数)。
    • 计算结果: exp⁡(−αt)=e−αt<1\text{exp}⁡(−α_t)=e^{−α_t}<1exp⁡(−αt)=e−αt<1。
    • 效果 :新权重 = 旧权重 ××× 一个小于 1 的数 → 权重降低

    情况 B:样本被错误分类

    • 此时预测值与真实值符号相反,即 yi≠ht(xi)y_i≠h_t(x_i)yi=ht(xi)。
    • 那么乘积 yi⋅ht(xi)=−1y_i⋅h_t(x_i)=-1yi⋅ht(xi)=−1 。
    • 指数部分变为: −αt⋅(−1)=+αt−α_t⋅(-1)=+α_t−αt⋅(−1)=+αt(这是一个正数)。
    • 计算结果: exp⁡(αt)=eαt>1\text{exp}⁡(α_t)=e^{α_t}>1exp⁡(αt)=eαt>1 。
    • 效果 :新权重 = 旧权重 ××× 一个大于 1 的数 → 权重增加

    标签和预测值被定义为仅取两个值: +1 和 −1

  • 归一化权重

    对更新后的权重进行归一化,使其总和为 1:
    wi(t+1)←wi(t+1)∑j=1nwj(t+1) w_i^{(t+1)} \leftarrow \frac{w_i^{(t+1)}}{\sum_{j=1}^{n} w_j^{(t+1)}} wi(t+1)←∑j=1nwj(t+1)wi(t+1)

    确保满足 ∑iwi(t+1)=1\sum_{i} w_i^{(t+1)} = 1∑iwi(t+1)=1。

  1. 构建最终强分类器
    将所有弱分类器线性组合,得到最终的强分类器 H(x)H(x)H(x):

H(x)=sign(∑t=1Tαtht(x)) H(x) = \text{sign} \left( \sum_{t=1}^{T} \alpha_t h_t(x) \right) H(x)=sign(t=1∑Tαtht(x))

​ αt\alpha_tαt 为每个模型的权重

​ ht(x)h_{t}(x)ht(x) 是每个模型的预测结果

🔍 注意: αtα_tαt 越大,说明 hth_tht 越可靠;若 εt<0.5ε_t<0.5εt<0.5 ,则 αt>0α_t>0αt>0 ;若 εt>0.5ε_t>0.5εt>0.5 ,理论上可取负值(赋予反向投票权)。

关键特性

特性 说明
降低偏差 通过迭代修正错误,逐步减少系统性偏差
对弱学习器要求低 只需略优于随机猜测( εt<0.5ε_t<0.5εt<0.5)
无需提前设定数据分布 自适应调整样本权重
理论保证 在满足弱学习假设下,训练误差指数级下降
支持多分类 通过 SAMME 或 SAMME.R 算法扩展(scikit-learn 默认使用 SAMME.R)

优缺点

优点

  • 简单高效,易于实现
  • 不需要调太多参数(主要调 TT 和弱学习器)
  • 对特征缩放不敏感(因基于决策树等非距离模型)
  • 理论基础扎实,泛化能力强(在干净数据上)

缺点:

  • 对噪声和异常值非常敏感:错标样本会被反复加重权重,导致模型"钻牛角尖"
  • 串行训练,难以并行(但预测阶段可并行)
  • 容易过拟合(尤其在噪声多或迭代过多时)
  • 弱分类器必须满足 εt<0.5ε_t<0.5εt<0.5,否则失效

与 Bagging / Random Forest 对比:

方法 训练方式 目标 抗噪性 并行性
Bagging / RF 并行 降方差
AdaBoost 串行 降偏差

📌 经验法则

  • 数据干净、想提精度 → 用 AdaBoost / GBDT
  • 数据有噪声、求稳健 → 用 Random Forest

应用示例:

  • 人脸检测(Viola-Jones 框架的核心)
  • 垃圾邮件过滤
  • 信用卡欺诈检测
  • 医学诊断辅助

Python代码示例

python 复制代码
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# 生成数据
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# AdaBoost 模型(基学习器为决策树桩)
ada = AdaBoostClassifier(
    estimator=DecisionTreeClassifier(max_depth=1),  # 弱分类器
    n_estimators=100,
    learning_rate=1.0,
    algorithm='SAMME.R'  # 推荐使用(更平滑)
)

ada.fit(X_train, y_train)
print("Test Accuracy:", ada.score(X_test, y_test))

AdaBoost 的精髓在于"从错误中学习" ------ 它不回避失败,而是把每一次错误当作下一次进步的起点。

② GBDT(Gradient Boosting Decision Tree,梯度提升决策树)

通过迭代地拟合负梯度(即残差),用决策树作为基学习器,逐步逼近目标函数的最优解,在结构化数据任务中长期占据"精度王者"地位。

核心思想:用梯度下降优化函数空间

传统梯度下降是在参数空间 中更新模型参数;

而 GBDT 是在函数空间中,每一步添加一个新函数(一棵树)来减少损失。

💡 关键洞察

每一轮训练的目标不是直接预测标签 yyy,而是拟合当前模型的负梯度方向(即伪残差),从而最快速降低整体损失。

算法流程(以回归为例):

  1. 基本定义
  • 损失函数 :L(y,F(x))L(y, F(x))L(y,F(x))

    • 例如平方误差损失:12(y−F(x))2\frac{1}{2}(y - F(x))^221(y−F(x))2
  • 最终模型 :FM(x)F_M(x)FM(x) 是 M+1M+1M+1 个基学习器的累加和
    FM(x)=∑m=0Mfm(x) F_M(x) = \sum_{m=0}^{M} f_m(x) FM(x)=m=0∑Mfm(x)

    • 其中 f0(x)f_0(x)f0(x) 是初始常数预测值。
    • fm(x)f_m(x)fm(x) (m≥1m \geq 1m≥1) 是第 mmm 轮训练的决策树。
  1. 算法步骤

    2.1 初始化模型

    构建一个常数模型 F0(x)F_0(x)F0(x),使其在训练集上的损失最小:
    F0(x)=arg⁡min⁡γ∑i=1nL(yi,γ) F_0(x) = \arg\min_{\gamma} \sum_{i=1}^{n} L(y_i, \gamma) F0(x)=argγmini=1∑nL(yi,γ)

    • 示例 :若使用平方损失函数,最优解为样本均值,即 F0(x)=yˉF_0(x) = \bar{y}F0(x)=yˉ。

    2.2 迭代训练 (对于 m=1m = 1m=1 到 MMM)

    步骤 A: 计算负梯度(伪残差)

    对每个样本 i=1,...,ni=1, \dots, ni=1,...,n,计算当前模型 Fm−1(x)F_{m-1}(x)Fm−1(x) 的负梯度方向:
    rim=−[∂L(yi,F(xi))∂F(xi)]F=Fm−1 r_{im} = -\left[ \frac{\partial L(y_i, F(x_i))}{\partial F(x_i)} \right]{F=F{m-1}} rim=−[∂F(xi)∂L(yi,F(xi))]F=Fm−1

    • 平方损失特例 :负梯度即为普通残差
      rim=yi−Fm−1(xi) r_{im} = y_i - F_{m-1}(x_i) rim=yi−Fm−1(xi)

    • 其他损失(如 LogLoss):则为广义残差。

    步骤 B: 拟合残差

    训练一棵回归树 hm(x)h_m(x)hm(x) 来拟合伪残差数据集 {(xi,rim)}i=1n\{(x_i, r_{im})\}_{i=1}^n{(xi,rim)}i=1n。

    • 该树将输入空间划分为 JmJ_mJm 个互不相交的区域(叶子节点):R1m,R2m,...,RJmmR_{1m}, R_{2m}, \dots, R_{J_mm}R1m,R2m,...,RJmm。

    步骤 C: 计算叶子节点最优值

    对树的每个叶子节点 jjj (j=1,...,Jmj=1, \dots, J_mj=1,...,Jm),寻找使该区域内损失最小的最佳输出值 γjm\gamma_{jm}γjm:
    γjm=arg⁡min⁡γ∑xi∈RjmL(yi,Fm−1(xi)+γ) \gamma_{jm} = \arg\min_{\gamma} \sum_{x_i \in R_{jm}} L(y_i, F_{m-1}(x_i) + \gamma) γjm=argγminxi∈Rjm∑L(yi,Fm−1(xi)+γ)

    • 平方损失特例 :γjm\gamma_{jm}γjm 为该叶子节点内残差的平均值。

    步骤 D: 更新模型

    将新训练的树加入模型,并引入学习率 ν\nuν 进行缩放:
    Fm(x)=Fm−1(x)+ν⋅∑j=1Jmγjm⋅I(x∈Rjm) F_m(x) = F_{m-1}(x) + \nu \cdot \sum_{j=1}^{J_m} \gamma_{jm} \cdot \mathbb{I}(x \in R_{jm}) Fm(x)=Fm−1(x)+ν⋅j=1∑Jmγjm⋅I(x∈Rjm)

    • 参数说明
      • ν\nuν (学习率 / Shrinkage ):通常取值 0.01∼0.10.01 \sim 0.10.01∼0.1。
      • 作用:缩小每一步的更新幅度,防止过拟合,提高模型的泛化能力。
      • I(⋅)\mathbb{I}(\cdot)I(⋅):指示函数,当 xxx 落入区域 RjmR_{jm}Rjm 时取 1,否则取 0。
  2. 最终预测

    经过 MMM 轮迭代后,得到最终强学习器:

y^=FM(x) \hat{y} = F_M(x) y^=FM(x)

关键特性

特性 说明
高精度 在结构化/表格数据上常优于深度学习
自动特征组合 树的分裂过程隐式实现特征交叉(如 "age > 30 且 income < 5k")
无需特征缩放 基于树,对量纲不敏感
支持类别特征 需预处理(如 One-Hot 或 Label Encoding)
可输出特征重要性 基于分裂增益或使用频率
正则化手段丰富 学习率、树深度、子采样、叶子权重等

优缺点

优点:

  • 预测精度极高(Kaggle 表格竞赛常胜将军)
  • 对缺失值鲁棒(可通过默认方向处理)
  • 可解释性较好(相比神经网络)
  • 理论基础扎实(函数空间梯度下降)

缺点:

  • 训练速度慢(串行建树,无法完全并行)
  • 内存消耗大(需存储所有树结构)
  • 对高维稀疏数据(如文本)效果一般
  • 容易过拟合(若树太深、迭代太多、学习率太大)

与 AdaBoost 的区别

维度 AdaBoost GBDT
优化目标 指数损失(Exponential Loss) 任意可微损失函数
拟合目标 错分样本的权重调整 负梯度(残差)
灵活性 仅适用于特定损失 通用框架,可扩展
鲁棒性 对噪声敏感 相对更稳健(尤其用 Huber 损失时)

Python代码示例

python 复制代码
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

X, y = make_regression(n_samples=1000, n_features=20, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

gbdt = GradientBoostingRegressor(
    n_estimators=100,
    learning_rate=0.1,
    max_depth=3,
    subsample=0.8,      # 随机子采样(类似 Bagging,增强泛化)
    random_state=42
)

gbdt.fit(X_train, y_train)
print("Test R²:", gbdt.score(X_test, y_test))

GBDT = 梯度下降 + 决策树 + 集成学习 → 在函数空间中一步步修正错误

③XGBoost(eXtreme Gradient Boosting)

是 GBDT(Gradient Boosting Decision Tree)的一种高效、可扩展、正则化的实现 ,由陈天奇(Tianqi Chen)于 2014 年提出。它在保持 GBDT 高精度的同时,通过工程优化 + 算法改进,显著提升了速度、内存效率和泛化能力,成为 Kaggle 竞赛和工业界最广泛使用的机器学习算法之一

核心思想:在 GBDT 基础上"更准、更快、更稳"

XGBoost = GBDT + 正则化 + 二阶导数 + 工程优化

✨ 它不是一种新算法,而是对 GBDT 的系统性增强

关键创新点:

  1. 目标函数引入显式正则化

    传统 GBDT 仅最小化损失函数,而 XGBoost 的目标函数包含结构正则项,用于防止过拟合。

    第 ttt 轮的目标函数定义为:
    Obj(t)=∑i=1nL(yi,y^i(t−1)+ft(xi))+Ω(ft) \text{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)

    其中:

    • LLL:可微损失函数(如平方误差、LogLoss)。
    • Ω(ft)\Omega(f_t)Ω(ft):树的复杂度惩罚项,定义为:
      Ω(f)=γT+12λ∑j=1Twj2 \Omega(f) = \gamma T + \frac{1}{2} \lambda \sum_{j=1}^{T} w_j^2 Ω(f)=γT+21λj=1∑Twj2
      • TTT:叶子节点的数量。
      • wjw_jwj:第 jjj 个叶子节点的权重(即该叶子的预测值)。
      • γ,λ\gamma, \lambdaγ,λ:正则化超参数。
        • γ\gammaγ:控制叶子节点数量的惩罚(越大,树越简单)。
        • λ\lambdaλ:控制叶子权重的 L2 正则化(越大,权重越平滑)。

    ✅ 优势:通过直接惩罚复杂的树结构,显著提升了模型的泛化能力。

  2. 使用二阶泰勒展开近似损失函数

    GBDT 通常只利用一阶梯度(负梯度)方向进行更新,而 XGBoost 利用二阶导数信息,对损失函数进行更精确的逼近。

    对目标函数进行二阶泰勒展开(去掉常数项):
    Obj(t)≈∑i=1n[gift(xi)+12hift2(xi)]+Ω(ft) \text{Obj}^{(t)} \approx \sum_{i=1}^{n} \left[ g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) \right] + \Omega(f_t) Obj(t)≈i=1∑n[gift(xi)+21hift2(xi)]+Ω(ft)

    其中梯度定义为:

  • 一阶梯度 (gig_igi):
    gi=∂L(yi,y^i(t−1))∂y^ g_i = \frac{\partial L(y_i, \hat{y}_i^{(t-1)})}{\partial \hat{y}} gi=∂y^∂L(yi,y^i(t−1))

  • 二阶梯度 (hih_ihi):
    hi=∂2L(yi,y^i(t−1))∂y^2 h_i = \frac{\partial^2 L(y_i, \hat{y}_i^{(t-1)})}{\partial \hat{y}^2} hi=∂y^2∂2L(yi,y^i(t−1))

🔍 优势:引入二阶信息使得损失函数的近似更加准确,从而让分裂增益的计算更精确,模型收敛速度更快。

  1. 分裂增益公式 (Split Gain)

    为了选择最佳切分点,XGBoost 推导出了精确的增益计算公式。对于一个候选分裂,将当前节点样本集合 III 分为左子树 ILI_LIL 和右子树 IRI_RIR,其增益 (Gain ) 为:
    Gain=12[(∑i∈ILgi)2∑i∈ILhi+λ+(∑i∈IRgi)2∑i∈IRhi+λ−(∑i∈Igi)2∑i∈Ihi+λ]−γ \text{Gain} = \frac{1}{2} \left[ \frac{(\sum_{i \in I_L} g_i)^2}{\sum_{i \in I_L} h_i + \lambda} + \frac{(\sum_{i \in I_R} g_i)^2}{\sum_{i \in I_R} h_i + \lambda} - \frac{(\sum_{i \in I} g_i)^2}{\sum_{i \in I} h_i + \lambda} \right] - \gamma Gain=21[∑i∈ILhi+λ(∑i∈ILgi)2+∑i∈IRhi+λ(∑i∈IRgi)2−∑i∈Ihi+λ(∑i∈Igi)2]−γ

    公式解析:

    1. 左边部分:分裂后左子树的结构分数。
    2. 中间部分:分裂后右子树的结构分数。
    3. 右边部分:分裂前父节点的结构分数。
    4. γ\gammaγ:引入新叶子节点的复杂度代价。

    决策逻辑:

    • Gain>0\text{Gain} > 0Gain>0:说明分裂带来的损失减少量超过了复杂度惩罚,分裂有效。
    • Gain≤0\text{Gain} \leq 0Gain≤0:说明分裂得不偿失,不应进行该分裂。

✅ 优势

  • 自动剪枝 :XGBoost 采用"预剪枝"与"后剪枝"结合的策略。它允许先生成较深的树,然后回溯移除那些 Gain<0\text{Gain} < 0Gain<0 的分裂节点,从而找到全局最优的树结构。
  • γ\gammaγ 的作用:直接控制是否值得新增一个叶子节点,有效防止过拟合。

优缺点

优点:

  • 精度高:Kaggle 表格竞赛长期霸榜
  • 泛化强:正则化有效抑制过拟合
  • 速度快:高度优化的 C++ 实现
  • 功能全:支持缺失值、类别特征(需编码)、自定义目标
  • 生态好:支持 Python/R/Java/Scala,集成 Sklearn API

缺点:

  • 对高维稀疏数据(如文本 TF-IDF)不如线性模型
  • 调参较复杂(但默认参数已很强)
  • 内存占用较高(尤其树很多时)
  • 黑盒程度高于线性模型(但可通过 SHAP 解释)

主要超参数(调参关键)

参数 作用 常见值
n_estimators 树的数量 100~1000
learning_rate(eta) 学习率(shrinkage) 0.01~0.3
max_depth 树最大深度 3~10(防过拟合)
subsample 行采样比例 0.6~0.8
colsample_bytree 列采样比例 0.6~1.0
gamma 分裂所需最小损失减少 0~5(越大越保守)
lambda(reg_lambda) L2 正则化权重 1(默认)
alpha(reg_alpha) L1 正则化(稀疏性) 0(默认)
early_stopping_rounds 早停轮数 10~50

🎯 调参建议 :先固定 learning_rate=0.1,调 max_depthn_estimators;再降低学习率、增加树数量。

代码示例

python 复制代码
from xgboost import XGBClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

model = XGBClassifier(
    n_estimators=200,
    max_depth=4,
    learning_rate=0.1,
    subsample=0.8,
    colsample_bytree=0.8,
    reg_lambda=1,
    gamma=0,
    random_state=42,
    eval_metric='logloss',
    early_stopping_rounds=10
)

model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)
print("Test Accuracy:", model.score(X_test, y_test))

XGBoost = 理论严谨 + 工程极致 → "表格数据上的瑞士军刀"

Bagging和Boosting对比
数据采样 对数据进行有放回的采样训练 全部样本,根据前一轮学习结果调整数据的重要性
维度 Bagging Boosting
投票方式 所有学习器平权投票 对学习器进行加权投票
训练方式 并行(无依赖关系) 串行(有依赖关系)
目标 降低方差 降低偏差
样本权重 固定 动态调整
典型算法 Random Forest AdaBoost, GBDT, XGBoost
抗噪能力 较弱
过拟合风险 高(需调参控制)
并行性 低(工程优化可部分并行)

✅ Bagging 更适合高方差、低偏差 的模型(如深度决策树)

✅ Boosting 更适合高偏差、低方差的弱模型(如浅层树)

⚠️ Boosting 容易过拟合,需早停(early stopping)、正则化等手段控制。

3.Stacking (堆叠法) & Blending ------ 分层融合
  • 逻辑:用"元学习器" (Meta-learner) 来学习如何组合基学习器的预测结果。

  • 结构 :

    • Level 0 (基学习器):使用不同的算法(如 SVM, RF, XGBoost, NN)训练。
    • Level 1 (元学习器):将 Level 0 的输出作为输入特征,训练一个新模型(通常是线性回归或逻辑回归)。
  • 关键点 :必须使用 交叉验证 (Cross-Validation) 生成 Level 0 的训练数据,防止过拟合(Data Leakage)。

  • 作用:融合异构模型的优势,通常能刷出最高精度。

  • 缺点:训练慢、推理慢、模型复杂、可解释性差。

  • 适用场景:Kaggle等数据挖掘竞赛、对精度要求极致且不计成本的场景。

2026年视角的进阶

随着大模型和深度学习的发展,集成学习的形态发生了演变:

1. 深度集成 (Deep Ensembles)
  • 现象:即使是大模型(LLMs),集成多个不同随机种子初始化的模型,依然能显著提升准确率和校准度 (Calibration)。
  • 应用:用于减少大模型的"幻觉",提高医疗、法律等高风险领域的可靠性。
  • 技巧Snapshot Ensembling(在单次训练的不同收敛点保存模型权重)以节省计算资源。
2. 混合专家模型 (Mixture of Experts, MoE)
  • 本质 :一种动态的、稀疏的集成学习
  • 机制:模型内部包含多个"专家"子网络,对于每个输入 token,路由网络 (Router) 只激活其中少数几个专家。
  • 优势:在参数量巨大的情况下,保持推理成本可控(类似集成效果,但不用跑完所有模型)。
  • 现状:GPT-4, Mixtral, Grok 等主流大模型的核心架构。
3. 联邦集成 (Federated Ensemble)
  • 背景:数据隐私法规(如GDPR)日益严格。
  • 方法:数据不出本地,各客户端训练局部模型,服务器端聚合模型参数或预测结果。
  • 价值:解决了"数据孤岛"问题,实现了跨机构的集体智慧。
4. 不确定性估计 (Uncertainty Estimation)
  • 集成学习是估计认知不确定性 (Epistemic Uncertainty) 的黄金标准。
  • 如果集成中所有模型对某样本预测一致 -> 置信度高。
  • 如果集成中模型预测分歧大 -> 置信度低(模型"不知道"),此时应拒绝预测或转人工。

总结

  1. 随机森林为什么比单棵决策树好?
  • 答:通过Bagging降低了方差,通过特征随机选择增加了多样性,避免了单棵树容易过拟合的问题。
  1. XGBoost 比 GBDT 快在哪里?
  • 答:二阶泰勒展开(更精准)、正则化项(防过拟合)、列采样、缺失值自动处理、支持并行计算(特征粒度上的并行)。
  1. Bagging 和 Boosting 的主要区别?
  • 答:串行vs并行;关注偏差vs关注方差;样本权重固定vs动态调整;基学习器强依赖vs相互独立。
  1. Stacking 中为什么要用 K 折交叉验证生成训练数据?
  • 答:为了防止数据泄露 (Data Leakage)。如果直接用训练集预测结果作为元模型输入,元模型会记住基模型的过拟合特征,导致在测试集上表现崩塌。
  1. 如何处理集成学习中的类别不平衡?
  • 答:在基学习器层面使用欠采样/过采样 (SMOTE),或在Boosting中调整正负样本权重,或在集成结果层面调整阈值。
相关推荐
新缸中之脑2 小时前
RAG 只是权宜之计
人工智能
DeepModel2 小时前
通俗易懂讲透 EM 算法(期望最大化)
人工智能·python·算法·机器学习
海海不掉头发2 小时前
【AI大模型实战项目】大模型入门实战:两个落地项目保姆级教程12月14日-【项目】基于知识库RAG的物流行业信息问答系统
人工智能·python·深度学习·语言模型·自然语言处理·pycharm·scikit-learn
mpr0xy2 小时前
《AI怎么一步步变聪明的?》系列(六)中国大模型崛起之路:从“追赶者”到“解题人”
人工智能·ai·大语言模型·qwen·deepseek
游了个戏2 小时前
OPC × AI × 快手:小游戏蓝海中的第三极突围
人工智能·游戏
神奇小汤圆2 小时前
Harness Engineering 时代的失败经验
人工智能
ok_hahaha2 小时前
AI从头开始-黑马LongChain-RAG开发3
人工智能
糖炒栗子03262 小时前
让 AI 在大项目中做修改的标准操作模板
人工智能
oioihoii2 小时前
大模型输出的“隐性结构塌缩”问题及对策
人工智能