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}
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)
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)