如何从 xgboost CV 中获取经过训练的模型?

How can I get the trained model from xgboost CV?

我是运行以下代码:

params = {"objective":"reg:squarederror",'colsample_bytree': 0.3,'learning_rate': 0.15,
                'max_depth': 5, 'alpha': 15}

data_dmatrix = xgb.DMatrix(data=X_train,label=y_train)
cv_results = xgb.cv(dtrain=data_dmatrix, params=params, nfold=3,
                    num_boost_round=50, early_stopping_rounds=10, 
                    metrics="rmse", as_pandas=True, seed=0)

结果看起来不错,我想用我保留的数据测试交叉验证中的最佳模型。 但是我怎样才能得到模型呢?

不像 scikit-learn GridSearchCV, which returns a model (optionally refitted with the whole data if called with refit=True), xgb.cv does not return any model, only the evaluation history; from the docs:

Returns evaluation history

从这个意义上说,它类似于 scikit-learn 的 cross_validate,后者也不 return 任何模型 - 只有指标。

因此,如果您对 CV 结果感到满意并且希望继续使用所有数据拟合模型,则必须单独进行:

bst = xgb.train(dtrain=data_dmatrix, params=params, num_boost_round=50)

XGBoost API 提供 callbacks mechanism。回调允许您在每个时期之前和之后、训练之前和之后调用自定义函数。

由于cv后需要得到最终模型,我们可以定义这样的回调:

class SaveBestModel(xgb.callback.TrainingCallback):
    def __init__(self, cvboosters):
        self._cvboosters = cvboosters
    
    def after_training(self, model):
        self._cvboosters[:] = [cvpack.bst for cvpack in model.cvfolds]
        return model

xgb.cv 的情况下,方法 after_training 中的参数 modelxgb.training._PackedBooster 的一个实例。现在我们应该将回调传递给 xgb.cv.

cvboosters = []

cv_results = xgb.cv(dtrain=data_dmatrix, params=params, nfold=3,
                    num_boost_round=50, early_stopping_rounds=10, 
                    metrics="rmse", as_pandas=True, seed=0,
                    callbacks=[SaveBestModel(cvboosters), ])

您的模型将保存在 cvboosters