正在加载中...

展开本页目录
算法教程CatBoost

CatBoost

No.028 · 在线教程

CatBoost(Categorical Boosting)是一种面向类别特征的梯度提升树(GBDT)算法。其核心特性包括:

CatBoost 算法

1. 方法概述

CatBoost(Categorical Boosting)是一种面向类别特征的梯度提升树(GBDT)算法。其核心特性包括:

  1. 原生类别特征处理(Target Statistics + Ordered Boosting)
  2. 对称/同层分裂的 Oblivious Tree(训练稳定、推理快)
  3. 避免目标泄漏的有序统计(Ordered TS)

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

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

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

2. 公共部分(特征工程与类别处理)

系统支持缺失处理、类别编码、缩放、特征构造/选择与降维等步骤;其中 CatBoost 可直接处理类别特征,无需 One-Hot。

2.1 Z-score 标准化

$$ z_{ij}=\frac{x_{ij}-\mu_j}{\sigma_j} \tag{2} $$

2.2 Min-Max 归一化

$$ z_{ij}=\frac{x_{ij}-\min x_j}{\max x_j-\min x_j+\varepsilon} \tag{3} $$

2.3 One-Hot 编码(可选)

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

2.4 类别特征的目标统计(Target Statistics)

对类别取值 \(c\),引入先验均值 \(\bar{y}\) 与平滑参数 \(a>0\),在有序采样下计算

$$ \text{TS}_i(c)= \frac{\sum_{j:\,\pi(j)<\pi(i)} y_j\cdot \mathbf{1}(x_j=c)+a\bar{y}} {\sum_{j:\,\pi(j)<\pi(i)} \mathbf{1}(x_j=c)+a} \tag{5} $$

其中 \(\pi\) 为样本随机排列,\(\mathbf{1}(\cdot)\) 为指示函数。该设计可减少目标泄漏并稳定类别统计。

3. CatBoost 模型结构与训练

3.1 加性模型(梯度提升)

CatBoost 采用加性模型迭代更新:

$$ F^{(0)}(x)=\arg\min_{c}\sum_{i=1}^{n}L(y_i,c) \tag{6} $$

$$ F^{(t)}(x)=F^{(t-1)}(x)+\eta\,h_t(x),\quad t=1,2,\ldots,T \tag{7} $$

其中 \(h_t\) 为第 \(t\) 棵树,\(\eta\) 为学习率。

3.2 Oblivious Tree(对称树)

每一层使用同一分裂特征与阈值,形成对称树:

$$ h_t(x)=\sum_{\ell=1}^{2^D} v_\ell\cdot \mathbf{1}(x\in R_\ell) \tag{8} $$

其中 \(D\) 为树深度,\(R_\ell\) 为叶节点区域。

3.3 常用损失函数

二分类 Logloss $$ L(y,p)=-\big[y\ln p+(1-y)\ln(1-p)\big],\quad p=\sigma(F(x))=\frac{1}{1+e^{-F(x)}} \tag{9} $$

回归平方损失(RMSE/MSE) $$ L(y,F(x))=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2 \tag{10} $$

4. Ordered Boosting(有序提升)

CatBoost 使用有序提升以降低目标泄漏。对样本随机排列 \(\pi\),第 \(t\) 轮拟合仅使用当前样本之前的子集。

设第 \(t\) 轮模型为 \(F^{(t)}\),则对第 \(i\) 个样本的有序梯度(或残差)可表示为:

$$ g_i^{(t)}=\left.\frac{\partial L\big(y_i, F^{(t-1)}(x_i)\big)}{\partial F}\right| _{F=F^{(t-1)}_{\pi(<i)}(x_i)} \tag{11} $$

为进一步降低方差,可对多次随机排列取平均:

$$ \bar{g}_i^{(t)}=\frac{1}{S}\sum_{s=1}^{S} g_{i,s}^{(t)} \tag{12} $$

其中 \(F^{(t-1)}_{\pi(<i)}\) 表示仅使用排列中 \(\pi(j)<\pi(i)\) 的样本训练得到的模型。
有序提升与有序目标统计(式(5))结合,可显著降低因类别统计或梯度估计产生的泄漏偏差。

