xGBoostでscikit-learnのGridSearchCVを使用してハイパーパラメーター検索を実行しようとしています。グリッドサーチ中に、検索時間を大幅に短縮し、(予想して)予測/回帰タスクでより良い結果が得られるため、早めに停止してください。 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}なしでも機能します
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)
_
early_stopping_rounds
を使用する場合、eval_metric
およびeval_set
をfitメソッドの入力パラメーターとして指定する必要もあります。早期停止は、評価セットでエラーを計算することにより行われます。エラーはearly_stopping_rounds
ごとに減らす必要があります。そうしないと、追加のツリーの生成が早期に停止します。
詳細については、xgboosts fitメソッドの documentation を参照してください。
ここに、完全に機能する最小限の例を示します。
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)