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

Geo*_*rge 9 python scikit-learn cross-validation grid-search xgboost

我对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)
Run Code Online (Sandbox Code Playgroud)

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

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

00_*_*_00 5

您可以将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和sklearnAPI 的最安全方法是实现自己的Early_stopping机制。如果将GridSearchCVn_rounds作为要调整的参数,则可以执行此操作。然后,您可以通过观察观察不同模型的mean_validation_score n_rounds。然后,您可以定义自定义试探法以提前停止。它不会保存到评估所有可能需要的计算时间n_rounds虽然

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

  • 如果我们不将 'eval_set':[(X,y)] 传递到 `fit_params` 中,代码将引发类似 [this](/sf/ask/2494284411/仅参数到 scikit-learn 中管道对象的一部分)。看来我们进行了网格搜索,将 X_total 分为 n 折叠,并在折叠外拟合模型 n 次,每次都使用 eval_set':[(X,y)] 拟合模型提前停止。所以我认为这与 CV 的思想不符,CV 的思想意味着在折叠之外构建模型并在每次折叠上进行评估。 (3认同)