一、引言
像XGBoost(极端梯度提升)这样的集成方法,是梯度提升决策树的高效实现,它能将多个较弱的估计器聚合为一个强大的预测模型。这类集成方法因其准确性、高效性以及在结构化(表格)数据上的出色表现而备受青睐。尽管广泛使用的机器学习 库scikit-learn并未提供XGBoost的原生实现,但有一个专门的库(恰如其名XGBoost)提供了与scikit-learn兼容的API。
Airia企业级AI(了解更多)
你只需按以下方式导入它:
西北大学(NWU)——提供多种人工智能 课程供你选择。
from xgboost import XGBClassifier
下面,我们将介绍7个Python技巧,帮助你充分利用这个独立的XGBoost实现,尤其是在构建更精准的预测模型时。
为了说明这些技巧,我们将使用scikit-learn中可免费获取的乳腺癌数据集,并定义一个基本默认设置的基准模型。在尝试以下7个技巧之前,请务必先运行这段代码:
import numpy as npfrom sklearn.datasets import load_breast_cancerfrom sklearn.model_selection import train_test_split, GridSearchCVfrom sklearn.metrics import accuracy_scorefrom 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("基准准确率:" , accuracy_score(y_test, model.predict(X_test)))
二、调优学习率和估计器数量
虽然这并非通用规则,但在XGBoost集成中,明确降低学习率同时增加估计器(树)数量,通常能提高准确率。较小的学习率让模型学习更平缓,而额外的树则可以补偿步长的减少。
以下是一个示例。你可以亲自尝试,并将得到的准确率与初始基准模型进行比较:
model = XGBClassifier( learning_rate=0.01 , n_estimators=5000 , eval_metric="logloss" , random_state=42 ) model.fit(X_train, y_train) print("模型准确率:" , accuracy_score(y_test, model.predict(X_test)))
为简洁起见,后续示例中将省略最后的print()语句。你在自行测试时,只需将其添加到以下任何代码片段末尾即可。
三、调整树的最大深度
max_depth参数是继承自经典决策树的关键超参数,它限制了集成中每棵树的生长深度。限制树的深度看似简单,但令人惊讶的是,较浅的树通常比较深的树泛化能力更好。
以下示例将树的最大深度限制为2:
model = XGBClassifier( max_depth=2 , eval_metric="logloss" , random_state=42 ) model.fit(X_train, y_train)
四、通过子采样减少过拟合
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)
请记住,这种方法在数据集规模适中时效果最佳。如果数据集本身已经很小,过度的子采样可能会导致欠拟合。
五、添加正则化项
为了进一步控制过拟合,可以使用传统的正则化策略(如L1正则化(Lasso)和L2正则化(Ridge))对复杂树进行惩罚。在XGBoost中,这分别由reg_alpha和reg_lambda参数控制。
model = XGBClassifier( reg_alpha=0.2 , reg_lambda=0.5 , eval_metric="logloss" , random_state=42 ) model.fit(X_train, y_train)
六、使用早停策略
早停(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
七、执行超参数搜索
对于更系统的方法,超参数搜索可以帮助找到最大化模型性能的参数组合。以下是一个使用网格搜索(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("最佳参数:" , grid.best_params_) best_model = XGBClassifier( **grid.best_params_, eval_metric="logloss" , random_state=42 ) best_model.fit(X_train, y_train) print("调优后准确率:" , accuracy_score(y_test, best_model.predict(X_test)))
八、调整类别不平衡
最后这个技巧在处理严重类别不平衡的数据集时特别有用(乳腺癌数据集相对平衡,因此即使你观察到微小变化也无需担心)。当类别比例严重倾斜时(例如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)
九、总结
在本文中,我们探讨了7个实用技巧,帮助你利用专用的Python库增强XGBoost集成模型。对学习率、树深度、采样策略、正则化和类别权重进行深思熟虑的调优,再结合系统的超参数搜索,往往能让一个不错的模型变得高度精准。
推荐学习书籍 《CDA一级教材 》适合CDA一级考生备考,也适合业务及数据分析 岗位的从业者提升自我。完整电子版已上线CDA网校,累计已有10万+在读~ !