在SciKit-Learn中使用XGBoost进行交叉验证的网格搜索和早期停止

时间:2017-05-09 09:37:24

标签: python scikit-learn cross-validation xgboost grid-search

我对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'参数。我知道这需要预测变量和响应变量,但我不确定如何使用交叉验证数据作为早期停止标准。

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

1 个答案:

答案 0 :(得分:3)

你可以将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)  

经过一些调整后,我找到了最安全的方法来集成early_stopping_rounds和sklearn API,以实现一个自我的早期停止机制。如果您使用n_rounds GridSearchCV作为调整参数,则可以执行此操作。然后,您可以通过增加n_rounds来查看不同模型的mean_validation_score。然后,您可以为早期停止定义自定义启发式。它不会节省评估所有可能的n_rounds虽然

所需的计算时间

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