正在加载中...

展开本页目录
算法教程梯度提升树(GBDT)

梯度提升树(GBDT)

No.031 · 在线教程

梯度提升树(Gradient Boosting Decision Tree, GBDT)是一类基于加性模型与梯度提升思想的集成学习方法,可用于分类与回归。它通过逐步拟合损失函数的负梯度(伪残差),不断叠加弱学习器(通常为 CART 回归树),最终得到高精度模型。

梯度提升树(GBDT)

1. 方法概述

梯度提升树(Gradient Boosting Decision Tree, GBDT)是一类基于加性模型梯度提升思想的集成学习方法,可用于分类回归。它通过逐步拟合损失函数的负梯度(伪残差),不断叠加弱学习器(通常为 CART 回归树),最终得到高精度模型。

设共有 \(n\) 个样本、\(d\) 个特征,数据集为

$$ \mathcal{D}=\{(x_i,y_i)\}_{i=1}^{n},\quad x_i\in\mathbb{R}^d \tag{1} $$

其中 \(y_i\) 为类别标签(分类)或连续值(回归)。

2. 公共部分(预处理与 GBDT 机制)

系统在模型训练前支持缺失处理、编码、缩放、特征构造、特征选择与降维等步骤(均在训练集上拟合,再作用于测试集或交叉验证折内,避免数据泄漏)。

2.1 标准化与归一化

Z-score 标准化: $$ z_{ij}=\frac{x_{ij}-\mu_j}{\sigma_j} \tag{2} $$

Min-Max 归一化: $$ z_{ij}=\frac{x_{ij}-\min x_j}{\max x_j-\min x_j+\varepsilon} \tag{3} $$

2.2 One-Hot 编码(类别型变量)

$$ x^{(k)}_{ij}= \begin{cases} 1,& x_{ij}=\text{cat}_k\\ 0,& \text{otherwise} \end{cases} \tag{4} $$

2.3 多项式特征(可选)

$$ \phi(x)=\{x_1^{a_1}x_2^{a_2}\cdots x_d^{a_d}\mid a_1+\cdots+a_d\le d_p\} \tag{5} $$

2.4 特征选择(方差阈值 / 互信息)

方差阈值: $$ \operatorname{Var}(x_j)=\frac{1}{n-1}\sum_{i=1}^{n}(x_{ij}-\mu_j)^2 \tag{6} $$

互信息: $$ I(X;Y)=\sum_{x\in X}\sum_{y\in Y}p(x,y)\log\frac{p(x,y)}{p(x)p(y)} \tag{7} $$

2.5 降维(PCA / KPCA)

协方差矩阵: $$ \Sigma=\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar{x})(x_i-\bar{x})^\top \tag{8} $$

主成分解释率: $$ \eta_k=\frac{\lambda_k}{\sum_{j=1}^{d}\lambda_j} \tag{9} $$

2.6 IQR 异常值截断(可选)

$$ \text{IQR}=Q_3-Q_1,\quad x\leftarrow \min(\max(x,Q_1-k\cdot\text{IQR}),\,Q_3+k\cdot\text{IQR}) \tag{10} $$

2.7 GBDT 加性模型与提升机制

GBDT 的模型为加性形式:

$$ F_M(x)=F_0(x)+\sum_{m=1}^{M}\nu\,h_m(x) \tag{11} $$

其中 \(h_m(x)\) 为第 \(m\) 轮拟合得到的回归树,\(\nu\in(0,1]\) 为学习率。

对任意损失函数 \(L(y,F(x))\),第 \(m\) 轮的伪残差定义为

$$ r_{im}=-\left[\frac{\partial L\big(y_i,F(x_i)\big)}{\partial F(x_i)}\right]_{F=F_{m-1}} \tag{12} $$

拟合回归树 \(h_m(x)\) 使其逼近 \(r_{im}\),并计算最优步长

$$ \rho_m=\arg\min_{\rho}\sum_{i=1}^{n}L\big(y_i,\,F_{m-1}(x_i)+\rho\,h_m(x_i)\big) \tag{13} $$

模型更新为

$$ F_m(x)=F_{m-1}(x)+\nu\,\rho_m\,h_m(x) \tag{14} $$

当使用子采样比例 \(0<\text{subsample}\le 1\) 时,可形成随机梯度提升(Stochastic Gradient Boosting),提升泛化能力。

2.8 特征重要性(基于损失下降)

