我正在运行以下代码:
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.
与 scikit-learn GridSearchCV不同,它返回一个模型(如果使用 调用,则可以选择使用整个数据进行重新拟合)refit=True,xgb.cv不返回任何模型,仅返回评估历史记录;来自文档:
返回评估历史记录
从这个意义上说,它与 scikit-learn 类似cross_validate,它也不返回任何模型 - 仅返回指标。
因此,如果您对 CV 结果感到满意并且想要继续用所有数据拟合模型,则必须单独执行此操作:
bst = xgb.train(dtrain=data_dmatrix, params=params, num_boost_round=50)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4178 次 |
| 最近记录: |