5. 分类版(CatBoostClassifier)

5.1 决策函数

$$ \hat{y}= \begin{cases} 1,& p\ge 0.5\\ 0,& p<0.5 \end{cases} \tag{13} $$

5.2 多分类 Softmax(扩展)

当类别数为 \(K\) 时,CatBoost 使用 Softmax 生成类别概率:

$$ p_k(x)=\frac{e^{F_k(x)}}{\sum_{j=1}^{K}e^{F_j(x)}},\quad k=1,\ldots,K \tag{14} $$

预测类别为 $$ \hat{y}=\arg\max_k p_k(x) \tag{15} $$

多分类交叉熵损失:

$$ L= -\frac{1}{n}\sum_{i=1}^{n}\sum_{k=1}^{K} y_{ik}\ln p_k(x_i) \tag{16} $$

5.3 分类评价指标

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

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

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

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

ROC 曲线与 AUC $$ \text{TPR}=\frac{TP}{TP+FN},\quad \text{FPR}=\frac{FP}{FP+TN} \tag{21} $$

$$ \text{AUC}=\int_0^1 \text{TPR}(\text{FPR})\,d(\text{FPR}) \tag{22} $$

5.4 分类文字说明(论文可用)

  • 使用 CatBoostClassifier 训练模型,预测得到 \(\hat{y}\) 与类别概率 \(p\)。
  • 输出 Accuracy、Precision、Recall、F1 与 AUC 等指标(式(17)–(22))。
  • 通过混淆矩阵、ROC/PR、阈值–F1、阈值–TPR/FPR 进行可视化分析。

6. 回归版(CatBoostRegressor)

6.1 回归预测函数

$$ \hat{y}=F(x) \tag{23} $$

6.2 回归评价指标

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

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

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

6.3 回归文字说明(论文可用)

  • 使用 CatBoostRegressor 训练回归模型,输出预测值 \(\hat{y}\)。
  • 评价指标包括 MAE、RMSE、\(R^2\)(式(24)–(26))。
  • 通过预测-真实散点、残差直方图、残差-拟合图与 Q-Q 图检验拟合与误差分布。

7. 训练与验证(公共)

7.1 训练/测试划分

若设置测试集比例为 \(t\in(0,1)\),则 $$ n_{\text{test}}=\lceil n\cdot t\rceil,\quad n_{\text{train}}=n-n_{\text{test}} \tag{27} $$

7.2 \(K\)-折交叉验证

对 \(K\) 折的评价指标取均值: $$ \bar{M}=\frac{1}{K}\sum_{k=1}^{K}M_k \tag{28} $$

8. 符号说明

符号 含义
\(n\) 样本数量
\(d\) 特征维度
\(K\) 类别数量
\(x_i\) 第 \(i\) 个样本特征
\(y_i\) 第 \(i\) 个样本标签/真实值
\(y_{ik}\) 样本 \(i\) 在类别 \(k\) 上的指示标签
\(p_k(x)\) 多分类 Softmax 输出概率
\(F^{(t)}(x)\) 第 \(t\) 轮加性模型输出
\(\eta\) 学习率
\(h_t(x)\) 第 \(t\) 棵树的输出
\(S\) 有序排列次数(有序提升平均)
\(TP,FP,TN,FN\) 分类混淆矩阵四要素
\(\hat{y}\) 预测值

9. 结果输出说明

系统输出(Excel + 图表)包括:原始数据、处理后数据、训练/测试集、指标、预测、参数、参数与配置(分组)、交叉验证汇总、报告摘要,以及图表清单与可解释性结果(特征重要性、SHAP 图)。

论文写作建议按以下顺序组织:

  1. 模型与参数说明(树深度、学习率、迭代次数、类别特征处理方式);
  2. 核心指标表(分类:Accuracy/Precision/Recall/F1/AUC;回归:MAE/RMSE/R²);
  3. 可视化图表(分类:混淆矩阵、ROC/PR;回归:预测-真实、残差分析);
  4. 交叉验证稳定性(各折指标与均值对比)。

若存在数值编码但应视为类别的列,应显式加入 cat_features 白名单,以避免误作为数值特征处理。

10. 与代码实现的对应关系