若第 \(j\) 个特征在所有树的分裂中带来损失下降 \(\Delta I_{t,j}\),则其重要性可表示为

$$ I_j=\sum_{m=1}^{M}\sum_{t\in T_m}\Delta I_{t,j} \tag{15} $$

其中 \(T_m\) 为第 \(m\) 棵树的分裂节点集合。

2.9 符号说明

符号 含义
\(n\) 样本数量
\(d\) 特征维度
\(M\) 树的数量(n_estimators)
\(\nu\) 学习率(learning_rate)
\(h_m(x)\) 第 \(m\) 棵回归树
\(F_m(x)\) 第 \(m\) 轮加性模型
\(r_{im}\) 伪残差
\(\rho_m\) 步长
\(\hat{y}_i\) 预测值
\(TP,FP,TN,FN\) 混淆矩阵四要素
\(B\) 直方图分箱数(HistGradientBoosting)
\(w_i\) 样本权重
\(m^*\) 最佳迭代轮数
\(P\) 早停耐心值(patience)
\(c_j\) 单调约束方向(\(-1,0,+1\))
\(q\) 分位数水平(\(0<q<1\))
\(\phi_j\) SHAP 特征贡献值
\(f(x)\) 模型输出(GBDT 预测函数)
\(\varepsilon\) 极小正数(防止除零)

3. 分类版(GBDTClassifier)

3.1 概率输出与逻辑损失(Binary)

对二分类任务,模型输出经 Sigmoid 转为概率:

$$ P(y=1\mid x)=\sigma(F(x))=\frac{1}{1+e^{-F(x)}} \tag{16} $$

逻辑损失(对数似然)为

$$ L=-\sum_{i=1}^{n}\Big[y_i\log p_i+(1-y_i)\log(1-p_i)\Big] \tag{17} $$

对应的伪残差近似为

$$ r_{im}=y_i-p_i \tag{18} $$

3.2 多分类(Softmax / Multinomial Loss)

设类别数为 \(K\),模型输出对每一类给出一个得分函数 \(F_k(x)\)。Softmax 概率为

$$ P(y=k\mid x)=\frac{\exp(F_k(x))}{\sum_{j=1}^{K}\exp(F_j(x))} \tag{19} $$

多分类交叉熵损失为

$$ L=-\sum_{i=1}^{n}\sum_{k=1}^{K}\mathbb{I}(y_i=k)\log P(y_i=k\mid x_i) \tag{20} $$

其对第 \(k\) 类的伪残差为

$$ r_{im}^{(k)}=\mathbb{I}(y_i=k)-P(y_i=k\mid x_i) \tag{21} $$

GBDT 以“一类一棵树”的方式迭代拟合上述伪残差,即每轮为每个类别训练一棵回归树并更新 \(F_k(x)\)。

3.3 分类评价指标

准确率 $$ \text{Accuracy}=\frac{TP+TN}{TP+TN+FP+FN} \tag{22} $$

精确率 / 召回率 $$ \text{Precision}=\frac{TP}{TP+FP} \tag{23} $$

$$ \text{Recall}=\frac{TP}{TP+FN} \tag{24} $$

F1 值 $$ F1=\frac{2\cdot \text{Precision}\cdot \text{Recall}}{\text{Precision}+\text{Recall}} \tag{25} $$

ROC-AUC(曲线下面积) $$ \text{AUC}=\int_0^1 \text{TPR}(\text{FPR})\,d(\text{FPR}) \tag{26} $$

平均精度(PR-AUC / AP) $$ \text{AP}=\sum_k (R_k-R_{k-1})\,P_k \tag{27} $$

3.4 分类文字说明(可直接用于论文)

  • 使用 GBDT 进行分类建模,逐轮拟合负梯度(伪残差),构成加性树模型(式(11)–(14))。
  • 二分类输出采用 Sigmoid 概率(式(16)),并使用逻辑损失优化(式(17))。
  • 多分类采用 Softmax 交叉熵并对每一类拟合伪残差(式(19)–(21))。
  • 模型评估使用 Accuracy、Precision、Recall、F1 与 ROC/PR 指标(式(22)–(27))。
  • 提供混淆矩阵、ROC/PR 曲线、阈值曲线、学习曲线与特征重要性图用于可视化解释。

4. 回归版(GBDTRegressor)

4.1 平方损失与伪残差

回归任务通常采用平方损失:

$$ L=\frac{1}{2}\sum_{i=1}^{n}\big(y_i-F(x_i)\big)^2 \tag{28} $$

