web-dev-qa-db-fra.com

GridSearchCV - XGBoost - Arrêt anticipé

j'essaye de faire la recherche hyperparemeter en utilisant GridSearchCV de scikit-learn sur XGBoost. Pendant la recherche de grille, je voudrais qu'il s'arrête tôt, car il réduit considérablement le temps de recherche et (espère) avoir de meilleurs résultats sur ma tâche de prédiction/régression. J'utilise XGBoost via son API Scikit-Learn.

    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)

J'ai essayé de donner des paramètres d'arrêt précoce à l'aide de fit_params, mais cela génère cette erreur qui est essentiellement due au manque de jeu de validation requis pour un arrêt précoce:

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

Comment puis-je appliquer GridSearch sur XGBoost en utilisant early_stopping_rounds?

remarque: le modèle fonctionne sans gridsearch, GridSearch fonctionne également sans 'fit_params = {' early_stopping_rounds ': 42}

14
ayyayyekokojambo

Une mise à jour de la réponse de @ glao et une réponse au commentaire/question de @ Vasim, à partir de sklearn 0.21.3 (notez que fit_params A été retiré de l'instanciation de GridSearchCV et déplacé dans le fit() méthode; aussi, l'importation extrait spécifiquement le module wrapper sklearn de xgboost):

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)
3
emigre459

Lors de l'utilisation de early_stopping_rounds vous devez également donner eval_metric et eval_set comme paramètre d'entrée pour la méthode d'ajustement. L'arrêt anticipé se fait via le calcul de l'erreur sur un ensemble d'évaluation. L'erreur doit diminuer tous les early_stopping_rounds sinon la génération d'arbres supplémentaires est arrêtée tôt.

Voir la méthode documentation of xgboosts fit pour plus de détails.

Voici un exemple minimal pleinement fonctionnel:

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)
13
glao