网格搜索和提前停止使用交叉验证与XGBoost在SciKit-Learn中



我对sci-kit学习相当陌生,并且一直在尝试超参数调整XGBoost。我的目标是使用早期停止和网格搜索来调整模型参数,并使用早期停止来控制树的数量并避免过度拟合。

由于我对网格搜索使用交叉验证,因此我希望在早期停止标准中也使用交叉验证。到目前为止,我的代码如下所示:

import numpy as np
import pandas as pd
from sklearn import model_selection
import xgboost as xgb
#Import training and test data
train = pd.read_csv("train.csv").fillna(value=-999.0)
test = pd.read_csv("test.csv").fillna(value=-999.0)
# Encode variables
y_train = train.price_doc
x_train = train.drop(["id", "timestamp", "price_doc"], axis=1)
# XGBoost - sklearn method
gbm = xgb.XGBRegressor()
xgb_params = {
'learning_rate': [0.01, 0.1],
'n_estimators': [2000],
'max_depth': [3, 5, 7, 9],
'gamma': [0, 1],
'subsample': [0.7, 1],
'colsample_bytree': [0.7, 1]
}
fit_params = {
'early_stopping_rounds': 30,
'eval_metric': 'mae',
'eval_set': [[x_train,y_train]]
}
grid = model_selection.GridSearchCV(gbm, xgb_params, cv=5, 
fit_params=fit_params)
grid.fit(x_train,y_train)

我遇到的问题是"eval_set"参数。我知道这需要预测变量和响应变量,但我不确定如何使用交叉验证数据作为早期停止标准。

有谁知道如何克服这个问题?谢谢。

你可以

early_stopping_rounds,eval_set作为GridSearchCV的额外fit_params,这实际上会起作用。但是,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)  

经过一些调整,我发现集成early_stopping_rounds和sklearn API的最安全方法是自己实现early_stopping机制。如果您使用n_rounds作为要调整的参数进行GridSearchCV,则可以执行此操作。然后,您可以观看不同型号的mean_validation_score,n_rounds .然后,您可以为提前停止定义自定义启发式。不过,它不会节省评估所有可能n_rounds所需的计算时间

我认为这也是一种更好的方法,然后为此目的使用单个拆分保留。

使用xgboost原文。

根据数据Dmatrix和使用xgboost.cv

教程

在 GridSearchCV 中包含提前停止没有多大意义。提前停车用于快速找到列车/有效情况下的最佳n_rounds。如果我们不在乎"快速",我们可以调整n_rounds。 假设 GridSearchCV 具有为每个折叠执行早期停止n_rounds的功能,那么我们将为每组超参数提供 N(折叠数(n_rounds。也许n_rounds平均值可用于最终的最佳超参数集,但是当n_rounds彼此差异太大时,它可能不是一个好的选择。因此,在 GridSearchCV 中包含提前停止可能会提高三角处理的速度,但结果可能不是最好的。

接受答案中建议的方法更像是调整n_rounds参数,而不是提前停止,因为作者承认"它不会节省评估所有可能n_rounds所需的计算时间"。

最新更新