其伪残差为

$$ r_{im}=y_i-F_{m-1}(x_i) \tag{29} $$

4.2 回归评价指标

MAE $$ \text{MAE}=\frac{1}{n}\sum_{i=1}^{n}|y_i-\hat{y}_i| \tag{30} $$

MSE / RMSE $$ \text{MSE}=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2 \tag{31} $$

$$ \text{RMSE}=\sqrt{\text{MSE}} \tag{32} $$

决定系数 $$ R^2=1-\frac{\sum_{i=1}^{n}(y_i-\hat{y}_i)^2}{\sum_{i=1}^{n}(y_i-\bar{y})^2} \tag{33} $$

4.3 回归文字说明(可直接用于论文)

  • 使用 GBDT 回归模型,逐轮拟合残差,形成加性树预测函数(式(11)–(14))。
  • 采用平方损失进行优化(式(28)),并使用 MAE、RMSE 与 \(R^2\) 评估预测性能(式(30)–(33))。
  • 输出预测–真实散点图、残差直方图、残差–拟合图与 Q-Q 图用于诊断残差分布与模型稳定性。

5. 交叉验证与学习曲线(可选)

交叉验证用于评估模型的泛化稳定性。若采用 \(K\) 折交叉验证,可计算每折的性能指标并汇总。学习曲线通过不同训练集规模下的训练/验证得分,判断欠拟合或过拟合趋势。

6. 结果解释与论文写作建议

论文中建议按“表—图—解释”顺序组织结果:

  1. 参数与指标表:展示主要超参数与分类/回归指标;
  2. 交叉验证结果:说明模型在不同折上的稳定性;
  3. 图表:分类给出混淆矩阵、ROC/PR、阈值曲线;回归给出散点图与残差诊断图;
  4. 特征重要性解释:分析影响输出的关键特征。

7. 实现说明与注意事项

就本项目当前可运行版本而言,GBDT 的真实核心并不在通用名 calculator.py,而在:

  • 具体的算法/梯度提升树(GBDT)/core/critic_calculator.py
  • 具体的算法/梯度提升树(GBDT)/ui/results_widget.py
  • 具体的算法/梯度提升树(GBDT)/ui/feature_engineering_panel.py

这意味着该模块不是“只训练一个 GBDT 模型”,而是“特征工程 + GBDT 训练/验证 + 图表导出 + repro”的完整工程页面。

7.1 当前结果目录与文件结构

core/critic_calculator.py::_prepare_output() 会把输出统一写到:

results/梯度提升树(GBDT)分析结果_<YYYYMMDD_HHMMSS>/

主结果文件名固定为:

梯度提升树(GBDT)分析结果_<时间戳>.xlsx

结果页 ui/results_widget.py 还会在同目录下导出:

  • repro_template_<时间戳>.py
  • 原始输入副本,例如 gbdt_window1_input.csv

7.2 当前 Excel 工作簿的真实内容

根据 core/critic_calculator.py::_export_excel(),当前 Excel 结果并不是只输出一个“指标汇总表”,而是按任务类型和可用结果写入多个工作表。核心页签包括:

  • 概要
  • 训练集
  • 测试集
  • 预测
  • CV汇总
  • 混淆矩阵
  • 特征重要性
  • 图表清单
  • 参数

因此,论文撰写时不应把该模块误写成“只给出 Accuracy 或 RMSE”。当前实现会把数据划分、预测明细、交叉验证摘要和图表索引一起导出。

7.3 当前图表导出的真实口径

分类任务下,当前代码会按实际可用结果导出:

  • confusion_matrix.png
  • roc.png
  • pr.png
  • threshold_f1.png
  • threshold_tpr_fpr.png
  • feature_importances.png
  • learning_curve.png

回归任务下,当前代码会导出:

  • pred_vs_true.png
  • true_vs_pred_line.png
  • residuals_hist.png
  • residuals_qq.png
  • residuals_vs_pred.png
  • feature_importances.png
  • learning_curve.png

图表清单 工作表会登记这些图表路径;若环境缺少 xlsxwriter,程序仍会保留 Excel 主结果,并以图表索引表代替嵌图展示。

7.4 当前 repro 链路的真实行为

结果页点击“导出复现代码”后,ui/results_widget.py 会生成 repro_template_<时间戳>.py。该脚本会:

  1. 记录本次任务类型、目标列和参数;
  2. 复用本次 preprocess 配置;
  3. 重新调用 GBDTCriticCalculator.run_analysis()
  4. 输出新的结果文件并在标准输出中打印 OKFAIL

