Skip to content

模型构建

本章目标

  1. 明确 train_model(...) 如何构建并训练 XGBRegressor——注意这是回归模型,非分类。
  2. 理解 XGBRegressor 的核心构造器参数(n_estimatorsmax_depthgammareg_lambdamin_child_weight)及其与 GBDT/LightGBM 的差异。
  3. 看清训练完成后最重要的模型属性——feature_importances_(特征重要性)、n_estimators_(实际树数)。

重点方法与概念速览

名称类型作用
train_model(...)函数构建并训练一个 xgboost.XGBRegressor 回归模型——含可选依赖检查
XGBRegressor(...)XGBoost 的 scikit-learn 兼容回归接口——二阶泰勒展开 + 显式正则化
model.fit(X_train, y_train)方法训练 300 棵回归树——二阶目标近似 + 加权分位数草图 + 列块并行
model.feature_importances_属性8 个特征的重要性分数——基于分裂增益累加
model.predict(X)方法300 棵树加权累加——输出连续房价预测值

1. train_model(...) 的函数签名

参数速览

适用函数:train_model(X_train, y_train, n_estimators=300, learning_rate=0.05, max_depth=6, min_child_weight=1, subsample=0.9, colsample_bytree=0.9, gamma=0.0, reg_alpha=0.0, reg_lambda=1.0, random_state=42)

参数名类型说明示例取值
X_trainarray_like,形状 (16512, 8)训练特征矩阵(无标准化——树模型天然尺度不敏感)X_train
y_trainarray_like,形状 (16512,)连续回归目标——房屋中位价y_train
n_estimatorsint弱学习器数量。当前 300——与 LightGBM 一致100300500
learning_ratefloat学习率(收缩因子)。0.05——每次只修正残差的 5%0.010.050.1
max_depthint树的最大深度。6——深于 GBDT(3),浅于完全生长3610
min_child_weightint叶子节点的最小 Hessian 和。1——MSE 下等价于最小样本数1510
subsamplefloat行采样比例。0.9——每轮迭代随机保留 90% 训练样本0.50.91.0
colsample_bytreefloat列采样比例。0.9——每棵树随机选择 90% 的特征(≈7/8)0.30.91.0
gammafloat分裂所需的最小损失下降。0.0——不设最低增益门槛0.00.11.0
reg_alphafloatL1 正则化系数。0.0——不启用 L1 稀疏0.00.11.0
reg_lambdafloatL2 正则化系数。1.0——默认开启,抑制叶子权重过大0.01.010.0
random_stateint随机种子。4242
返回值XGBRegressor已完成 fit() 的回归模型对象

示例代码

python
from model_training.ensemble.xgboost import train_model

model = train_model(X_train, y_train)

理解重点

  • train_model(...) 是有监督回归训练——y_train 是连续值房价,不是离散类别标签。
  • XGBoost 的 max_depth=6 深于 GBDT(3)但远浅于 Bagging 的完全生长树——在偏差和方差间取平衡。
  • reg_lambda=1.0 是 XGBoost 独有的默认值——其他 Boosting 实现默认不开启 L2 正则化。
  • min_child_weight=1 在回归中等于"每个叶子至少 1 个样本"——因为 Hessian 恒为 1。实际上相当于 min_samples_leaf=1

2. XGBRegressor 构造器参数

参数速览

适用 API:XGBRegressor(n_estimators=300, learning_rate=0.05, max_depth=6, min_child_weight=1, subsample=0.9, colsample_bytree=0.9, gamma=0.0, reg_alpha=0.0, reg_lambda=1.0, random_state=42, n_jobs=-1)

参数名类型说明示例取值
n_estimatorsint弱学习器数量。300——步数更多但每步更小100300500
learning_ratefloat学习率。0.05——越小越需更多树0.010.050.1
max_depthint树的最大深度。6——适中深度,防止过拟合3610
min_child_weightint叶子节点的最小 Hessian 和。11510
subsamplefloat行采样比例。0.90.50.80.9
colsample_bytreefloat列采样比例。0.9——8 个特征中约 7 个用于每棵树0.30.80.9
gammafloat分裂最小增益。0.0——不设门槛0.00.11.0
reg_alphafloatL1 正则化。0.0——不启用 L1 稀疏0.00.1
reg_lambdafloatL2 正则化。1.0——默认开启,抑制大权重0.01.0
random_stateint随机种子。4242
n_jobsint并行线程数。-1 使用所有 CPU——列块并行-114
verbosityint日志级别。默认 1(warning)012

