0Pricing
Learn AI with Python · 课时

梯度提升:GBM 与 XGBoost

比较提升法与装袋法,学习 GradientBoostingClassifier、XGBClassifier 和提前停止

梯度提升:GBM 与 XGBoost 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。

提升法 vs 装袋法

装袋法并行训练多棵树并对结果取平均。提升法按顺序训练多棵树,每棵新树都会修正前面树的错误。

提升法可以降低偏差,在结构化数据上通常比装袋法获得更高的准确率。

按顺序训练弱学习器

梯度提升会构建由浅层树(弱学习器)组成的集成模型。每棵树都会拟合当前集成模型留下的残差(损失函数的梯度)。

不断加入许多小幅修正,就能构建出整体性能强大的模型。

GradientBoostingClassifier

Scikit-learn 提供了 GradientBoostingClassifier。主要参数包括 n_estimators(树的数量)、learning_rate(收缩率)和 max_depth(树的规模)。

from sklearn.ensemble import GradientBoostingClassifier

gbm = GradientBoostingClassifier(
    n_estimators=200,
    learning_rate=0.1,
    max_depth=3,
    random_state=0,
)
gbm.fit(Xtr, ytr)
print(gbm.score(Xte, yte))

学习率的权衡

learning_rate 会缩放每棵树的贡献。较小的学习率需要更多的树,但通常具有更好的泛化能力。

一种常见策略是:设置较低的学习率(例如 0.05)和较多的估计器,然后使用 early stopping。

from sklearn.ensemble import GradientBoostingClassifier

gbm = GradientBoostingClassifier(
    n_estimators=1000,
    learning_rate=0.05,
    max_depth=3,
)

为什么 max_depth 通常较小

在提升法中,每棵树都是弱学习器,因此 max_depth 通常设置为 3 到 6。较深的树会很快对残差过拟合。集成模型依靠许多浅层树而不是少数深层树来增强能力。

认识 XGBoost

XGBoost 是一个经过优化的梯度提升库:速度更快,支持正则化,并且内置了对缺失值的处理。在表格数据机器学习竞赛中,它通常表现出色。

from xgboost import XGBClassifier

model = XGBClassifier(
    n_estimators=300,
    learning_rate=0.1,
    max_depth=4,
    random_state=0,
)
model.fit(Xtr, ytr)
print(model.score(Xte, yte))

XGBoost 的主要参数

核心参数与 GBM 类似:

  • n_estimators 提升轮数
  • learning_rate 每轮的收缩率
  • max_depth 树的深度
  • subsample 和 colsample_bytree 为正则化增加随机性
from xgboost import XGBClassifier

model = XGBClassifier(
    n_estimators=500,
    learning_rate=0.05,
    max_depth=4,
    subsample=0.8,
    colsample_bytree=0.8,
)

XGBoost 中的正则化

XGBoost 增加了 L1(reg_alpha)和 L2(reg_lambda)惩罚,以及 gamma(进行划分所需的最小损失减少量)。这些参数可以控制复杂度,并进一步减少普通 GBM 无法避免的过拟合。

from xgboost import XGBClassifier

model = XGBClassifier(
    reg_alpha=0.1,
    reg_lambda=1.0,
    gamma=0.1,
)

早停

early_stopping_rounds 会在验证指标连续 N 轮不再改善时停止训练。它可以自动找到合适的树数量,并防止过拟合。

from xgboost import XGBClassifier

model = XGBClassifier(
    n_estimators=2000,
    learning_rate=0.05,
    early_stopping_rounds=50,
    eval_metric="logloss",
)
model.fit(Xtr, ytr, eval_set=[(Xte, yte)], verbose=False)
print("Best iteration:", model.best_iteration)

解读特征重要性

XGBoost 提供了 feature_importances_,以及功能更丰富的 get_booster().get_score(),后者支持 gain 和 weight 等重要性类型。Gain 反映某个特征使损失改善了多少。

model = XGBClassifier(n_estimators=200).fit(Xtr, ytr)
print(model.feature_importances_)

booster = model.get_booster()
print(booster.get_score(importance_type="gain"))

何时选择提升法

经过良好调优后,梯度提升在表格数据上的表现通常优于随机森林。代价是对超参数更加敏感,而且按顺序训练会更慢。可以先使用 XGBoost 的默认设置,再调节 learning_rate、max_depth,并使用 early stopping。

快速检查

检查您对提升法的掌握情况。

回顾

回顾:提升法会按顺序训练多棵树,每棵树都会修正之前的错误。请调节 n_estimators、learning_rate(低学习率加更多树)和较小的 max_depth。XGBoost 增加了正则化(reg_alpha、reg_lambda、gamma)和 early_stopping_rounds,可以自动选择最优的树数量。

常见问题解答

「梯度提升:GBM 与 XGBoost」课时是免费的吗?

是的 — 「梯度提升:GBM 与 XGBoost」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。

「梯度提升:GBM 与 XGBoost」这节课中我会学到什么?

比较提升法与装袋法,学习 GradientBoostingClassifier、XGBClassifier 和提前停止 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn AI with Python 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「梯度提升:GBM 与 XGBoost」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn AI with Python 课中编写并运行代码吗?

能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 决策树:原理与实现
  2. 随机森林与装袋法
  3. 梯度提升:GBM 与 XGBoost
  4. LightGBM 与 CatBoost
← 返回 Learn AI with Python