因此,当前项目已经形成“原始输入副本 + 参数快照 + 结果工作簿 + 图表 + 可执行 repro 脚本”的完整复现实验链。

7.5 当前项目实现需要特别说明的工程口径

  • GBDT 适用于中小规模表格数据,具备较强的非线性拟合能力;
  • 学习率与树数量需配合调整,过大易过拟合,过小训练时间增加;
  • 若数据量很大可启用 HistGradientBoosting(直方图加速版);
  • 对类别不平衡问题,可考虑样本权重或阈值调整策略;
  • 论文若要与程序输出保持一致,应把特征工程、交叉验证与图表导出也写进方法实现部分,而不是只写 GBDT 主公式。

8. 扩展机制(HistGradientBoosting / 早停 / 样本权重)

8.1 直方图加速(HistGradientBoosting)

直方图梯度提升通过将连续特征分箱,从而以更低的计算复杂度近似最优分裂。设第 \(j\) 个特征的分箱边界为 \(q_{j,0}<q_{j,1}<\cdots<q_{j,B}\),则样本 \(x_{ij}\) 的箱编号可写为

$$ b_{ij}=\max\{k \mid q_{j,k}\le x_{ij}\},\quad k\in\{0,\ldots,B-1\} \tag{34} $$

随后在各箱内累计梯度与二阶梯度(或残差统计量),以近似最优划分点。

8.2 早停机制(Early Stopping)

在训练过程中用验证集损失 \(L_{\text{val}}(m)\) 监控泛化性能,最佳轮数可定义为

$$ m^*=\arg\min_{1\le m\le M} L_{\text{val}}(m) \tag{35} $$

若连续 \(P\) 轮验证损失没有改进,则停止训练:

$$ L_{\text{val}}(m) > L_{\text{val}}(m^*),\quad \text{for } P \text{ consecutive rounds} \tag{36} $$

该机制能有效缓解过拟合,并缩短训练时间。

8.3 样本权重(Class/Instance Weight)

当样本重要性不同或类别不均衡时,可引入样本权重 \(w_i\) 加权损失:

$$ L_w=\frac{\sum_{i=1}^{n} w_i\,L\big(y_i,F(x_i)\big)}{\sum_{i=1}^{n} w_i} \tag{37} $$

对应的加权伪残差为

$$ r_{im}=-w_i\left[\frac{\partial L\big(y_i,F(x_i)\big)}{\partial F(x_i)}\right]_{F=F_{m-1}} \tag{38} $$

在分类任务中,常用“类别权重”按类别频率的倒数或比例进行设置,以缓解类别不平衡问题。

8.4 单调约束(Monotonic Constraints)

当业务先验要求模型输出随某些特征单调变化时,可设置单调约束。设第 \(j\) 个特征的约束方向为

$$ c_j\in\{-1,0,+1\} \tag{39} $$

其中 \(+1\) 表示单调递增,\(-1\) 表示单调递减,\(0\) 表示无约束。单调约束在树的分裂与叶子值拟合时施加限制,以保证预测函数对该特征的整体单调性。

8.5 分位数损失(Quantile / Pinball Loss)

当需要预测条件分位数时,可采用分位数损失(Pinball Loss):

$$ L_q(y,\hat{y})= \begin{cases} q\,(y-\hat{y}), & y\ge \hat{y} \\ (1-q)\,(\hat{y}-y), & y<\hat{y} \end{cases} \tag{40} $$

其中 \(q\in(0,1)\) 表示分位数水平。通过分别训练多个 \(q\)(如 0.1/0.5/0.9)可得到预测区间。

8.6 SHAP 解释(特征贡献分解)

SHAP 值用于解释单个样本的特征贡献,满足加性分解:

$$ f(x)=\mathbb{E}[f(x)]+\sum_{j=1}^{d}\phi_j \tag{41} $$

其中 \(\phi_j\) 为第 \(j\) 个特征对预测的贡献值。TreeSHAP 可高效计算树模型的 SHAP 值,支持全局重要性(\(|\phi_j|\) 均值)与局部解释(单样本贡献)。

9. 单篇终审补充

