Wie verwenden Sie den 'Test'-Datensatz nach der Kreuzvalidierung?

25

In einigen Vorlesungen und Tutorials, die ich gesehen habe, wird vorgeschlagen, Ihre Daten in drei Teile aufzuteilen: Schulung, Validierung und Test. Es ist jedoch nicht klar, wie der Testdatensatz verwendet werden soll und wie dieser Ansatz besser ist als eine Kreuzvalidierung über den gesamten Datensatz.

Nehmen wir an, wir haben 20% unserer Daten als Testsatz gespeichert. Dann nehmen wir den Rest, teilen ihn in k-Faltungen auf und ermitteln mithilfe der Kreuzvalidierung das Modell, das die beste Vorhersage für unbekannte Daten aus diesem Datensatz liefert. Nehmen wir an, das beste Modell, das wir gefunden haben, liefert eine Genauigkeit von 75% .

Verschiedene Tutorials und viele Fragen auf verschiedenen Q & A-Websites besagen, dass wir unser Modell jetzt anhand eines gespeicherten (Test-) Datensatzes verifizieren können. Aber ich kann immer noch nicht verstehen, wie genau es gemacht wird und worum es geht.

Nehmen wir an, wir haben eine Genauigkeit von 70% im Testdatensatz. Also, was machen wir als nächstes? Versuchen wir es mit einem anderen Modell und dann mit einem anderen, bis wir einen Highscore für unseren Testdatensatz erhalten? In diesem Fall sehen wir jedoch so aus, als würden wir nur das Modell finden, das zu unserem begrenzten (nur 20%) Test-Set passt . Dies bedeutet nicht, dass wir das Modell finden, das im Allgemeinen am besten ist.

Darüber hinaus , wie können wir diese Partitur als eine allgemeine Bewertung des Modells betrachten, wenn es nur auf eine begrenzte Datenmenge berechnet wird? Wenn diese Punktzahl niedrig ist, hatten wir möglicherweise Pech und wählten "schlechte" Testdaten aus.

Wenn wir dagegen alle uns vorliegenden Daten verwenden und dann das Modell mithilfe der k-fachen Kreuzvalidierung auswählen, finden wir das Modell, das die beste Vorhersage für unbekannte Daten aus dem gesamten uns vorliegenden Datensatz liefert.

Serhiy
quelle
1
Sie bewerten Ihr bestes Modell auf diesem Testset und geben die Leistung darauf an. Dies ist Ihre beste Schätzung der Leistung Ihres Modells. Ich empfehle Ihnen, die ersten beiden Kapitel des hervorragenden Buches "Learning from Data" von Yaser Abu-Mostafa zu lesen. Sehr prägnant und sehr zugänglich. work.caltech.edu/telecourse.html
Vladislavs Dovgalecs
1
Vielen Dank für das Buch, das Sie vorgeschlagen haben! Was Ihre Antwort auf die Frage betrifft, sagen Sie, es ist die "beste Schätzung der Leistung Ihres Modells", aber es ist tatsächlich die Schätzung der Leistung eines Modells auf einem kleinen (20%) Test-Set , nicht wahr? Mit dem Modell ist die Leistung im Allgemeinen gemeint.
Serhiy
2
Eigentlich ist es Ihre beste Schätzung der Leistung des Modells im Allgemeinen. Ihr Modell ist möglicherweise voreingenommen und / oder weist eine hohe Varianz auf. Die Leistung des Modells in Ihrem Testset ist jedoch der beste Indikator für die Leistung bei unsichtbaren Daten.
Vladislavs Dovgalecs
Danke xeon! Das einzige, was mir noch unklar ist, ist, was wir nach der Bewertung des Modells anhand des Testdatensatzes tun ?
Serhiy
Sie versenden das Modell entweder, wenn Sie mit den Ergebnissen zufrieden sind, oder Sie finden bessere Funktionen / Algorithmen / mehr Daten, um das Modell zu verbessern.
Vladislavs Dovgalecs

Antworten:

20

Dies ähnelt einer anderen Frage, die ich in Bezug auf beantwortet habe Kreuzvalidierung und Testsätzen . Das Schlüsselkonzept, das hier zu verstehen ist, sind unabhängige Datensätze . Stellen Sie sich nur zwei Szenarien vor:

  1. Wenn Sie über viele Ressourcen verfügen, sollten Sie idealerweise einen Datensatz sammeln und Ihr Modell durch Kreuzvalidierung trainieren. Dann würdest du einen anderen völlig eigenständig sammeln Datensatz und Ihr Modell testen . Dies ist jedoch, wie ich bereits sagte, für viele Forscher in der Regel nicht möglich.

