XGBoost 调参心法与数学原理

知识库
知识库文档
/tech-stacks/xgboost/tutorial/XGBoost 调参心法与数学原理.md

文档

XGBoost 入门教程:调参心法与数学原理

1. XGBoost 是什么?

XGBoost 是基于 梯度提升决策树 (GBDT) 的并行优化实现。核心思想:串行训练多棵弱决策树,每棵新树拟合前一步的残差。

$$ \hat{y}_i^{(t)} = \hat{y}_i^{(t-1)} + \eta \cdot f_t(x_i) $$

其中 $f_t$ 是第 t 棵树,$\eta$ 是学习率。

2. 相比传统 GBDT 的改进

改进 说明
二阶泰勒展开 使用 Hessian 矩阵,收敛更精确
正则化 L1 + L2 惩罚叶子权重,防止过拟合
列采样 每棵树随机选特征子集(类似 Random Forest)
缺失值处理 自动学习缺失值走左还是右子节点
并行化 特征预排序 + Block 结构,并行找最佳分裂点

3. 三大核心参数

树结构参数

max_depth=6          # 树深度(越大越复杂 → 过拟合风险 ↑)
min_child_weight=1   # 叶子最小样本权重和(越大越保守)
gamma=0              # 分裂所需最小损失减少(越大越保守)

采样参数

subsample=1.0        # 每棵树随机采样的样本比例(0.8 常用)
colsample_bytree=1.0 # 每棵树随机采样的特征比例(0.8 常用)
colsample_bylevel=1.0# 每层分裂时的特征采样

学习参数

learning_rate=0.3    # 学习率(越小需要越多树,0.01-0.1 常用)
n_estimators=100     # 树数量(配合 early_stopping)

4. 调参实战流程

Step 1: 固定 lr=0.1, n_est=1000 + early_stopping=50
         → 调 max_depth(369) 和 min_child_weight(135)
Step 2: 调 subsample(0.60.81.0) 和 colsample_bytree(0.60.81.0)
Step 3: 调 gamma(00.10.5)
Step 4: 降低 lr(0.10.01),增加 n_est,再次 early_stopping

5. 关键参数详解

scale_pos_weight:处理样本不平衡

# 二分类正负比 1:9
scale_pos_weight = 9   # sum(negative) / sum(positive)

objective 选择

任务 objective
二分类 binary:logistic
多分类 multi:softmax (需设 num_class)
回归 reg:squarederror
排序 rank:pairwise

6. 特征重要性类型

  • weight:特征被用于分裂的次数
  • gain:特征分裂带来的平均损失减少(⭐推荐)
  • cover:特征分裂覆盖的样本比例

7. XGBoost vs LightGBM vs CatBoost

维度 XGBoost LightGBM CatBoost
树生长 Level-wise Leaf-wise Symmetric
类别特征 需编码 需编码 原生支持
速度 中等 最快 较慢
小数据 ⭐⭐⭐ ⭐⭐ ⭐⭐
GPU ⭐⭐⭐ ⭐⭐⭐ ⭐⭐

思考题

  1. 为什么 XGBoost 使用二阶泰勒展开而 GBDT 只用一阶?二阶带来了什么?
  2. gamma=0.5min_child_weight=5 都抑制树复杂度,有何不同?
  3. 如果训练集 loss 远低于验证集 loss,应优先调哪个参数?

信息

路径
/tech-stacks/xgboost/tutorial/XGBoost 调参心法与数学原理.md
更新时间
2026/5/31