Wird die Kreuzvalidierungsleistung ein genauer Indikator für die Vorhersage der tatsächlichen Leistung in einem unabhängigen Datensatz sein?

9

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α1α1

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.α2

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.α3

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.α4

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.

KevinKim
quelle

Antworten:

3

Zunächst eine pragmatische Antwort: Diskontieren Sie nicht die Möglichkeit, dass der Testsatz aus einer etwas anderen Verteilung stammt als der Datensatz, den Sie für das Training und die Kreuzvalidierung verwenden. Sie könnten denken, dass dies nicht passieren sollte, aber in der Praxis scheint es zu passieren.

Nehmen wir jedoch Ihre Hypothese an und gehen Sie davon aus, dass der Testsatz aus genau derselben Verteilung stammt wie der Rest Ihrer Daten. In diesem Fall kann die Kreuzvalidierung Sie in die Irre führen, welches Modell besser ist, wenn Sie die Kreuzvalidierung zur Auswahl von Hyperparametern verwenden.

Sie können die Kreuzvalidierung verwenden, um entweder (a) Hyperparameter auszuwählen oder (b) die Genauigkeit Ihres Modells zu schätzen - aber nicht beide gleichzeitig.

Es scheint, dass Sie die Kreuzvalidierung verwenden, um die optimalen Hyperparameter auszuwählen: Sie versuchen viele verschiedene Auswahlmöglichkeiten für die Hyperparameter, für jede Auswahl schätzen die Genauigkeit dieser Auswahl mithilfe der Kreuzvalidierung und wählen die beste Auswahl aus. Wenn Sie dies tun, gibt es keine Garantie dafür, dass die resultierende Genauigkeit (mit dem besten Parameter) die Leistung des Testsatzes vorhersagt - dies kann eine Überschätzung sein (aufgrund von Überanpassung). Wenn es für M1 eher eine Überschätzung als für M2 ist, sehen Sie möglicherweise, was Sie gesehen haben.

Wenn Sie sowohl Hyperparameter auswählen als auch die Genauigkeit schätzen möchten, empfehlen wir Ihnen, einen separaten Validierungssatz für die Schätzung der Genauigkeit zu verwenden oder eine verschachtelte Kreuzvalidierung zu verwenden. Siehe https://stats.stackexchange.com/q/65128/2921 und http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html .

DW
quelle
Kennen Sie eine andere theoretischere Referenz (von der Seite der Wahrscheinlichkeitstheorie), die erklärt, warum ein verschachtelter Lebenslauf für die Modellauswahl erforderlich ist als ein einfacher Lebenslauf? Ich möchte den zugrunde liegenden Mechanismus verstehen, der zu dem Problem führt, auf das ich gestoßen
bin
1
Ich schlage auch vor, eine verschachtelte Kreuzvalidierung zu verwenden. Wenn Sie einen dreifachen äußeren Lebenslauf und einen zehnfachen inneren Lebenslauf erstellen, können Sie die drei Modelle, die Sie während des inneren Lebenslaufs trainieren, an drei verschiedenen Datensätzen testen. Dadurch erhalten Sie ein besseres Verständnis dafür, wie sich Ihr Modellbildungsprozess auswirkt, wenn er auf verschiedene Datensätze stößt.
DarXider
@darXider Ich habe einige der verschachtelten Lebensläufe gelesen. Es scheint, dass sie verwendet werden, um zwei Klassen von Modellen zu vergleichen, z. B. RF und GBT, so dass im inneren Lebenslauf die "besten" Hyperparameter (niedrigster Lebenslauffehler) von ausgewählt werden RF und GBT berechnen dann im äußeren CV den Generalisierungsfehler von RF und GBT mit den vom inneren CV gewählten Hyperparametern. In meinem Fall habe ich nur eine Modellklasse, GBT. Ich möchte eine Hyperparameter-Optimierung durchführen. Wie hilft mir verschachtelter Lebenslauf dabei?
KevinKim
@ KevinKim AFAIK, das Ziel des verschachtelten Lebenslaufs ist es, eine Vorstellung davon zu geben, wie sich der Modellbildungsprozess verallgemeinern lässt, und nicht verschiedene Klassen von Modellen zu vergleichen. Da Ihr oberstes Ziel darin besteht, Ihr trainiertes Modell (ob RF oder XGB) für zukünftige / unsichtbare Daten zu verwenden, erhalten Sie möglicherweise ein besseres Verständnis der Leistung, wenn Sie einen verschachtelten Lebenslauf verwenden. Natürlich können Sie auch Hyperparameter in Ihrem verschachtelten 3x10-Lebenslauf optimieren. Am Ende erhalten Sie beispielsweise 3 XGB-Modelle, die einander entsprechen (beachten Sie, dass Sie nicht eines von drei auswählen sollten, sondern diese beispielsweise mit verschiedenen Ensembling-Methoden kombinieren können).
DarXider
1

