Ich bin der Meinung, dass diese Frage mit der Theorie der Kreuzvalidierung zusammenhängt. Ich stelle meinen empirischen Befund , hier und schrieb eine Frage an die Theorie der Kreuzvalidierung im Zusammenhang gibt .
Ich habe zwei Modelle M1 und M2. Ich verwende denselben Datensatz, um sie zu trainieren, und führe eine Kreuzvalidierung mit demselben Datensatz durch, um die optimalen Parameter für jedes Modell zu finden. Angenommen, ich habe schließlich festgestellt, dass M1 unter seinem optimalen Parameter eine bessere Leistung als M2 unter seinem optimalen Parameter in Bezug auf die 10-fache Kreuzvalidierungsbewertung aufweist. Wenn ich nun einen anderen unabhängigen Testdatensatz mit Prädiktoren und Labels habe und dieser Testdatensatz aus derselben Verteilung meines Trainingsdatensatzes generiert wird, kann ich diese 2 gut abgestimmten Modelle auf diesen neuen Testdatensatz anwenden behaupten oder sollte ich damit rechnen, dass M1 gegenüber diesem neuen Testdatensatz immer noch eine bessere Leistung als M2 erbringt?
Ich habe ein Beispiel für die Kaggle Titanic gespielt. Ich habe ein 2 xgboost-Modell, M1 ist gut abgestimmt und M2 ist weniger gut abgestimmt in dem Sinne, dass M1 eine bessere 10-fache Kreuzvalidierung für den Trainingsdatensatz durchführt. Als ich dann beide einreichte, stellte ich fest, dass das weniger gut abgestimmte Modell tatsächlich bessere Ergebnisse im Testdatensatz aufweist. Wie kann das sein? Und wenn es stimmt, worauf sollten wir dann achten, wenn wir die Daten an verschiedene Modelle anpassen und die Modellparameter optimieren?
Hier sind meine spezifischen Übermittlungsergebnisse: Ich habe eine zufällige Rastersuche durchgeführt
params_fixed = {'silent': 1,'base_score': 0.5,'reg_lambda': 1,
'max_delta_step': 0,'scale_pos_weight':1,'nthread': 4,
'objective': 'binary:logistic'}
params_grid = {'max_depth': list(np.arange(1,10)),
'gamma': [0,0.05,0.1,0.3, 0.5,0.7,0.9],
'n_estimators':[1,2,5,7,10,15,19,25,30,50],
'learning_rate': [0.01,0.03,0.05,0.1,0.3,0.5,0.7,0.9,1],
'subsample': [0.5,0.7,0.9], 'colsample_bytree': [0.5,0.7,0.9],
'min_child_weight': [1,2,3,5], 'reg_alpha': [1e-5, 1e-2, 0.1, 0.5,1,10]
}
rs_grid = RandomizedSearchCV(
estimator=XGBClassifier(**params_fixed, seed=seed),
param_distributions=params_grid,
n_iter=5000,
cv=10,
scoring='accuracy',
random_state=seed
)
Jedes Mal, wenn ich die Variable ändere n_iter
. Zuerst setze ich n_iter=10
, es gibt mir eine Reihe von Werten dieser Hyperparameter , nennen wir diesen Vektor und der Lebenslauf-Score (Genauigkeitsrate) ist 0,83389 , dann benutze ich α 1 , um mein Modell zu trainieren und eine Vorhersage für den unabhängigen Test zu generieren Datensatz, und wenn ich ihn an Kaggle sende, wird eine echte Genauigkeit für den Testdatensatz 0.79426 generiert
Zweitens, ich setze n_iter=100
, gibt es mir und der Lebenslauf-Score ist 0,83614 , dh höher als der erste, macht Sinn, aber wenn ich mich Kaggle unterwerfe, ist 0,78469 niedriger als der erste.
Drittens, ich setze n_iter = 1000
, gibt es mir und der Lebenslauf-Score ist 0,83951 , dh höher als der zweite, macht Sinn, aber wenn ich mich Kaggle unterwerfe, ist 0,77990 niedriger als der zweite.
Viertens, ich setze n_iter = 5000
, gibt es mir und der Lebenslauf-Score ist 0,84512 , dh höher als der dritte, macht Sinn, aber wenn ich mich Kaggle unterwerfe, 0,72249 , niedriger als der dritte.
Das ist wirklich frustriert. Das Modell wird in Bezug auf die Kreuzvalidierungsbewertung immer besser, aber wenn es an einem tatsächlichen unabhängigen Datensatz durchgeführt wird, wird seine Leistung immer schlechter. Habe ich die CV-Ergebnisse genau umgekehrt interpretiert? Ich sehe einige Artikel erwähnt, dass die CV-Bewertung zu optimistisch sein kann, um auf die wahre Testbewertung zu schließen. Selbst wenn dies zutrifft, sollten die CV-Werte für alle meine 4 Modelle hinsichtlich ihrer eigenen wahren Testergebnisse optimistisch sein, dh die Reihenfolge sollte beibehalten werden. Bei der Anwendung auf den realen Testdatensatz kehrte sich die Reihenfolge jedoch um.
Der einzige Grund, den ich mir vorstellen kann, ist, dass der Testdatensatz eine andere Verteilung hat als der Trainingsdatensatz. Wenn dies jedoch tatsächlich der Fall ist, dann glaube ich, dass es unter der Sonne keine Methode gibt, die dieses Problem heilen kann.