Pytanie:
Jak używać XGboost.cv z optymalizacją hiperparametrów?
Klausos
2015-11-28 16:42:18 UTC
view on stackexchange narkive permalink

Chcę zoptymalizować hiperparametry XGboost za pomocą krzyżowej walidacji. Jednak nie jest jasne, jak uzyskać model z xgb.cv . Na przykład dzwonię do objective (params) z fmin . Następnie model jest zakładany na dtrain i sprawdzany na dvalid . Co jeśli chcę użyć krzyżowej walidacji KFold zamiast uczenia się na dtrain?

  z hyperopt import fmin, tpeimport xgboost as xgbparams = {'n_estimators': hp.quniform ( 'n_estimators', 100, 1000, 1), 'eta': hp.quniform ('eta', 0,025, 0,5, 0,025), 'max_depth': hp.quniform ('max_depth', 1, 13, 1) #. ..} best = fmin (objective, space = params, algo = tpe.suggest) def goal (params): dtrain = xgb.DMatrix (X_train, label = y_train) dvalid = xgb.DMatrix (X_valid, label = y_valid) watchlist = [(dtrain, 'train'), (dvalid, 'eval')] model = xgb.train (params, dtrain, num_boost_round, evals = watchlist, feval = myFunc) # xgb.cv (param, dtrain, num_boost_round, nfold = 5, seed = 0, # feval = myFunc)  
Dwa odpowiedzi:
darXider
2016-09-01 20:21:30 UTC
view on stackexchange narkive permalink

W ten sposób wytrenowałem klasyfikator xgboost z 5-krotną weryfikacją krzyżową, aby zoptymalizować wynik F1 przy użyciu wyszukiwania losowego pod kątem optymalizacji hiperparametrów. Zauważ, że X i y tutaj powinno być pandas dataframes.

  from scipy import stats from xgboost import XGBClassifierfrom sklearn.model_selection import RandomizedSearchCV, KFoldfrom sklearn.metrics import f1_scoreclf_xgb = XGBClassifier (objective = 'b : logistic ') param_dist = {' n_estimators ': stats.randint (150, 500),' learning_rate ': stats.uniform (0,01, 0,07),' subsample ': stats.uniform (0,3, 0,7),' max_depth ': [3, 4, 5, 6, 7, 8, 9], „colsample_bytree”: stats.uniform (0,5, 0,45), „min_child_weight”: [1, 2, 3]} clf = RandomizedSearchCV (clf_xgb, param_distributions = param_dist , n_iter = 25, scoring = 'f1', error_score = 0, verbose = 3, n_jobs = -1) numFolds = 5folds = KFold (n_splits = numFolds, shuffle = Tr ue) estymatory = [] wyniki = np.zeros (len (X)) wynik = 0,0 dla train_index, test_index in folds.split (X): X_train, X_test = X.iloc [train_index ,:], X.iloc [test_index ,:] y_train, y_test = y.iloc [train_index] .values.ravel (), y.iloc [test_index] .values.ravel () clf.fit (X_train, y_train) estymatory.append (clf.best_estimator_) [ test_index] = clf.predict (X_test) score + = f1_score (y_test, results [test_index]) score / = numFolds  

Na koniec otrzymasz listę wyszkolonych klasyfikatorów w estymatory , prognoza dla całego zbioru danych w wynikach utworzona na podstawie nieoficjalnych prognoz oraz oszacowanie dla $ F_1 $ score w score .

W jaki sposób ten kod zarządza num_boost_round i early_stopping_rounds?
panc
2018-07-25 08:45:21 UTC
view on stackexchange narkive permalink

Nie mam wystarczającej reputacji, aby komentować odpowiedź @ darXider.Dlatego dodaję „odpowiedź”, aby zgłosić uwagi.

Dlaczego potrzebujesz for train_index, test_index in folds: skoro clf przeprowadza już walidację krzyżową, aby wybrać najlepszy zestaw wartości hiperparametrów?

W Twoim kodzie wygląda na to, że wykonujesz CV dla każdego z pięciu zawinięć („zagnieżdżone” CV), aby wybrać najlepszy model dla tego konkretnego zawinięcia.Ostatecznie będziesz mieć pięć „najlepszych” estymatorów.Najprawdopodobniej nie mają tych samych wartości hiperparametrów.

Popraw mnie, jeśli się mylę

Tak, domyślnie RandomizedSearchCV używa 3-krotnego CV do określenia parametrów.W razie potrzeby można ją zmienić na dowolną inną liczbę fałd.
Jak zauważyłeś, jest to zagnieżdżony schemat sprawdzania krzyżowego i masz rację, że pięć „najlepszych” modeli nie ma tych samych hiperparametrów.Ostatecznie jednak otrzymujesz 5 równoważnych „najlepszych” modeli (i możesz na przykład użyć ich w zestawie) do wykonania swoich prognoz.Co więcej, ten schemat pozwala uzyskać prognozy dla całego zbioru danych (jak wspomniałem w mojej odpowiedzi, łącząc nieoficjalne przewidywania każdego modelu).Ponadto podaje również szacunkowy spread w wyniku (w przeciwieństwie do jednej wartości).


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...