📢 转载信息
原文链接:https://www.kdnuggets.com/7-xgboost-tricks-for-more-accurate-predictive-models
原文作者:Iván Palomares Carrascosa
Image by Editor
# 引言
像 XGBoost(Extreme Gradient Boosting,极端梯度提升)这样的集成方法是梯度提升决策树的强大实现,它将多个弱估计器聚合为一个强大的预测模型。由于其准确性、效率以及在结构化(表格)数据上的出色性能,这些集成方法非常受欢迎。虽然广泛使用的机器学习库 scikit-learn 没有提供 XGBoost 的原生实现,但有一个单独的库,恰好也叫 XGBoost,它提供了与 scikit-learn 兼容的 API。
您只需按如下方式导入即可:
from xgboost import XGBClassifier
下面,我们将概述 7 个 Python 技巧,它们可以帮助您充分利用 XGBoost 这个独立实现,尤其是在旨在构建更准确的预测模型时。
为了说明这些技巧,我们将使用 scikit-learn 中免费提供的乳腺癌(Breast Cancer)数据集,并使用大部分默认设置定义一个基线模型。请务必先运行此代码,然后再试验接下来的七个技巧:
import numpy as np from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.metrics import accuracy_score from xgboost import XGBClassifier # 数据 X, y = load_breast_cancer(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # 基线模型 model = XGBClassifier(eval_metric="logloss", random_state=42) model.fit(X_train, y_train) print("Baseline accuracy:", accuracy_score(y_test, model.predict(X_test)))
# 1. 调整学习率和估计器数量
虽然这不是通用规则,但明确降低 XGBoost 集成中的学习率(learning_rate)并增加估计器(树的数量,n_estimators)通常可以提高准确性。较小的学习率允许模型更渐进地学习,而额外的树则弥补了步长减小带来的影响。
这是一个示例。请自行尝试,并将结果准确率与初始基线进行比较:
model = XGBClassifier( learning_rate=0.01, n_estimators=5000, eval_metric="logloss", random_state=42 ) model.fit(X_train, y_train) print("Model accuracy:", accuracy_score(y_test, model.predict(X_test)))
为清晰起见,在接下来的示例中将省略最后的 print() 语句。在自己测试时,只需将它们追加到下面的任何代码片段即可。
# 2. 调整树的最大深度
max_depth 参数是一个从经典决策树继承的关键超参数。它限制了集成中每棵树可以生长的深度。限制树的深度看似简单,但令人惊讶的是,较浅的树通常比更深的树具有更好的泛化能力。
此示例将树的深度限制为最大 2:
model = XGBClassifier( max_depth=2, eval_metric="logloss", random_state=42 ) model.fit(X_train, y_train)
# 3. 通过子采样减少过拟合
subsample 参数在集成中生长每棵树之前,随机抽取训练数据的一个比例(例如 80%)。这种简单技术是一种有效的正则化策略,有助于防止过拟合。
如果未指定,此超参数默认为 1.0,意味着使用了 100% 的训练样本:
model = XGBClassifier( subsample=0.8, colsample_bytree=0.8, eval_metric="logloss", random_state=42 ) model.fit(X_train, y_train)
请记住,这种方法在数据集相对较大时最有效。如果数据集已经很小,过度子采样可能会导致欠拟合。
# 4. 添加正则化项
为了进一步控制过拟合,可以使用传统的正则化策略(如 L1(Lasso)和 L2(Ridge))来惩罚复杂的树。在 XGBoost 中,它们分别由 reg_alpha 和 reg_lambda 参数控制。
model = XGBClassifier( reg_alpha=0.2, # L1 reg_lambda=0.5, # L2 eval_metric="logloss", random_state=42 ) model.fit(X_train, y_train)
# 5. 使用早期停止
早期停止(Early Stopping)是一种面向效率的机制,当验证集上的性能在指定的轮数内停止改进时,它会终止训练。
根据您的编码环境和所使用的 XGBoost 库版本,您可能需要升级到更新的版本才能使用下面展示的实现。此外,请确保在模型初始化时指定 early_stopping_rounds,而不是在 fit() 方法中传递。
model = XGBClassifier( n_estimators=1000, learning_rate=0.05, eval_metric="logloss", early_stopping_rounds=20, random_state=42 ) model.fit( X_train, y_train, eval_set=[(X_test, y_test)], verbose=False )
要升级库,请运行:
!pip uninstall -y xgboost !pip install xgboost --upgrade
# 6. 执行超参数搜索
为了采取更系统的方法,超参数搜索有助于识别最大化模型性能的设置组合。下面是一个使用网格搜索(Grid Search)来探索前面介绍的三个关键超参数组合的示例:
param_grid = { "max_depth": [3, 4, 5], "learning_rate": [0.01, 0.05, 0.1], "n_estimators": [200, 500] } grid = GridSearchCV( XGBClassifier(eval_metric="logloss", random_state=42), param_grid, cv=3, scoring="accuracy" ) grid.fit(X_train, y_train) print("Best params:", grid.best_params_) best_model = XGBClassifier( **grid.best_params_, eval_metric="logloss", random_state=42 ) best_model.fit(X_train, y_train) print("Tuned accuracy:", accuracy_score(y_test, best_model.predict(X_test)))
# 7. 调整以应对类别不平衡
最后一个技巧在处理严重类别不平衡的数据集时特别有用(乳腺癌数据集相对平衡,因此如果观察到微小变化,请勿担心)。当类别比例高度倾斜时(例如 90/10、95/5 或 99/1),scale_pos_weight 参数尤其有用。
以下是根据训练数据计算并应用它的方法:
ratio = np.sum(y_train == 0) / np.sum(y_train == 1) model = XGBClassifier( scale_pos_weight=ratio, eval_metric="logloss", random_state=42 ) model.fit(X_train, y_train)
# 总结
在本文中,我们探索了七个实用的技巧,用于使用 XGBoost 专用的 Python 库来增强 XGBoost 集成模型。周到地调整学习率、树的深度、采样策略、正则化和类别权重——结合系统化的超参数搜索——通常是区分一个还不错的模型和一个高度准确的模型之间的关键所在。
Iván Palomares Carrascosa 是一位在人工智能、机器学习、深度学习和大型语言模型(LLM)领域的领导者、作家、演讲者和顾问。他培训和指导他人如何在现实世界中利用人工智能。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区