Kann ich behaupten oder sollte ich damit rechnen, dass M1 gegenüber diesem neuen Testdatensatz immer noch eine bessere Leistung als M2 erbringt?

Ja du solltest. Natürlich unter den Bedingungen, dass

  1. Die Testdaten stammen aus demselben Generierungsprozess wie die Trainings- und Validierungsdaten
  2. Sie haben genug Daten in jedem Satz, um statistische Schwankungen unwahrscheinlich zu machen.

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.

Ich kann mir zwei Gründe vorstellen:

  1. 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.

  2. 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.

Ytsen de Boer
quelle
Ich habe den Code in meinem Beitrag. Ich glaube nicht, dass ich das CV-Verfahren missbraucht habe (haben Sie festgestellt, dass etwas mit meinem Code nicht stimmt?). Und ich habe tatsächlich gesehen, dass der Trainingsfehler viel geringer und stabiler ist (mit kleinem Standard) als der Validierungsfehler. Ich verstehe, dass der wahre Testfehler höher sein wird als der Validierungsfehler, aber ich gehe davon aus, dass dies auch bei allen meinen Modellen der Fall sein wird (ich meine XBGT mit unterschiedlichem Wert der Hyperparameter). Nach allem, was ich gesehen habe, scheint dies bei einigen Modellen weniger der Fall zu sein als bei anderen Modellen, was dieses "umgekehrte Phänomen" erzeugt. Ich weiß also nicht, in welche Richtung ich
suche
D.
Ich denke, in der Praxis nimmt auch die Anzahl der Funktionen zu, obwohl wir in einer "Big Data" -Welt leben. Da wir den Fluch der Dimension haben, ist es sehr wahrscheinlich, dass wir selbst für eine große Anzahl von Zeilen immer noch nicht genügend Datenpunkte für jeden Teil des Merkmalsraums haben. Dann ist die statistische Schwankung immer da. Dann frage ich mich, ob dieses Tune-HyperP-Verfahren noch korrekt oder nützlich ist, um ein Modell mit guter Leistung für einen realen Testdatensatz zu erhalten. Wenn der Lebenslauf für diese Aufgabe nicht hilfreich ist, wie ist dann das richtige Verfahren?
KevinKim
Überprüfen Sie, ob die Trainingsverluste in Ihrem Validierungsverfahren miteinander vergleichbar sind, dh konsistent. Wenn nicht, versuchen Sie es mit einer anderen Modell- / Funktionsauswahl. Fahren Sie nicht fort, bis Sie dieses Recht haben. Machen Sie dann dasselbe für Ihre Validierungsverluste. Wenn diese nicht vergleichbar sind, versuchen Sie es mit einer anderen Modell- / Funktionsauswahl- / Validierungsmethode. Wenn dies der Fall ist, fahren Sie mit dem Testsatz fort. Wenn der Verlust Sie dort nicht zufriedenstellt, lehnen Sie den gesamten Vorgang ab und versuchen Sie etwas anderes. Wenn Sie mit der Optimierung mithilfe des Testsatzes beginnen, können Sie sich nicht auf die Live-Leistung verlassen, da diese auf den Testsatz verzerrt ist.
Ytsen de Boer
0