Nun, wenn ich ein Forscher bin, der nicht so glücklich ist, was mache ich dann? Nun, Sie können versuchen, genau dieses Szenario nachzuahmen:

  1. Bevor Sie ein Modelltraining absolvieren, sollten Sie eine Aufteilung Ihrer Daten vornehmen und diese der Seite überlassen (sie dürfen während der Kreuzvalidierung nicht berührt werden ). Hiermit soll derselbe unabhängige Datensatz simuliert werden, der oben im idealen Szenario erwähnt wurde. Obwohl es aus demselben Datensatz stammt, werden im Modelltraining keine Informationen aus diesen Stichproben verwendet (wobei bei Kreuzvalidierung alle Daten verwendet werden). Sobald Sie Ihr Modell trainiert haben, wenden Sie es auf Ihr Test- Set an, das Sie während des Trainings noch nie gesehen haben, und erhalten Ihre Ergebnisse. Dies geschieht, um sicherzustellen, dass Ihr Modell verallgemeinerbar ist und nicht erst gelernt hat Ihre Daten .

Um auf Ihre anderen Bedenken einzugehen:

Angenommen, wir haben eine Genauigkeit von 70% im Testdatensatz. Was machen wir als Nächstes? Versuchen wir ein anderes Modell und dann ein anderes, bis wir eine hohe Punktzahl für unseren Testdatensatz erhalten?

Die Idee ist, dass Sie das bestmögliche Modell aus Ihren Daten erstellen und es dann anhand weiterer Daten auswerten, die es noch nie zuvor gesehen hat. Sie können Ihr Kreuzvalidierungsschema neu bewerten, aber sobald Sie ein abgestimmtes Modell (dh Hyperparameter) haben, arbeiten Sie mit diesem Modell weiter, weil es das Beste war, das Sie machen konnten. Der Schlüssel ist, NIEMALS IHRE TESTDATEN ZUM ABSTIMMEN ZU VERWENDEN . Ihr Ergebnis aus den Testdaten ist die Leistung Ihres Modells in Bezug auf "allgemeine" Daten. Das Replizieren dieses Prozesses würde die Unabhängigkeit der Datensätze aufheben (worauf es ankam). Dies wird auch in einer anderen Frage zu Test- / Validierungsdaten angesprochen .

Und wie können wir diese Bewertung als allgemeine Bewertung des Modells betrachten, wenn es auf einem begrenzten Datensatz berechnet wird? Wenn diese Punktzahl niedrig ist, hatten wir möglicherweise Pech, "schlechte" Testdaten auszuwählen.

Dies ist unwahrscheinlich, wenn Sie Ihre Daten korrekt aufgeteilt haben. Sie sollten Ihre Daten nach dem Zufallsprinzip aufteilen (auch wenn sie möglicherweise für den Klassenausgleich geschichtet sind). Wenn Ihr Dataset groß genug ist, um Ihre Daten in drei Teile aufzuteilen, sollte Ihr Test-Subset so groß sein, dass die Wahrscheinlichkeit sehr gering ist, dass Sie gerade schlechte Daten ausgewählt haben. Es ist wahrscheinlicher, dass Ihr Modell überarbeitet wurde.

