XGBoost 参数详解(中文版)
原文地址:https://xgboost.readthedocs.io/en/stable/parameter.html
目录
1. 参数配置方式
XGBoost 支持多种参数传入方式:
| 接口 | 配置方式 | 示例 |
|---|---|---|
xgboost.train |
字典 param |
param = {'max_depth': 6, 'eta': 0.1} |
XGBClassifier / XGBRegressor |
构造函数参数 | XGBClassifier(max_depth=6, eta=0.1) |
| 命令行 | key=value |
xgboost config.conf eta=0.1 |
| 配置文件 | .conf 文件 |
eta = 0.1 |
推荐:使用 Python API 时,优先使用
XGBClassifier的 scikit-learn 接口,便于与GridSearchCV、Optuna等集成。
2. 参数总览表格
| 参数 | 别名 | 类型 | 默认值 | 适用提升器 | 说明 |
|---|---|---|---|---|---|
| 通用参数 | |||||
booster |
- | str | gbtree |
全部 | 提升器类型 |
verbosity |
silent(弃用) |
int | 1 |
全部 | 日志级别 |
validate_parameters |
- | bool | False |
全部 | 参数合法性检查 |
nthread |
- | int | None |
全部 | 并行线程数 |
disable_default_eval_metric |
- | int | 0 |
全部 | 禁用默认评估指标 |
| 树提升器参数 | |||||
eta |
learning_rate |
float | 0.3 |
gbtree, dart | 学习率 |
gamma |
min_split_loss |
float | 0 |
gbtree, dart | 最小分割损失 |
max_depth |
- | int | 6 |
gbtree, dart | 树最大深度 |
min_child_weight |
- | float | 1 |
gbtree, dart | 子节点最小权重和 |
max_delta_step |
- | float | 0 |
gbtree, dart | 权重最大步长 |
subsample |
- | float | 1 |
gbtree, dart | 样本采样比例 |
sampling_method |
- | str | uniform |
gbtree, dart | 采样方式 |
colsample_bytree |
- | float | 1 |
gbtree, dart | 特征列采样(按树) |
colsample_bylevel |
- | float | 1 |
gbtree, dart | 特征列采样(按层) |
colsample_bynode |
- | float | 1 |
gbtree, dart | 特征列采样(按节点) |
lambda |
reg_lambda |
float | 1 |
全部 | L2 正则化 |
alpha |
reg_alpha |
float | 0 |
全部 | L1 正则化 |
tree_method |
- | str | auto |
gbtree, dart | 树构建算法 |
sketch_eps |
- | float | 0.03 |
approx | 近似误差 |
scale_pos_weight |
- | float | 1 |
gbtree, dart | 正负样本权重比 |
grow_policy |
- | str | depthwise |
hist | 树生长策略 |
max_leaves |
- | int | 0 |
lossguide | 最大叶子数 |
max_bin |
- | int | 256 |
hist, gpu_hist | 直方图 bin 数 |
predictor |
- | str | cpu_predictor |
全部 | 预测器类型 |
num_parallel_tree |
- | int | 1 |
gbtree, dart | 每轮并行树数(随机森林) |
| 线性提升器参数 | |||||
updater |
- | str | shotgun |
gblinear | 坐标下降策略 |
| DART 提升器参数 | |||||
sample_type |
- | str | uniform |
dart | dropout 采样类型 |
normalize_type |
- | str | tree |
dart | 归一化方式 |
rate_drop |
- | float | 0.0 |
dart | dropout 比例 |
one_drop |
- | int | 0 |
dart | 强制至少 dropout 一棵树 |
skip_drop |
- | float | 0.0 |
dart | 跳过 dropout 概率 |
| 学习任务参数 | |||||
objective |
- | str | reg:squarederror |
全部 | 目标函数 |
base_score |
- | float | 0.5 |
全部 | 初始预测分数 |
eval_metric |
- | str/list | 自动 | 全部 | 评估指标 |
seed |
random_state(推荐) |
int | 0 |
全部 | 随机种子(弃用) |
3. 详细参数说明
3.1 通用参数
| 参数 | 详细说明 |
|---|---|
booster |
选择提升器类型: • gbtree:树模型(默认,推荐)• gblinear:线性模型(高维稀疏数据)• dart:带 dropout 的树模型(防过拟合) |
verbosity |
日志级别: • 0:静默• 1:警告(默认)• 2:信息• 3:调试(打印每棵树)注意:旧版 silent=1 表示静默,已弃用 |
validate_parameters |
是否检查参数合法性。scikit-learn 接口默认 True。建议:生产环境开启,避免拼写错误 |
nthread |
并行线程数。None 使用所有可用核心。最佳实践:显式设置(如 nthread=8),保证跨机器结果一致 |
disable_default_eval_metric |
1 表示不使用默认指标(如 RMSE)。适用于自定义指标 |
3.2 树提升器参数
学习率与正则化
| 参数 | 说明 | 调参建议 |
|---|---|---|
eta (learning_rate) |
每次提升的步长收缩。范围 [0, 1] |
初始 0.1~0.3,后期可降至 0.01 + 增加 num_boost_round |
gamma (min_split_loss) |
分割所需最小损失减少。越大越保守 | 从 0 开始,过拟合时增大至 0.1~1 |
lambda (reg_lambda) |
L2 正则化(权重平方和) | 默认 1,过拟合时增大至 5~100 |
alpha (reg_alpha) |
L1 正则化(权重绝对值和) | 特征冗余时设 0.1~1,促进稀疏 |
树结构控制
| 参数 | 说明 | 典型值 |
|---|---|---|
max_depth |
树最大深度。0 表示无限制 |
3~10,从 6 开始 |
min_child_weight |
子节点权重和最小值 | 1~10,大数据集可设 5 |
max_delta_step |
权重最大步长。不平衡分类时设 1~10 |
通常 0 |
max_leaves |
最大叶子数(与 grow_policy=lossguide 配合) |
0(无限制)或 32~128 |
采样参数(引入随机性)
| 参数 | 说明 | 推荐值 |
|---|---|---|
subsample |
每棵树采样样本比例 | 0.6~1.0 |
colsample_bytree |
每棵树采样特征比例 | 0.6~1.0 |
colsample_bylevel |
每层采样特征比例 | 通常与 colsample_bytree 一致 |
colsample_bynode |
每个节点采样特征比例 | 0.6~1.0 |
组合建议:
subsample=0.8, colsample_bytree=0.8
树构建算法
tree_method |
说明 | 适用场景 |
|---|---|---|
auto |
自动选择(数据 < 10k 用 exact,否则 hist) |
通用 |
exact |
精确贪心(遍历所有分割点) | 小数据,追求极致精度 |
approx |
近似贪心(分位数 sketch) | 中等数据 |
hist |
直方图算法(推荐) | 大数据,速度快 |
gpu_hist |
GPU 直方图 | GPU 环境,超大数据 |
推荐:
tree_method='hist'(CPU)或'gpu_hist'(GPU)
3.3 线性提升器参数
适用于 booster=gblinear:
| 参数 | 说明 |
|---|---|
updater |
shotgun(随机坐标下降,适合稀疏数据)coord_descent(全坐标下降,适合稠密数据) |
lambda, alpha |
同树模型,控制权重正则化 |
适用场景:文本分类(TF-IDF)、推荐系统(高维稀疏特征)
3.4 DART 提升器参数
| 参数 | 说明 | 推荐 |
|---|---|---|
rate_drop |
每轮 dropout 树比例 | 0.1~0.3 |
one_drop |
1 表示至少 dropout 一棵树 |
配合 rate_drop>0 |
skip_drop |
跳过 dropout 的概率(动态控制) | 0.2~0.5 |
normalize_type |
tree(每树归一化)或 forest |
通常 tree |
使用场景:深度树 + 易过拟合任务
3.5 学习任务参数
| 参数 | 说明 | 示例 |
|---|---|---|
objective |
目标函数 | binary:logistic, reg:squarederror |
base_score |
初始预测值 | 分类 0.5,回归 y.mean() |
eval_metric |
评估指标 | ['auc', 'logloss'] |
scale_pos_weight |
正负样本权重比 | sum(neg) / sum(pos) |
3.6 命令行专用参数
| 参数 | 说明 |
|---|---|
num_round |
提升轮数(必需) |
data / test:data |
数据路径 |
watchlist |
监控集:train:data/train.txt,val:data/val.txt |
model_in / model_out |
模型加载/保存 |
4. 参数依赖关系图
graph TD
A[booster] --> B[gbtree]
A --> C[gblinear]
A --> D[dart]
B --> E[tree_method]
E --> F[hist]
E --> G[gpu_hist]
F --> H[max_bin]
B --> I[subsample]
B --> J[colsample_bytree]
B --> K[max_depth]
D --> L[rate_drop]
A --> M[objective]
M --> N[eval_metric]
5. 调参实战指南(推荐流程)
text
1. 固定学习率:eta = 0.1
2. 调树复杂度:
- max_depth: 3~10
- min_child_weight: 1~10
- gamma: 0~1
3. 调正则化:
- lambda: 1~100
- alpha: 0~1
4. 调采样:
- subsample: 0.6~1.0
- colsample_bytree: 0.6~1.0
5. 降低 eta(如 0.05)+ 增加 num_boost_round
6. 使用早停(early_stopping_rounds=50)
6. 常见目标函数与评估指标对照表
| 任务 | objective | 默认 eval_metric | 推荐指标 |
|---|---|---|---|
| 回归 | reg:squarederror | rmse | rmse, mae |
| 回归(对数) | reg:squaredlogerror | rmsle | rmsle |
| 二分类 | binary:logistic | logloss | auc, logloss |
| 多分类 | multi:softmax | merror | merror, mlogloss |
| 多分类(概率) | multi:softprob | merror | 同上 |
| 排序 | rank:pairwise | auc | ndcg, map |
7. 中英文术语对照表
| 英文 | 中文 | 说明 |
|---|---|---|
| booster | 提升器 | 模型类型 |
| learning rate | 学习率 | eta |
| regularization | 正则化 | L1/L2 |
| subsample | 子采样 | 样本采样 |
| colsample | 列采样 | 特征采样 |
| histogram | 直方图 | hist 算法 |
| dropout | 丢弃 | DART 机制 |
| early stopping | 早停 | 防止过拟合 |
8. 代码示例
Python API(推荐)
import xgboost as xgb
from sklearn.model_selection import train_test_split
# 数据准备
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2)
dtrain = xgb.DMatrix(X_train, y_train)
dval = xgb.DMatrix(X_val, y_val)
params = {
'objective': 'binary:logistic',
'eval_metric': ['auc', 'logloss'],
'eta': 0.1,
'max_depth': 6,
'subsample': 0.8,
'colsample_bytree': 0.8,
'tree_method': 'hist',
'verbosity': 1,
'scale_pos_weight': 2.0
}
bst = xgb.train(
params,
dtrain,
num_boost_round=1000,
evals=[(dtrain, 'train'), (dval, 'val')],
early_stopping_rounds=50,
verbose_eval=10
)
scikit-learn 接口
from xgboost import XGBClassifier
model = XGBClassifier(
n_estimators=1000,
max_depth=6,
learning_rate=0.1,
subsample=0.8,
colsample_bytree=0.8,
eval_metric='auc',
early_stopping_rounds=50,
n_jobs=8
)
model.fit(X_train, y_train,
eval_set=[(X_val, y_val)],
verbose=10)