2017-03-24 14 views
3

Ich versuche, hyperparametersuche mit scikit-learns GridSearchCV auf XGBoost zu tun. Während der Gridsearch-Suche möchte ich, dass es zu früh aufhört, da es die Suchzeit drastisch reduziert und (zu erwarten ist) bessere Ergebnisse für meine Vorhersage-/Regressionsaufgabe liefert. Ich benutze XGBoost über seine Scikit-Learn API.GridSearchCV - XGBoost - Frühes Stoppen

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) 

Ich habe versucht, mit der Verwendung von fit_params frühen Stopp Parameter zu geben, aber dann wirft es diesen Fehler, die im Grunde von Validierungssatz wegen des Mangels ist die für Anfang Anhalten erforderlich ist:

/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'] 

Wie kann ich GridSearch auf XGBoost mit early_stopping_rounds anwenden?

Anmerkung: Modell wird ohne Gridsearch funktioniert, funktioniert auch ohne Gridsearch ‚fit_params = {‘ early_stopping_rounds': 42}

+0

Was ist der Fehler? Bitte posten Sie volle Stack-Trace. Funktioniert der Code auch ohne gridSearch, nur mit XGBRegressor.fit()? –

+0

ja, Code funktioniert ohne gridsearch, funktioniert auch ohne 'fit_params = {' early_stopping_rounds ': 42}' – ayyayyekokojambo

+0

Sie haben den Stack-Trace noch nicht aktualisiert. Was ist der Fehler? –

Antwort

4

Wenn early_stopping_rounds verwenden Sie müssen auch eval_metric und eval_set als Eingangsparameter für die Anpassungsmethode geben. Ein frühes Anhalten erfolgt durch Berechnen des Fehlers in einem Bewertungssatz. Der Fehler muss alle early_stopping_rounds verringert werden, sonst wird die Generierung zusätzlicher Bäume früh gestoppt.

Siehe die documentation von xgboosts Fit-Methode für Details.

Hier sehen Sie ein minimales voll funktionsfähiges Beispiel:

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) 
+1

danke für die Antwort, es funktioniert. aber das Vorgeben von eval_set ist gegen die Art der Kreuzvalidierung, denke ich. – ayyayyekokojambo

+0

Ich denke, was Sie meinen, ist, dass Sie in realen Anwendungen sicherstellen müssen, dass sich eval_set und train set nicht überlappen oder die gleichen wie hier sind - sollte das hinzugefügt haben. Ich habe den Zug einfach aus Gründen der Einfachheit benutzt. Ein frühes Anhalten aufgrund der Zugdaten verhindert nicht die Überanpassung. – glao

+0

@Glao: Der Eval-Satz sollte der Hold-Out-Satz des Kreuzvalidierungsprozesses sein, damit alles wie gewünscht funktioniert. –