示例代码

python
try:
    from xgboost import XGBRegressor
except ImportError:
    raise ImportError("请先 pip install xgboost")

model = XGBRegressor(
    n_estimators=300,
    learning_rate=0.05,
    max_depth=6,
    min_child_weight=1,
    subsample=0.9,
    colsample_bytree=0.9,
    gamma=0.0,
    reg_alpha=0.0,
    reg_lambda=1.0,
    random_state=42,
    n_jobs=-1,
)
model.fit(X_train, y_train)

理解重点

  • XGBoost 的参数列表是四个集成模型中最长的——体现了它在正则化和精确控制上的设计理念。
  • gamma 是 XGBoost 独有的预剪枝参数——区别于 max_depth(硬深度限制)和 min_child_weight(叶子样本数限制)。
  • 三重正则化(gamma + reg_lambda + reg_alpha)作用于不同层级——gamma 控分裂是否发生,lambda 控叶子权重是否过大,alpha 控无关权重是否置零。

3. 训练完成后的关键属性

参数速览

属性名类型说明
feature_importances_ndarray,形状 (8,)8 个特征的重要性分数——基于分裂增益累加(gain
n_estimators_int实际训练的树数量——等于 n_estimators=300
n_features_in_int特征维度——当前为 8
best_iteration_int早停最优迭代轮次(启用 early_stopping_rounds 时可用)

示例代码

python
print(f"n_estimators: {n_estimators}")
print(f"learning_rate: {learning_rate}")
print(f"max_depth: {max_depth}")
print(f"min_child_weight: {min_child_weight}")
print(f"subsample: {subsample}")
print(f"colsample_bytree: {colsample_bytree}")
print(f"gamma: {gamma}")
print(f"reg_alpha: {reg_alpha}")
print(f"reg_lambda: {reg_lambda}")
print(f"特征重要性: {model.feature_importances_}")

理解重点

  • feature_importances_ 默认使用 gain(分裂增益累加)——与 LightGBM 一致,不同于 sklearn GBDT 的 impurity 下降量。
  • 在加州房价数据上,MedInc(收入中位数)通常是最重要的特征——收入是房价的主要驱动力,符合直觉。
  • XGBoost 没有 predict_proba——回归输出为连续值,不是概率分布。

4. predict() — 预测连续值

参数速览

方法输入输出说明
predict(X)array_like,形状 (n, 8)ndarray,形状 (n,),连续值300 棵树加权累加——直接输出房价预测值

理解重点

  • predict() 返回连续实数——即房屋中位价的预测值(单位:10 万美元)。
  • 与分类集成模型不同——没有 predict_proba,没有 softmax,没有 argmax。
  • 预测值 = m=1300ηfm(x)——300 棵树的加权累加。

5. XGBoost vs GBDT vs LightGBM 参数对比

参数GBDT (sklearn)LightGBMXGBoost
任务分类分类回归
n_estimators200300300
learning_rate0.10.050.05
复杂度控制max_depth=3num_leaves=31max_depth=6
最小叶子min_child_samples=20min_child_weight=1
行采样subsample=1.0subsample=0.9subsample=0.9
列采样colsample_bytree=0.9colsample_bytree=0.9
分裂门槛gamma=0.0
L1 正则化reg_alpha=0.0
L2 正则化reg_lambda=1.0
依赖sklearn 内置pip install lightgbmpip install xgboost

常见坑

  1. min_child_weight=1 理解成"最小样本数为 1"——对非 MSE 损失函数,Hessian 不是常数,两者不等价。
  2. 忘记 reg_lambda=1.0 默认开启——如果感觉模型欠拟合,尝试降为 0.0。
  3. gammareg_alpha 功能混淆——gamma 做分裂级剪枝,alpha 做权重级稀疏化。
  4. 在新环境中直接 from model_training.ensemble.xgboost import train_model——需先 pip install xgboost

小结

  • train_model(...) 是本仓库 XGBoost 的核心训练入口,是对 xgboost.XGBRegressor 的薄封装——含可选依赖检查和 12 个可配置参数。
  • XGBRegressor 的核心参数体系是四个集成模型中最丰富的——n_estimators(树数量)、learning_rate(学习率)、max_depth(深度)、min_child_weight(最小 Hessian 和)、gamma(分裂门槛)、reg_lambda(L2)、reg_alpha(L1)——构成三层正则化体系。
  • 训练完成后核心属性:feature_importances_(8 个特征按增益排序)——是回归场景下理解特征贡献的关键诊断工具。