2017-07-26 1 views
1

Ich möchte die early_stopping_rounds von XGBoost verwenden, um nicht überziehen Training. Dazu verwende ich folgenden Code:XGBoost Reporting Eval-Auc ist zurückgegangen, aber Train-Auc ist gestiegen, ob das Ergebnis normal ist?

parameters = {'nthread': 4,'objective': 'binary:logistic','learning_rate': 0.06,'max_depth': 6,'min_child_weight': 3, 
     'silent': 0,'gamma': 0,'subsample': 0.7,'colsample_bytree': 0.5,'n_estimators': 5, 
     'missing': -999,'scale_pos_weight': scale_pos_weight,'seed': 4789,'eval_metric':'auc','early_stopping_rounds': 100} 
X_train, X_test, y_train, y_test =train_test_split(train_feature,train_label, test_size=0.3, random_state=4789) 
dtrain = xgb.DMatrix(X_train, label=y_train) 
dtest = xgb.DMatrix(X_test, label=y_test) 
evallist = [(dtest, 'eval'), (dtrain, 'train')] 
bst = xgb.train(parameters, dtrain,num_boost_round=1500, evals=evallist) 

wenn Druckzwischenergebnisse i log erhalten, wie:

[1469] eval-auc:0.912417 train-auc:0.986104 
[16:04:23] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 110 extra nodes, 0 pruned nodes, max_depth=6 
[1470] eval-auc:0.912412 train-auc:0.986118 
[16:04:27] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 102 extra nodes, 0 pruned nodes, max_depth=6 
[1471] eval-auc:0.912405 train-auc:0.986129 
[16:04:30] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 116 extra nodes, 0 pruned nodes, max_depth=6 
[1472] eval-auc:0.912383 train-auc:0.986143 
[16:04:34] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 116 extra nodes, 0 pruned nodes, max_depth=6 
[1473] eval-auc:0.912375 train-auc:0.986159 

jetzt frage ich mich dieser Zug Ergebnis richtig ist, wie zu erkennen, dass, wenn mein Modell Überanpassung oder nicht und wie viele Runden zu wählen?

+0

Ja, es ist korrekt, wenn die AUC Ihres Zuges zunimmt, aber die AUC-Validierung abnimmt - es ist das Zeichen der Überanpassung. Allgemeine Empfehlung über early_stopping_rounds - 10% von Ihrem num_boost_round = 150 für Ihren Fall. Hier ist ein Artikel darüber - http://machinelearningmastery.com/avoid-overfitting-by-early-stopping-with-xgboost-in-python/ –

+0

Danke, wenn Sie "[220]", ich habe meine Validierung AUC beobachtet fangen an zu sinken und trainieren-auc noch zunehmen. Ich bin verwirrt, dass ich 'early_stopping_rounds' in den Parametern dict gesetzt habe, jedoch nicht, warum? Aus diesem Ergebnis sollte ich num_boost_round = 220 setzen? – phoebe

Antwort

1

Wie @Stepan Novikov sagte, das Ergebnis, das Sie sehen, ist richtig - Ihr Modell fängt gerade an, sich zu überziehen.

In Bezug auf Ihre zweite Frage funktioniert der early_stopping_rounds Parameter wie funktioniert, indem Sie das Training beenden, nachdem N Runden ohne Verbesserung in Eval-Aug (N ist early_stopping_rounds) vergangen sind. Beachten Sie, dass der eval-auc-Wert zwischenzeitlich verringern kann, aber so lange es in den letzten N Runden eine absolute Verbesserung gibt, wird das Training fortgesetzt.

In Ihrem Beispiel hat die Runde [1469] den maximalen Wert für eval-auc, so dass das Training erst in der Runde [1569] endet (100 Runden später, wie konfiguriert).

Schließlich sollte die optimale Anzahl der erreichten Runden in der bst Variable Ihres Beispiels gespeichert werden.

+0

Vielen Dank für Ihre Antwort, ich verstehe ~ – phoebe

Verwandte Themen