如何从 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
中的参数 model
是 xgb.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
。
我是运行以下代码:
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
中的参数 model
是 xgb.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
。