cdeterman
quelle
3
Vielen Dank für die so ausführliche Erklärung! Das einzige, was mir noch unklar ist, ist, was wir nach der Bewertung des Modells anhand des Testdatensatzes tun ? Was ist, wenn das Ergebnis wirklich niedrig ist? Versuchen wir ein anderes Modell?
Serhiy
Wie ich bereits sagte, können Sie Ihre Kreuzvalidierung neu bewerten und prüfen, ob Ihre Methode verbessert werden kann, solange Sie Ihre Testdaten nicht für das Modelltraining verwenden. Wenn Ihr Ergebnis niedrig ist, haben Sie wahrscheinlich Ihr Modell überarbeitet. Ihr Datensatz hat möglicherweise nur so viel Vorhersagekraft.
Cdeterman
Ist eine Kreuzvalidierung nicht einfach eine wiederholte Aufteilung in Training und Testsatz (zum Beispiel Testsatz, der die ersten 20%, die zweiten 20%, die dritten 20% usw. enthält, oder alle, die zufällig 20% ​​für Test n-mal auswählen und die durchschnittliche Genauigkeit berechnen)? und genau dasselbe tun, was Sie mit dem Test-Set beschreiben? Zeigen Sie es dem Algorithmus erst beim Test an?
Zelphir Kaltstahl
2
@Zelphir nein, jede Falte wird mit jeder Hyperparameterkombination mehrfach ausgewertet. Die einfache Auswahl des besten Ergebnisses führt wahrscheinlich zu höheren Ergebnissen als bei einem unabhängigen Testsatz. Die Idee ist zu sehen, welche Parameter sich über diese Falten verallgemeinern und welche Architektur für ein Test-Set verwendet wird, um festzustellen, wie 'verallgemeinerbar' das Modell ist.
Cdeterman
1
Ich möchte hinzufügen, dass der Vorgang des Betrachtens der Leistung Ihres unabhängigen Test-Sets und der Entscheidung , Ihr Modell erneut zu trainieren, Ihr Test-Set nicht mehr vollständig unabhängig macht . In der Tat können Sie dies unendlich oft tun, bis Sie die perfekte Genauigkeit erhalten. Für den wissenschaftlichen Bezug empfehle ich das Buch "Lernen aus Daten", es gibt auch einen kostenlosen Online-Kurs des Autors ( work.caltech.edu/telecourse.html ).
Michael
4

Wenn Sie lediglich ein Modell mit Standardeinstellungen für das unformatierte oder minimal vorverarbeitete Dataset trainieren möchten (z. B. One-Hot-Codierung und / oder Entfernen von NAs), benötigen Sie kein separates Test-Set. Sie können einfach Ihr Modell trainieren Trainieren Sie das Set und testen Sie es an Ihrem Validierungsset, oder noch besser, trainieren Sie das gesamte Set mithilfe der Kreuzvalidierung, um Ihre Leistung abzuschätzen.

Sobald Sie jedoch aufgrund Ihrer Kenntnis der Daten Änderungen an Ihrer ursprünglichen Strategie vorgenommen haben, haben Sie Ihr Ergebnis "verdorben". Einige Beispiele sind:

  • Modellauswahl: Sie haben Logistik-, Lasso-, Random Forest-, XGBoost- und Support-Vektor-Maschinen getestet und das beste Modell ausgewählt

  • Parametertuning: Sie haben einen XGBoost optimiert, um die optimalen Hyperparameter zu finden

  • Featureauswahl: Sie haben mit Rückwärtsauswahl, genetischem Algorithmus, Boruta usw. eine optimale Teilmenge von Features ausgewählt, die in Ihr Modell aufgenommen werden sollen

  • Fehlende Imputation: Sie haben fehlende Variablen mit dem Mittelwert oder mit einem einfachen Modell, das auf den anderen Variablen basiert, unterstellt

  • Feature-Transformation: Sie haben Ihre numerischen Variablen zentriert und skaliert, um sie durch einen Z-Score (Anzahl der Standardabweichungen vom Mittelwert) zu ersetzen.

In allen oben genannten Fällen liefert die Verwendung eines einzelnen Holdout-Sets oder sogar eine Kreuzvalidierung keine realistische Schätzung der tatsächlichen Leistung, da Sie Informationen verwenden, die Sie bei Ihrer Entscheidung nicht über zukünftige Daten verfügen. Stattdessen wählen Sie das beste Modell, die besten Hyperparameter, den besten Funktionsumfang usw. für Ihre Daten aus, und es ist wahrscheinlich, dass Sie Ihre Strategie leicht an Ihre Daten anpassen. Um eine ehrliche Schätzung der tatsächlichen Leistung zu erhalten, müssen Sie diese anhand von Daten bewerten, die überhaupt nicht in den Entscheidungsprozess eingegangen sind. Daher wird üblicherweise ein unabhängiger Testsatz verwendet, der von Ihrem Training (Modellierung) und Ihrer Validierung ( Auswahl eines Modells, Features, Hyperparameters usw.).

Alternativ zum Anhalten eines Testsatzes können Sie stattdessen eine Technik verwenden, die als verschachtelte Kreuzvalidierung bezeichnet wird. Dies erfordert, dass Sie Ihre gesamte Modellierungsstrategie (Transformation, Imputation, Feature-Auswahl, Modellauswahl, Hyperparameter-Optimierung) als nicht parametrische Funktion codieren und dann eine Kreuzvalidierung für diese gesamte Funktion durchführen, als wäre es einfach eine Modellanpassungsfunktion. Dies ist in den meisten ML-Paketen schwierig zu tun, kann aber mit dem mlr-Paket recht einfach in R implementiert werden, indem Sie Wrapper verwenden, um Ihre Trainingsstrategie zu definieren, und dann Ihren eingepackten Lerner erneut abtasten:

https://mlr.mlr-org.com/articles/tutorial/nested_resampling.html

Aaron Cooley
quelle
1

Ich gehe davon aus, dass Sie eine Klassifizierung durchführen.

Nehmen Sie Ihre Daten und teilen Sie sie zu 70/30 in trainingData / testData-Teilmengen auf. Nehmen Sie die Teilmenge trainingData und teilen Sie sie erneut in die Teilmengen trainingData / validateData auf. Jetzt haben Sie 3 Teilmengen Ihrer ursprünglichen Daten - trainingData (.7 * .7), validateData (.7 * .3) und testData (.3).

Sie trainieren Ihr Modell mit trainingData. Anschließend überprüfen Sie die Leistung des Modells mithilfe von validateData, das wir als unabhängig von trainingData betrachten können, und geben daher eine gute Einschätzung darüber ab, wie gut das Modell verallgemeinert ist. Nehmen wir an, Sie erreichen eine Genauigkeit von 75%.

Jetzt trainieren Sie Ihr Modell beliebig oft neu. Bei jeder Umschulung bewerten Sie einen anderen Satz von Hyperparametern (die Parameter, die in erster Linie Ihrem Modell zugeführt werden, im Vergleich zu denen, für die Ihr Modell optimiert ist), verwenden jedoch weiterhin den Teilsatz "trainingData". Bei jeder Umschulung überprüfen Sie außerdem erneut, wie gut sich das neue Modell verallgemeinert, indem Sie die Leistung von validateData überprüfen.

Nachdem Sie jede Kombination von Hyperparametern überprüft haben, die Sie bewerten möchten, wählen Sie den Satz von Hyperparametern aus, mit dem Sie bei validateData die beste Leistung erzielt haben. Nehmen wir an, Ihre beste Leistung bei validateData lag bei einer Genauigkeit von 80%. Dies sind Ihre endgültigen Hyperparameter, und das von diesen Hyperparametern definierte Modell wird für diesen nächsten Schritt verwendet.

Nun nehmen Sie das Modell, das Ihre endgültigen Hyperparameter verwendet, und werten testData aus. Dies ist das erste Mal seit Beginn dieses Prozesses, dass testData berührt wurde! Wenn Sie eine Leistung von testData erhalten, die mit Ihrer Leistung von validateData vergleichbar ist (obwohl diese normalerweise etwas geringer ist), können Sie sicher sein, dass Ihr Modell wie erwartet funktioniert und sich gut verallgemeinert! In diesem Fall ist dies Ihr endgültiges Modell!

Warum das alles? Sie versuchen, eine Überanpassung zu vermeiden. Es besteht immer die Gefahr, dass Sie die Daten, die Sie beim Trainieren und Optimieren Ihres Modells verwenden, zu stark anpassen. Wenn Sie mit nur einem Datensatz trainieren, optimieren (validieren) und testen, besteht eine gute Chance, dass Sie diese Daten überanpassen und sie nicht verallgemeinern. Indem Sie Trainings- und Testdatensätze aufteilen (und davon ausgehen, dass Sie die Testdaten verwenden), haben Sie die Möglichkeit, sich selbst intern zu überprüfen, aber es besteht immer noch die Möglichkeit, dass Sie die Testdaten nur überanpassen. Aus diesem Grund brechen wir einen dritten Datensatz auf, validieren ihn, damit wir uns intern aufrichtig halten können. Das Optimieren mit validateData verhindert, dass wir zu trainingData überanpassen. Das abschließende Testen mit testData verhindert, dass wir übermäßig an validateData anpassen.

John D
quelle
Inwiefern unterscheidet sich diese Antwort von der akzeptierten Antwort ?
Jan Kukacka
In der ursprünglichen Frage wird explizit nach einem Workflow gefragt, der keine Kreuzvalidierung enthält. Ich las seine Frage, um zu fragen, wie es funktioniert und warum es zuverlässig ist. In der akzeptierten Antwort wird ein Workflow beschrieben, der noch eine Gegenprüfung enthält. Ich wollte erklären, wie Leute es machen, ohne unbedingt eine Kreuzvalidierung zu verwenden, falls jemand ein Anfänger ist und vielleicht noch nicht an diesem Punkt ist. Es tut mir leid, wenn das Posten falsch ist - ich bin ein neuer Benutzer und möchte nicht gegen eine Regel verstoßen haben.
John D
0

