GridSearchCV - XGBoost - 提前停止

新手上路,请多包涵

我正在尝试在 XGBoost 上使用 scikit-learn 的 GridSearchCV 进行超参数搜索。在 gridsearch 期间,我希望它早点停止,因为它大大减少了搜索时间并且(期望)在我的预测/回归任务上有更好的结果。我通过其 Scikit-Learn API 使用 XGBoost。

     model = xgb.XGBRegressor()
    GridSearchCV(model, paramGrid, verbose=verbose ,fit_params={'early_stopping_rounds':42}, cv=TimeSeriesSplit(n_splits=cv).get_n_splits([trainX, trainY]), n_jobs=n_jobs, iid=iid).fit(trainX,trainY)

我尝试使用 fit_params 提供提前停止参数,但随后它抛出了这个错误,这主要是因为缺少提前停止所需的验证集:

 /opt/anaconda/anaconda3/lib/python3.5/site-packages/xgboost/callback.py in callback(env=XGBoostCallbackEnv(model=<xgboost.core.Booster o...teration=4000, rank=0, evaluation_result_list=[]))
    187         else:
    188             assert env.cvfolds is not None
    189
    190     def callback(env):
    191         """internal function"""
--> 192         score = env.evaluation_result_list[-1][1]
        score = undefined
        env.evaluation_result_list = []
    193         if len(state) == 0:
    194             init(env)
    195         best_score = state['best_score']
    196         best_iteration = state['best_iteration']

如何使用 early_stopping_rounds 在 XGBoost 上应用 GridSearch?

注意:模型在没有 gridsearch 的情况下工作,GridSearch 也可以在没有 ‘fit_params={‘early_stopping_rounds’:42} 的情况下工作

原文由 ayyayyekokojambo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

从 sklearn 0.21.3 开始更新@glao 的回答和@Vasim 的评论/问题(注意 fit_params 已经从 GridSearchCV 的实例化中移出并被移动进入 fit() 方法;此外,导入专门从 xgboost 中引入 sklearn 包装器模块):

 import xgboost.sklearn as xgb
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import TimeSeriesSplit

cv = 2

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

# these are the evaluation sets
testX = trainX
testY = trainY

paramGrid = {"subsample" : [0.5, 0.8]}

fit_params={"early_stopping_rounds":42,
            "eval_metric" : "mae",
            "eval_set" : [[testX, testY]]}

model = xgb.XGBRegressor()

gridsearch = GridSearchCV(model, paramGrid, verbose=1,
         cv=TimeSeriesSplit(n_splits=cv).get_n_splits([trainX, trainY]))

gridsearch.fit(trainX, trainY, **fit_params)

原文由 emigre459 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 early_stopping_rounds 时,您还必须提供 eval_metriceval_set 作为拟合方法的输入参数。提前停止是通过计算评估集的错误来完成的。错误必须每隔 early_stopping_rounds 减少一次,否则额外树的生成会提前停止。

有关详细信息,请参阅 xgboosts fit 方法的 文档

在这里您可以看到一个最小的完整工作示例:

 import xgboost as xgb
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import TimeSeriesSplit

cv = 2

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

# these are the evaluation sets
testX = trainX
testY = trainY

paramGrid = {"subsample" : [0.5, 0.8]}

fit_params={"early_stopping_rounds":42,
            "eval_metric" : "mae",
            "eval_set" : [[testX, testY]]}

model = xgb.XGBRegressor()
gridsearch = GridSearchCV(model, paramGrid, verbose=1 ,
         fit_params=fit_params,
         cv=TimeSeriesSplit(n_splits=cv).get_n_splits([trainX,trainY]))
gridsearch.fit(trainX,trainY)

原文由 glao 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进