Es ist möglich. Stellen Sie sich ein einfaches Szenario vor, in dem das Modell M1die Varianz des Trainingsdatensatzes Dbesser gelernt hat als das Modell, M2da seine Parameter besser abgestimmt sind. Dies bedeutet M1eine bessere Leistung Dals M2.

Aber wenn wir sie am Test-Set testen T, ist es möglich, dass M2die Leistung besser ist, da sie M1möglicherweise überpasst, Dwährend dies M2nicht der Fall war. Daher ist M1die Leistung schlechter Tals M2.

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

  1. Trainiere verschiedene Modelle am selben Trainingsset
  2. Validiert am Validierungssatz
  3. Wählen Sie die leistungsstärkste Modellbasisleistung beim Validierungssatz aus
  4. Verwenden Sie es, um Ihren Testsatz zu bewerten.
Santoshi M.
quelle
Ich dachte, die Kreuzvalidierung des Datensatzes Dhat die Überanpassungsprobleme bereits berücksichtigt. Ich verstehe, dass, wenn Sie überhaupt keine Kreuzvalidierung durchführen, dh nur das Modell in den Datensatz einpassen Dund 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 dieses optimizedModell bei einem unabhängigen Testdatensatz tendenziell eine schlechte Leistung erbringt. Aber ich denke, dieses Problem wurde durch Kreuzvalidierung des Datensatzes behoben D, nicht wahr?
KevinKim
1
Insbesondere wenn Sie einen 10-fachen Lebenslauf Derstellen, hacken Sie zuerst zufällig Din 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 an Dund wenden sie dann auf dieselbe 1 / an 10 von D, um Ihre zu erhalten test 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 den
Testfehler
Ja, es reicht zu schließen, dass "M1 besser ist als M2". Wenn es bei Ihrem Modellauswahlverfahren jedoch darauf ankommt, M1 basierend auf der Validierungsleistung auszuwählen , wird Ihre Auswahl des besten Modells (in diesem Fall M1) auf den Validierungssatz verzerrt. Daher ist eine abschließende Überprüfung des Testsatzes erforderlich, um einen Hinweis darauf zu erhalten, wie gut er mit Live-Daten funktioniert.
Ytsen de Boer
@YtsendeBoer Ich habe mich endlich davon überzeugt, was du gesagt hast. Genau. Wenn ich dann bei einem anderen unabhängigen Testsatz festgestellt habe, dass M1 schlechter als M2 ist (Rückruf M1 ist besser als M2 im Validierungssatz), sollte ich in diesem Fall M1 oder M2 als mein endgültiges Modell wählen, um eine echte Vorhersage im zu machen Zukunft? Wenn ich M1 wähle, dann ist das Testergebnis eindeutig gegen M1. Aber wenn ich mich für M2 entscheide, würde M2 ​​dann nicht auch zu diesem speziellen Testdatensatz passen? dh auf die gleiche Weise wie die Überanpassung von M1 an den spezifischen Validierungssatz?
KevinKim
Ja, das ist genau das , warum sollten Sie nicht die Modellauswahl auf dem Testset tun. Sie haben M1 in Ihrem Modellauswahlverfahren unter Verwendung des Validierungssatzes ausgewählt. Dann führen Sie M1 auf dem Testsatz aus und entscheiden, ob das Ergebnis gut genug ist. Vergessen Sie an dieser Stelle M2, auch wenn es bei einem anderen Testsatz eine bessere Leistung erbringt. Wenn Sie jedoch Zweifel an Ihren Ergebnissen haben, sollten Sie Ihren "anderen unabhängigen Testsatz" zum Rest Ihrer Daten hinzufügen (mehr Daten sind besser), den Vorgang erneut starten und dabei bleiben .
Ytsen de Boer
0

Die 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

Bashar Haddad
quelle