Betrachten wir es folgendermaßen

  1. Gang und gäbe sein

    a) Trainingsdaten - werden zur Auswahl der Modellparameter verwendet.

     i) E.g., finding intercept and slope parameters for an ordinary linear 
        regression model. 
    
     ii) The noise in the training data-set is used in some extent 
         in over-fitting model parameters. 
    

    b) Validierungsdaten - werden zur Auswahl von Hyperparametern verwendet.

     i)  E.g., we may want to test three different models at step 1.a, say 
         linear model with one, two or three variables.   
    
     ii) The validation data-set is independent from training data, and thus, they provide 
         'unbiased' evaluation to the models, which help to decide which 
         hyper-parameter to use. 
    
     iii) We note that, a model trained in 1.a, say y = b_0+b_1*x_1, does 
         not learn anything from this data-set. So, the noise in this data- 
         set is not used to over-fit the parameters (b_0, b_1), but, over- 
         fit exists in choosing which linear model to use (in terms of 
         number of variables). 
    

    c) Testdaten - werden verwendet, um das Vertrauen in die Ausgabe der beiden obigen Schritte zu gewinnen

    i) Used once a model is completely trained
    
  2. Eine andere Sichtweise auf Teil 1

    a) Unser Modellkandidatenpool ist eine 5-Dimenson-Menge, dh

    i) Dimension 1: number of variables to keep in the regression model, 
       e.g., [1, 2, 3].
    
    ii) Dimension 2-5: (b_0, b_1, b_2, b_3). 
    

    b) In Schritt 1a werden die Modellkandidaten von 5-dimensional auf 1-dimensional reduziert.

    c) In Schritt 1b werden Modellkandidaten von 1-Dimension auf 0-Dimension reduziert, was ein einzelnes Modell ist.

    d) Möglicherweise ist das OP jedoch der Ansicht, dass die obige „endgültige“ Ausgabe im Testdatensatz nicht gut genug funktioniert, und wiederholt daher den gesamten Prozess erneut, z. Dann wird der Testdatensatz mehrmals verwendet, und daher kann das Rauschen in diesen Daten zu einer gewissen Überanpassung bei der Entscheidung führen, ob eine lineare Regression oder eine Kammregression verwendet wird.

    e) Um mit einem hochdimensionalen Modellpool mit Parametern, Hyperparametern, Modelltypen und Vorverarbeitungsmethoden umzugehen, definiert jede Aufteilung der uns zur Verfügung stehenden Daten im Wesentlichen einen Entscheidungsprozess, der

    i)  Sequentially reducing the model pool to zero-dimension.
    
    ii) Allocating data noise overfitting to different steps of dimension 
        reductions (overfitting the noise in the data is not avoidable but 
        could be allocated smartly). 
    
  3. Schlussfolgerung und Antworten auf die Frage von OP

    a) Bei Two-Split (Training und Test), Three-Split (Training, Validierung und Test) oder einer höheren Split-Anzahl geht es im Wesentlichen um die Reduzierung der Dimensionalität und die Zuordnung der Daten (insbesondere Rauschen und das Risiko einer Überanpassung).

    b) Irgendwann können Sie einen „endgültigen“ Modellkandidatenpool erstellen und sich dann überlegen, wie Sie den Prozess der sequenziellen Reduzierung der Dimension so gestalten können, dass

    i) At each step of reducing the dimensions, the output is satisfactory, 
      e.g., not using just 10 data points with large noise to estimate a 
      six-parameter liner model. 
    
    ii) There are enough data for you to reduce the dimension to zero 
       finally. 
    

    c) Was ist, wenn Sie nicht erreichen können? b

    i) Use model and data insight to reduce the overall dimensionality of 
      your model pool. E.g., liner regression is sensitive to outliers thus 
      not good for data with many large outliers. 
    
    ii) Choose robust non-parametric models or models with less number of 
       parameter if possible. 
    
    iii) Smartly allocating the data available at each step of reducing the 
        dimensionality. There is some goodness of fit tests to help us decide 
        whether the data we use to train the model is enough or not. 
    
Labyrinth
quelle