我想雇用early-stopping
-scikit-learns 中的选项 GridSearchCV
-方法。此 SO- 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)
但是,我想将交叉验证过程的保留集用作验证集。有没有办法在
GridSearchCV
中指定它?
最佳答案
这对于 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)
或者
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)
和 sklearn 接口(interface) :
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)
如您所见,
xgboost.XGBRegressor
没有提前停止这样的事情。 .请注意,sklearn 接口(interface)是唯一可以与 GridSearchCV 结合使用的接口(interface),它需要一个适当的 sklearn 估计器和 .fit()、.predict() 等......你可以通过你
early_stopping_rounds
, 和 eval_set
作为 GridSearchCV 的额外 fit_params,这实际上会起作用。然而,
GridSearchCV
不会改变不同折叠之间的 fit_params,所以你最终会使用相同的 eval_set
在所有的折叠中,这可能不是你所说的简历。model=xgb.XGBClassifier()
clf = GridSearchCV(model, parameters,
fit_params={'early_stopping_rounds':20,\
'eval_set':[(X,y)]},cv=kfold)
经过一些调整,我找到了最安全的集成方式
early_stopping_rounds
并且 sklearn API 是为您自己实现 early_stopping 机制。如果你做 GridSearchCV
就可以做到与 n_rounds
作为要调整的参数。然后您可以观看 mean_validation_score
对于不同型号的增加 n_rounds
.然后,您可以为提前停止定义自定义启发式;你会注意到默认的不是最佳的。我认为这也是一种更好的方法,然后为此目的使用单个拆分保留。
关于python - 使用 GridSearchCV 提前停止 - 使用保留的 CV 集进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49756461/