CatBoost 程序的核心实现位于 具体的算法/CatBoost/core/critic_calculator.py。从代码看,它除了常规训练与评估外,还专门处理了 SHAP、学习曲线兼容性以及独立预测脚本导出等 CatBoost 特有问题。

实现上应在文档中说明:

  1. CatBoost 结果目录包含模型与推理模板
    程序会导出模型文件、模型元数据以及 predict_template.py。该模板会按 feature_columns 对输入列进行对齐,并生成列对齐报告,因此适合后续部署或交付。

  2. SHAP 并非纸面功能,而是代码中的真实可选输出
    当启用 shap_enable 时,程序会导出 SHAP_重要性 表、shap_summary_bar 图;若运行环境安装了 shap 包,还会继续导出 shap_beeswarm 蜂群图。

  3. 学习曲线存在兼容性保护
    由于 CatBoost 与 sklearn 工具链的兼容性问题,程序会先检查 tags 能力;若条件不足,则自动跳过学习曲线并写明原因,而不是直接报错中断。

  4. Excel 工作表相对完整
    常见结果包括:原始数据处理后数据训练集测试集指标预测混淆矩阵分类报告特征重要性SHAP_重要性学习曲线图表清单参数CV汇总CV折i_预测验证集参数与配置(分组)报告摘要

  5. CatBoost 的解释结果应和普通树模型区分
    程序同时支持基于内置特征重要性和基于 SHAP 的两套解释结果,因此论文中需区分“分裂重要性”和“SHAP 平均绝对贡献”两种概念。

11. 论文写作模板

方法描述模板:
“本文采用 CatBoost 模型进行监督学习分析。该模型可直接处理类别特征,并通过有序统计与有序提升降低目标泄漏风险。建模时在训练集上完成参数学习,并在测试集上输出预测结果、整体指标及可解释性结果;同时结合交叉验证与学习曲线对模型稳健性进行辅助分析。”

结果描述模板:
“程序结果目录除常规 Excel 和图表外,还包含 CatBoost 模型文件、独立预测模板脚本以及 SHAP 解释结果。Excel 中提供了处理后数据、逐样本预测、CV 汇总、参数配置、特征重要性与 SHAP 重要性等内容,因此论文中既可以报告模型精度,也可以进一步展示特征贡献排序与解释图,增强结果部分的可解释性。”

12. 单篇终审补充

12.1 图题与表题对齐建议

  • 原始数据 表可写为:表X CatBoost 原始数据表。
  • 处理后数据 表可写为:表X CatBoost 处理后数据表。
  • 训练集 表可写为:表X CatBoost 训练集数据表。
  • 测试集 表可写为:表X CatBoost 测试集数据表。
  • 指标 表可写为:表X CatBoost 性能指标表。
  • 预测 表可写为:表X CatBoost 逐样本预测结果表。
  • 混淆矩阵 表可写为:表X CatBoost 混淆矩阵表。
  • 分类报告 表可写为:表X CatBoost 分类报告表。
  • 特征重要性 表可写为:表X CatBoost 特征重要性表。
  • 图表清单 表可写为:表X CatBoost 图表索引表。
  • 参数 表可写为:表X CatBoost 参数设置表。
  • CV汇总 表可写为:表X CatBoost 交叉验证汇总表。
  • 参数与配置(分组) 表可写为:表X CatBoost 分组参数配置表。
  • 报告摘要 表可写为:表X CatBoost 结果摘要表。
  • feature_importance_topN.png 建议写为:图X CatBoost Top-N 特征重要性图。
  • confusion_matrix.png 建议写为:图X CatBoost 混淆矩阵图。
  • roc.png 建议写为:图X CatBoost ROC 曲线图。
  • pr.png 建议写为:图X CatBoost PR 曲线图。
  • threshold_f1.png 建议写为:图X CatBoost 阈值-F1 曲线图。
  • threshold_tpr_fpr.png 建议写为:图X CatBoost 阈值-TPR/FPR 曲线图。
  • calibration.png 建议写为:图X CatBoost 校准曲线图。
  • class_distribution_triptych.png 建议写为:图X CatBoost 类别分布图。

