文档
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(3→6→9) 和 min_child_weight(1→3→5)
Step 2: 调 subsample(0.6→0.8→1.0) 和 colsample_bytree(0.6→0.8→1.0)
Step 3: 调 gamma(0→0.1→0.5)
Step 4: 降低 lr(0.1 → 0.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 | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
思考题
- 为什么 XGBoost 使用二阶泰勒展开而 GBDT 只用一阶?二阶带来了什么?
gamma=0.5和min_child_weight=5都抑制树复杂度,有何不同?- 如果训练集 loss 远低于验证集 loss,应优先调哪个参数?