使用 GridSearchCV 提前停止 - 使用保留的 CV 集进行验证

N08*_*N08 5 python scikit-learn grid-search xgboost

early-stopping我想在 scikit-learns -方法中使用 - 选项GridSearchCVSO- thread中显示了一个这样的示例:

import xgboost as xgb
from sklearn.model_selection import GridSearchCV

trainX= [[1], [2], [3], [4], [5]]
trainY = [1, 2, 3, 4, 5]

testX = trainX 
testY = trainY

param_grid = {"subsample" : [0.5, 0.8],
              "n_estimators" : [600]}

fit_params = {"early_stopping_rounds":1,
             "eval_set" : [[testX, testY]]}


model = xgb.XGBRegressor()
gridsearch = GridSearchCV(estimator  = xgb.XGBRegressor(), 
                          param_grid=param_grid,
                          fit_params=fit_params,                          
                          verbose=1,                          
                          cv=2)
gridsearch.fit(trainX,trainY)
Run Code Online (Sandbox Code Playgroud)

但是,我想使用交叉验证过程的保留集作为验证集。有没有办法在 中指定这一点GridSearchCV

00_*_*_00 2

这对于 xgboost 的当前实现(指版本 0.6 和 0.7)来说是不可能的。请注意原生xgboost的区别

    xgboost.train(params, dtrain, num_boost_round=10, evals=(), obj=None, 
feval=None, maximize=False, early_stopping_rounds=None, evals_result=None, 
verbose_eval=True, xgb_model=None, callbacks=None, learning_rates=None)
Run Code Online (Sandbox Code Playgroud)

或者

xgboost.cv(params, dtrain, num_boost_round=10, nfold=3, stratified=False, 
folds=None, metrics=(), obj=None, feval=None, maximize=False, 
early_stopping_rounds=None, fpreproc=None, as_pandas=True, verbose_eval=None, 
show_stdv=True, seed=0, callbacks=None, shuffle=True)
Run Code Online (Sandbox Code Playgroud)

sklearn 界面

    class xgboost.XGBRegressor(max_depth=3, learning_rate=0.1, 
n_estimators=100, silent=True, objective='reg:linear', booster='gbtree', 
n_jobs=1, nthread=None, gamma=0, min_child_weight=1, max_delta_step=0, 
subsample=1, colsample_bytree=1, colsample_bylevel=1, reg_alpha=0, 
reg_lambda=1, scale_pos_weight=1, base_score=0.5, random_state=0, seed=None, 
missing=None, **kwargs)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,没有提前停止这样的事情xgboost.XGBRegressor。请注意,sklearn 接口是唯一可以与 GridSearchCV 结合使用的接口,它需要一个带有 .fit()、.predict() 等的正确 sklearn 估计器...

您可以将early_stopping_rounds,eval_set作为额外的 fit_params 传递给 GridSearchCV,这实际上是可行的。但是,GridSearchCV不会更改不同折叠之间的 fit_params,因此您最终会eval_set在所有折叠中使用相同的参数,这可能不是您所说的 CV 的意思。

model=xgb.XGBClassifier()
clf = GridSearchCV(model, parameters,
                         fit_params={'early_stopping_rounds':20,\
                         'eval_set':[(X,y)]},cv=kfold)  
Run Code Online (Sandbox Code Playgroud)

经过一些调整,我发现最安全的集成方式early_stopping_rounds和 sklearn API 是自己实现一个 Early_stopping 机制。GridSearchCV如果您使用要调整的参数进行调整,则可以做到这一点n_rounds。然后您可以观看mean_validation_score不同型号的增加n_rounds。然后您可以定义一个自定义启发式以提前停止;您会注意到默认值并不是最佳的。

我认为这也是比使用单个拆分保留来实现此目的更好的方法。