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

cbu*_*tem 3 python xgboost

我正在运行以下代码:

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)
Run Code Online (Sandbox Code Playgroud)

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

小智 7

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

由于您需要在 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
Run Code Online (Sandbox Code Playgroud)

如果方法中的xgb.cv参数是 的实例。现在我们应该将回调传递给.modelafter_trainingxgb.training._PackedBoosterxgb.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), ])
Run Code Online (Sandbox Code Playgroud)

您的模型将保存在cvboosters.


des*_*aut 5

与 scikit-learn GridSearchCV不同,它返回一个模型(如果使用 调用,则可以选择使用整个数据进行重新拟合refit=Truexgb.cv不返回任何模型,仅返回评估历史记录;来自文档

返回评估历史记录

从这个意义上说,它与 scikit-learn 类似cross_validate,它也不返回任何模型 - 仅返回指标。

因此,如果您对 CV 结果感到满意并且想要继续用所有数据拟合模型,则必须单独执行此操作:

bst = xgb.train(dtrain=data_dmatrix, params=params, num_boost_round=50)
Run Code Online (Sandbox Code Playgroud)