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.
quelle
Ja du solltest. Natürlich unter den Bedingungen, dass
Ich kann mir zwei Gründe vorstellen:
Der Testdatensatz wird in der Tat nicht auf die gleiche Weise generiert. Daher ist es besser, sich nicht auf das Kaggle-Testset zu verlassen, auf das Sie keinen Zugriff haben. Verwenden Sie die Daten, die Sie haben.
Sie sind überanpassend, was bedeutet, dass Sie die Kreuzvalidierung nicht korrekt ausführen. Stellen Sie wirklich sicher, dass das Training der Parameter auf den Trainingsdaten erfolgt und gleichzeitig die Validierung auf den Daten erfolgt, die Sie nicht für das Training verwendet haben. Vergleichen Sie die Histogramme der Trainingsverluste und der Validierungsverluste. Die Trainingsverluste sollten durchweg kleiner sein als die Validierungsverluste. Machen Sie dasselbe für die Verluste in den Testdaten, um ein konsistentes Bild zu erhalten.
As und Endnote: Es ist zu erwarten, dass die Leistung des Testsatzes geringer ist als die des Validierungssatzes. Dies liegt daran, dass das Modell basierend auf dem Validierungssatz ausgewählt wird. Es ist also auf diesen Datensatz voreingenommen.
quelle
Es ist möglich. Stellen Sie sich ein einfaches Szenario vor, in dem das Modell
M1
die Varianz des TrainingsdatensatzesD
besser gelernt hat als das Modell,M2
da seine Parameter besser abgestimmt sind. Dies bedeutetM1
eine bessere LeistungD
alsM2
.Aber wenn wir sie am Test-Set testen
T
, ist es möglich, dassM2
die Leistung besser ist, da sieM1
möglicherweise überpasst,D
während diesM2
nicht der Fall war. Daher istM1
die Leistung schlechterT
alsM2
.Dies kann daran liegen, dass Sie Ihre Kreuzvalidierung für denselben Datensatz anstelle eines Validierungssatzes durchgeführt haben. Wenn Sie am selben Satz trainieren und validieren, werden Sie wahrscheinlich die Tatsache übersehen, dass es möglicherweise überpasst. Daher ist es immer besser, verschiedene Datensätze zu trainieren, zu validieren und zu testen. So sollte der Fluss sein
quelle
D
hat die Überanpassungsprobleme bereits berücksichtigt. Ich verstehe, dass, wenn Sie überhaupt keine Kreuzvalidierung durchführen, dh nur das Modell in den Datensatz einpassenD
und dieses Optimierungsproblem lösen und die optimalen Parameter erhalten, dieses Modell den geringsten Zugfehler aufweist und dies sehr wahrscheinlich ist eine Überanpassung. In diesem Fall stimme ich zu, dass diesesoptimized
Modell bei einem unabhängigen Testdatensatz tendenziell eine schlechte Leistung erbringt. Aber ich denke, dieses Problem wurde durch Kreuzvalidierung des Datensatzes behobenD
, nicht wahr?D
erstellen, hacken Sie zuerst zufälligD
in ungefähr 10 gleich große Stücke, dann passen Sie in jeder Iteration sowohl M1 als auch M2 auf die gleichen 9/10 von anD
und wenden sie dann auf dieselbe 1 / an 10 vonD
, um Ihre zu erhaltentest error
, dann wiederholen Sie diesen Vorgang 10 Mal und jedes Mal unterscheiden sich der Zugsatz und der Testsatz von der vorherigen Iteration. Dann, nach 10 Iterationen, mitteln Sie denDie Theorie hinter der Kreuzvalidierung (v-fache Kreuzvalidierung) wurde in vielen Veröffentlichungen angesprochen. Einen Beweis dafür gibt es in einem von 2003 bis 2007 veröffentlichten Set-Paper. Bitte beachten Sie: - Orakelwähler. 2006 - Super-Lernender 2007 - Super-Lernender in Vorhersage 2010 - Einheitliche Kreuzvalidierung 2003
quelle