9.1 图题与表题对齐建议

  • 概要 表可写为:表X GBDT 结果概要表。
  • 训练集 表可写为:表X GBDT 训练集数据表。
  • 测试集 表可写为:表X GBDT 测试集数据表。
  • 预测 表可写为:表X GBDT 逐样本预测结果表。
  • CV汇总 表可写为:表X GBDT 交叉验证汇总表。
  • 混淆矩阵 表可写为:表X GBDT 混淆矩阵表。
  • 特征重要性 表可写为:表X GBDT 特征重要性表。
  • 图表清单 表可写为:表X GBDT 图表索引表。
  • 参数 表可写为:表X GBDT 参数设置表。

9.2 终审说明

  • 当前最适合作为终审证据的代表性目录可采用 具体的算法/梯度提升树(GBDT)/results/梯度提升树(GBDT)分析结果_20260329_163727。该目录同时具备结果簿、输入快照和 repro 脚本。
  • 真实工作表为 概要/训练集/测试集/预测/CV汇总/混淆矩阵/特征重要性/图表清单/参数。这说明当前代表性目录的结果簿比文档自述更精简,没有单独的分类报告或 ROC/PR sheet,终审说明必须以真实结果簿为准。
  • 该目录除主结果簿、输入快照和 repro 脚本外,还存在 charts/ 子目录,内含 confusion_matrix.pngfeature_importances.pngroc.pngpr.pngthreshold_f1.pngthreshold_tpr_fpr.png 等实体图文件。因此,这一条终审证据既能支撑“结果簿 + repro 链路”,也能支撑“分类图集引用”。
  • 当前复现脚本为 repro_template_20260329_163727.py,采用脚本同目录输入快照 SRC_FILE = 'gbdt_window1_input.csv',不是 repro_inputs/...。因此这篇文档应明确写成“脚本同目录 CSV 快照复现”。
  • 如果后续要把 GBDT 做成更强的论文插图型终稿,建议再补一套实际落地了 ROC/PR 或残差图的结果目录;当前这版先以真实 xlsx 与 repro 证据为主。

9.3 全量强化补充

  • 本轮按真实磁盘再次核对,算法目录为 具体的算法/梯度提升树(GBDT),代表性结果目录为 具体的算法/梯度提升树(GBDT)/results/梯度提升树(GBDT)分析结果_20260329_163727
  • 该目录主工作簿为 梯度提升树(GBDT)分析结果_20260329_163727.xlsx,真实工作表为 概要训练集测试集预测CV汇总混淆矩阵特征重要性图表清单参数
  • 当前目录根部除主工作簿外,还包含输入快照 gbdt_window1_input.csvrepro_template_20260329_163727.py;图文件位于 charts/ 子目录,实际文件为 confusion_matrix.pngfeature_importances.pngroc.pngpr.pngthreshold_f1.pngthreshold_tpr_fpr.png
  • 当前 repro 口径不是 repro_inputs/...,而是脚本同目录 CSV 快照:repro_template_20260329_163727.py 中明确写有 SRC_FILE = 'gbdt_window1_input.csv'。因此这篇应归类为“脚本同目录快照复现”案例。
  • 这份结果工作簿没有单独的 分类报告ROC数据PR数据 sheet,相关信息主要通过 图表清单charts/ 子目录承载。论文中若要引用 ROC/PR,应对应实体 png,而不是声称工作簿里有专门数据表。
  • 旧文档里关于“没有实体图文件”的描述已经不再符合当前磁盘事实,后续应统一以 charts/ 子目录中的真实图集为准。

9.4 软件实现核查补充(2026-07)

  • 当前实现以 core/critic_calculator.pycore/fe_pipeline.py 为核心,支持分类/回归两条分支,并可选 HistGradientBoosting;文档里的 GBDT 理论可以保留,但结果解释必须落回实际导出的表和图。
  • 当前最新结果目录 results/梯度提升树(GBDT)分析结果_20260411_200543_285196 只有主工作簿和 charts/ 子目录,图主要是 charts/feature_importances.pngcharts/learning_curve.pngcharts/pred_vs_true.pngcharts/residuals_hist.pngcharts/residuals_qq.pngcharts/residuals_vs_pred.pngcharts/true_vs_pred_line.png
  • 当前这一版结果更偏回归证据集,不要把旧目录里的 混淆矩阵 写进最新目录。
  • 复现脚本出现在较早时间戳目录中,例如 repro_template_20260411_200349.pyrepro_template_20260411_200411.py;文中写复现时要按对应时间戳目录描述,不要把最新目录写成自带 repro。
  • 结果簿当前以 概要训练集测试集预测CV汇总特征重要性图表清单参数 为主,论文写作应按这一组实际工作表引用。