12.2 终审说明

  • 当前最适合作为终审证据的代表性目录可采用 具体的算法/CatBoost/results/CatBoost分析结果_20260329_163807。该目录同时具备简版结果簿、全量结果簿、实体图和 repro 脚本。
  • 简版结果簿 CatBoost分析结果_20260329_163807.xlsx 的真实工作表为 原始数据/处理后数据/训练集/测试集/指标/预测/混淆矩阵/分类报告/特征重要性/图表清单/参数/CV汇总/参数与配置(分组)/报告摘要;全量结果簿 CatBoost分析结果_20260329_163807_full.xlsx 的真实工作表为 总览-说明/参数配置/原始数据/数据清洗与描述/步骤-confusion_matrix/步骤-classes/步骤-classification_repor/步骤-feature_importance/步骤-cv/最终结果/混淆矩阵/重要性与可解释性/图表索引/图像预览/复现环境与版本
  • 因此,这篇在论文终稿中应区分“正文采用简版结果簿”与“附录采用 full 结果簿”。前者适合直接展示指标与预测,后者更适合完整留档与方法复核。
  • 当前真实图文件稳定为 feature_importance_topN.pngconfusion_matrix.pngroc.pngpr.pngthreshold_f1.pngthreshold_tpr_fpr.pngcalibration.pngclass_distribution_triptych.png,并附带 class_distribution_full.png。正文图题一般不需要引用 full 分布图。
  • 当前复现脚本为 repro_template_20260329_163807.py,采用 SRC_FILE = 'repro_inputs/sample_classification.xlsx'。因此 CatBoost 这篇同样可以把 repro_inputs/... 作为标准复现输入路径写入附录。

12.3 全量强化补充

  • 本轮按真实磁盘再次核对,算法目录为 具体的算法/CatBoost,代表性结果目录为 具体的算法/CatBoost/results/CatBoost分析结果_20260329_163807
  • 该目录实际包含两份结果工作簿:简版 CatBoost分析结果_20260329_163807.xlsx 与全量版 CatBoost分析结果_20260329_163807_full.xlsx。简版工作表为 原始数据处理后数据训练集测试集指标预测混淆矩阵分类报告特征重要性图表清单参数CV汇总参数与配置(分组)报告摘要;全量版工作表为 总览-说明参数配置原始数据数据清洗与描述步骤-confusion_matrix步骤-classes步骤-classification_repor步骤-feature_importance步骤-cv最终结果混淆矩阵重要性与可解释性图表索引图像预览复现环境与版本
  • 当前实体图文件全部位于结果目录根部,而不是单独 plots/ 子目录,实际文件为 feature_importance_topN.pngconfusion_matrix.pngroc.pngpr.pngthreshold_f1.pngthreshold_tpr_fpr.pngcalibration.pngclass_distribution_triptych.pngclass_distribution_full.png
  • 当前 repro 口径是标准 repro_inputs/...repro_template_20260329_163807.py 中明确写有 SRC_FILE = 'repro_inputs/sample_classification.xlsx',且该输入副本在 repro_inputs/ 中实际存在。
  • 这篇最适合的论文写法仍然是“正文使用简版结果簿,附录使用 full 结果簿”,但现在可以进一步明确:两类图证都直接来自同一目录根部,不需要再去其他子目录检索。
  • 当前代表性目录未见单独模型文件或 predict_template.py,因此本轮强化口径应继续锚定真实工作簿、实体图和 repro 脚本,不把其他运行批次可能存在的附加文件写成这一目录既有产物。

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

  • 当前实现保留了 CatBoost 与 sklearn 的兼容补丁,__sklearn_tags__ 相关适配是实测中的必要环节;文档里可以说明这属于工程兼容,不是算法理论的一部分。
  • 学习曲线属于条件性输出,当前目录里可能会按模型能力或环境自动跳过,因此正文不要把学习曲线写成必然存在的结果图。
  • 结果目录同时存在简版与全量版结果簿,适合分别用于正文展示和附录留档;复现脚本使用 repro_inputs/sample_classification.xlsx 的标准输入口径。
  • 文档中若讨论类别重要性、交叉验证或参数配置,建议明确它们来自导出结果表,而不是人工额外整理的派生内容。