Wie kann der Datensatz für die Kreuzvalidierung, Lernkurve und Endbewertung aufgeteilt werden?


70

Was ist eine geeignete Strategie zur Aufteilung des Datensatzes?

Ich bitte um Feedback zu dem folgenden Ansatz (nicht zu den einzelnen Parametern wie test_sizeoder n_iter, aber wenn ich verwende X, y, X_train, y_train, X_test, und in y_testgeeigneter Weise und wenn die Sequenz macht Sinn):

(Erweiterung dieses Beispiels aus der Scikit-Learn-Dokumentation)

1. Laden Sie den Datensatz

from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target

2. Aufteilen in Trainings- und Test-Set (zB 80/20)

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

3. Schätzer auswählen

from sklearn.svm import SVC
estimator = SVC(kernel='linear')

4. Wählen Sie den Kreuzvalidierungsiterator

from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)

5. Optimieren Sie die Hyperparameter

Anwenden des Kreuzvalidierungsiterators auf den Trainingssatz

from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)

6. Debug-Algorithmus mit Lernkurve

X_trainwird zufällig 10-mal in ein Training und ein Test-Set aufgeteilt ( n_iter=10). Jeder Punkt auf der Trainings-Score-Kurve ist der Durchschnitt von 10 Scores, bei denen das Modell an den ersten i Trainingsbeispielen trainiert und bewertet wurde . Jeder Punkt in der Kreuzvalidierungs-Bewertungskurve ist der Durchschnitt von 10 Bewertungen, bei denen das Modell an den ersten i Trainingsbeispielen trainiert und an allen Beispielen des Testsatzes bewertet wurde.

from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()

Lernkurve

plot_learning_curve () ist in der aktuellen Entwicklerversion von scikit-learn (0.15-git) enthalten.

7. Abschließende Bewertung des Testsatzes

classifier.score(X_test, y_test)

7a. Testüberanpassung in der Modellauswahl mit verschachtelter Kreuzvalidierung (unter Verwendung des gesamten Datensatzes)

from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)

Zusätzliche Frage: Ist es sinnvoll, Schritt 7 durch eine verschachtelte Kreuzvalidierung zu ersetzen? Oder sollte ein verschachtelter Lebenslauf als Ergänzung zu Schritt 7 angesehen werden?

(Der Code scheint mit der k-fachen Kreuzvalidierung in Scikit-Learn zu funktionieren, aber nicht mit Shuffle & Split. Er cvmuss oben geändert werden, damit der Code funktioniert.)

8. Trainieren Sie das endgültige Modell für den gesamten Datensatz

classifier.fit(X, y)

EDIT: Ich stimme jetzt der Überzeugung zu, dass Schritt 7a in dieser Reihenfolge nicht viel Sinn macht. Also würde ich das nicht übernehmen.


Welche Genauigkeitsregel verwenden Sie? Wenn es sich um eine Klassifizierungsgenauigkeit handelt, macht eine solche falsche Bewertungsregel einen Großteil der von Ihnen geleisteten Arbeit rückgängig.
Frank Harrell

Ich habe die Standardeinstellung verwendet, die in der Tat die Klassifizierungsgenauigkeit ist. Ich weiß, dass zB F1 angemessener wäre. Aber hier interessiert mich nur, ob die Splits in Ordnung sind.
Tipp

3
Ich bin mir fast sicher, dass F1 ein neuer Name für ein altes Konzept ist. Ich halte es für kontraproduktiv, neue Namen für alte Dinge zu erfinden. Noch wichtiger ist, dass es sich um eine falsche Bewertungsregel handelt, die dazu führt, dass die falschen Features ausgewählt werden und der gesamte Prozess mit viel Rauschen versehen wird.
Frank Harrell

3
... auf jeden Fall teilt F1 die Genauigkeitsprobleme, auf die @FrankHarrell anspielt: Diese ergeben sich aus der Zählung von Bruchteilen von Testfällen mit harten Klassifikationen. Um eine der richtigen Bewertungsregeln von Frank zu erhalten, müssen Sie auf die probabilistische Ausgabe der SVM umschalten und dann z. B. Briers Punktzahl (mittlerer quadratischer Fehler) anstelle der Genauigkeit verwenden. Ich vermute, Sie könnten auch eine MSE-Version von F1 ableiten. Solche Maßnahmen sollten in der Tat besser für den Abstimmungsschritt sein. Für die Kommunikation der endgültigen Leistung benötigen Sie möglicherweise auch die typischen Methoden (z. B. Genauigkeit, F1), um die Leistung für Ihre Community auszudrücken.
cbeleites

1
@ ta.ft: Ob der Ansatz falsch ist oder nicht, hängt davon ab, was Sie für falsch halten: Die Gittersuche nach Proportionen birgt ein ernstes Risiko, Abweichungen zu überfliegen, es sei denn, Sie haben eine lächerlich große Anzahl unabhängiger Fälle. In vielen Situationen ist die Behauptung, dass die Rastersuche das optimale Modell ergibt, falsch. Wenn Sie jedoch eine ordnungsgemäße verschachtelte Validierung durchführen, gibt die äußere Validierung ein ehrliches Maß für die Leistung des ausgewählten "optimalen" Modells. Das ist also nicht falsch. Sie können nur nicht garantieren, dass die Rastersuche das optimale Modell erhalten hat. Bezüglich der Literatur werde ich meine Antwort aktualisieren.
cbeleites

Antworten:


41

Ich bin nicht sicher, was Sie in Schritt 7a tun möchten. So wie ich es jetzt verstehe, ergibt es für mich keinen Sinn.

So verstehe ich Ihre Beschreibung: In Schritt 7 möchten Sie die Hold-out-Leistung mit den Ergebnissen einer Kreuzvalidierung vergleichen, die die Schritte 4 bis 6 umfasst (also ja, das wäre eine verschachtelte Konfiguration).

Die Hauptgründe, warum ich diesen Vergleich nicht für sinnvoll halte, sind:

  • Dieser Vergleich kann nicht zwei der Hauptquellen für überoptimistische Validierungsergebnisse aufdecken, die ich in der Praxis erlebe:

    • Datenlecks (Abhängigkeit) zwischen Trainings- und Testdaten, die durch eine hierarchische (auch als Cluster bezeichnete) Datenstruktur verursacht werden und bei der Aufteilung nicht berücksichtigt werden. In meinem Bereich haben wir in der Regel mehrere (manchmal Tausende) Ablesungen (= Zeilen in der Datenmatrix) desselben Patienten oder ein biologisches Replikat eines Experiments. Diese sind nicht unabhängig, daher muss die Aufteilung der Validierung auf Patientenebene erfolgen. Wenn jedoch ein solches Datenleck auftritt, haben Sie es sowohl in der Aufteilung für das Hold-Out-Set als auch in der Kreuzvalidierungsaufteilung. Hold-out wäre dann genauso optimistisch eingestellt wie Cross-Validation.

    • Vorverarbeitung der Daten in der gesamten Datenmatrix, wobei die Berechnungen nicht für jede Zeile unabhängig sind, sondern für die Berechnungsparameter für die Vorverarbeitung viele / alle Zeilen verwendet werden. Typische Beispiele wären zB eine PCA-Projektion vor der "tatsächlichen" Klassifizierung.
      Dies würde sich wiederum sowohl auf Ihre Wartezeit als auch auf die äußere Kreuzvalidierung auswirken, sodass Sie sie nicht erkennen können.

    Bei den Daten, mit denen ich arbeite, können beide Fehler leicht dazu führen, dass der Bruchteil der Fehlklassifizierungen um eine Größenordnung unterschätzt wird!

  • Wenn Sie sich auf diesen gezählten Bruchteil der Leistung von Testfällen beschränken, benötigen Modellvergleiche entweder eine extrem große Anzahl von Testfällen oder lächerlich große Unterschiede in der tatsächlichen Leistung. Der Vergleich von 2 Klassifikatoren mit unbegrenzten Trainingsdaten kann ein guter Anfang für das weitere Lesen sein.

Ein Vergleich der Modellqualität, die die innere Kreuzvalidierung für das "optimale" Modell und die äußere Kreuzvalidierung oder Hold-out-Validierung vorgibt, ist jedoch sinnvoll: Wenn die Diskrepanz hoch ist, ist es fraglich, ob Ihre Optimierung der Rastersuche funktioniert hat (was Sie möglicherweise getan haben) Varianz aufgrund der hohen Varianz des Leistungsmaßes). Dieser Vergleich ist einfacher, da Sie Probleme erkennen können, wenn Ihre innere Einschätzung im Vergleich zur anderen lächerlich gut ist. Wenn dies nicht der Fall ist, müssen Sie sich nicht so viele Gedanken über Ihre Optimierung machen. Aber in jedem Fall haben Sie, wenn Ihre äußere (7) Messung der Leistung ehrlich und solide ist, zumindest eine nützliche Schätzung des erhaltenen Modells, ob es optimal ist oder nicht.

Meiner Meinung nach ist das Messen der Lernkurve noch ein anderes Problem. Ich würde das wahrscheinlich separat behandeln, und ich denke, Sie müssen klarer definieren, wofür Sie die Lernkurve benötigen (benötigen Sie die Lernkurve für einen Datensatz des gegebenen Problems, der Daten und der Klassifizierungsmethode oder der Lernkurve?) für diesen Datensatz des gegebenen Problems, Daten und Klassifizierungsverfahrens) und eine Reihe weiterer Entscheidungen (z. B. wie mit der Modellkomplexität als Funktion der Trainingsstichprobengröße umgegangen werden soll? Erneut optimieren, feste Hyperparameter verwenden, festlegen Funktion zum Fixieren von Hyperparametern je nach Trainingssetgröße?)

(Meine Daten enthalten normalerweise so wenige unabhängige Fälle, dass die Messung der Lernkurve so genau ist, dass sie in der Praxis verwendet werden kann. Sie sind jedoch möglicherweise besser beraten, wenn Ihre 1200 Zeilen tatsächlich unabhängig sind.)


update: Was ist "falsch" am Beispiel von Scikit-Learn?

Erstens ist hier nichts falsch an verschachtelter Kreuzvalidierung. Die verschachtelte Validierung ist für die datengesteuerte Optimierung von größter Bedeutung, und die Kreuzvalidierung ist ein sehr leistungsfähiger Ansatz (insbesondere, wenn sie iteriert / wiederholt wird).

Ob überhaupt etwas falsch ist, hängt von Ihrer Sichtweise ab: Solange Sie eine ehrliche verschachtelte Validierung durchführen (wobei die äußeren Testdaten streng unabhängig bleiben), ist die äußere Validierung ein angemessenes Maß für die Leistung des "optimalen" Modells. Daran ist nichts auszusetzen.

Bei der Rastersuche dieser proportionalen Leistungsmessungen für die Hyperparameter-Optimierung von SVM können und können jedoch mehrere Dinge schief gehen. Grundsätzlich bedeutet dies, dass Sie sich (wahrscheinlich?) Nicht auf die Optimierung verlassen können. Trotzdem haben Sie eine ehrliche Einschätzung der Leistung des erhaltenen Modells, solange Ihr äußerer Split ordnungsgemäß durchgeführt wurde, auch wenn das Modell nicht das bestmögliche ist.

Ich werde versuchen, intuitive Erklärungen zu geben, warum die Optimierung Probleme bereiten kann:

  • Mathematisch / statistisch gesehen besteht das Problem bei den Proportionen darin, dass die gemessenen Proportionen aufgrund der endlichen Stichprobengröße einer großen Varianz unterliegen (abhängig auch von der tatsächlichen Leistung des Modells, ):p^np
    Var(p^)=p(1p)n

    Sie brauchen lächerlich viele Fälle (zumindest im Vergleich zu der Anzahl der Fälle, die ich normalerweise haben kann), um die erforderliche Präzision (Bias / Varianz-Sinn) für die Schätzung des Erinnerungsvermögens und der Präzision (maschinelles Lernen, Leistungssinn) zu erreichen. Dies gilt natürlich auch für Verhältnisse, die Sie aus solchen Anteilen berechnen. Sehen Sie sich die Konfidenzintervalle für Binomialverhältnisse an. Sie sind schockierend groß! Oftmals größer als die tatsächliche Verbesserung der Leistung gegenüber dem Hyperparameter-Raster. Und statistisch gesehen ist die Gittersuche ein massives Mehrfachvergleichsproblem: Je mehr Punkte des Gitters Sie auswerten, desto höher ist das Risiko, eine Kombination von Hyperparametern zu finden, die für den von Ihnen bewerteten Zug / Test-Split versehentlich sehr gut aussieht. Das meine ich mit Skimming Varianz.

  • Man betrachte intuitiv eine hypothetische Änderung eines Hyperparameters, die langsam zu einer Verschlechterung des Modells führt: Ein Testfall nähert sich der Entscheidungsgrenze. Die Leistungskennzahlen für den „harten“ Anteil erkennen dies erst, wenn der Fall die Grenze überschreitet und auf der falschen Seite ist. Dann weisen sie jedoch sofort einen vollen Fehler für eine unendlich kleine Änderung des Hyperparameters zu.
    Um eine numerische Optimierung durchführen zu können, muss sich das Leistungsmaß gut verhalten. Das heißt: Weder der sprunghafte (nicht stetig differenzierbare) Teil des verhältnismäßigen Leistungsmaßes noch die Tatsache, dass außer diesem Sprung tatsächlich auftretende Veränderungen nicht erkannt werden, sind für die Optimierung geeignet.
    Richtige Bewertungsregeln werden auf eine Weise definiert, die für die Optimierung besonders geeignet ist. Sie haben ihr globales Maximum, wenn die vorhergesagten Wahrscheinlichkeiten mit den tatsächlichen Wahrscheinlichkeiten für jeden Fall übereinstimmen, um zu der fraglichen Klasse zu gehören.

  • Bei SVMs besteht das zusätzliche Problem, dass nicht nur die Leistungsmessungen, sondern auch das Modell auf diese unruhige Weise reagieren: Kleine Änderungen des Hyperparameters ändern nichts. Das Modell ändert sich nur, wenn die Hyperparameter so stark geändert werden, dass ein Fall entweder nicht mehr Support-Vektor ist oder Support-Vektor wird. Auch solche Modelle sind schwer zu optimieren.

Literatur:


Update II: Skimming Varianz

Was Sie sich im Modellvergleich leisten können, hängt natürlich von der Anzahl der unabhängigen Fälle ab. Lassen Sie uns hier eine schnelle und unsaubere Simulation des Risikos von Skimming-Abweichungen durchführen:

scikit.learnsagt, dass sie 1797 in den digitsDaten haben.

  • Nehmen wir an, dass 100 Modelle verglichen werden, z. B. ein Raster für 2 Parameter.10×10
  • davon ausgehen, dass beide Parameter (Bereiche) die Modelle überhaupt nicht beeinflussen,
  • dh alle Modelle haben die gleiche tatsächliche Leistung von beispielsweise 97% (typische Leistung für den digitsDatensatz).

  • Führen Sie Simulationen zum "Testen dieser Modelle" mit einer Stichprobengröße von 1797 Zeilen im Datensatz durch104digits

    p.true = 0.97 # hypothetical true performance for all models
    n.models = 100 # 10 x 10 grid
    
    n.rows = 1797 # rows in scikit digits data
    
    sim.test <- replicate (expr= rbinom (n= nmodels, size= n.rows, prob= p.true), 
                           n = 1e4)
    sim.test <- colMaxs (sim.test) # take best model
    
    hist (sim.test / n.rows, 
          breaks = (round (p.true * n.rows) : n.rows) / n.rows + 1 / 2 / n.rows, 
          col = "black", main = 'Distribution max. observed performance',
          xlab = "max. observed performance", ylab = "n runs")
    abline (v = p.outer, col = "red")
    

Hier ist die Verteilung für die beste beobachtete Leistung:

Skimming-Varianz-Simulation

Die rote Linie kennzeichnet die tatsächliche Leistung aller unserer hypothetischen Modelle. Im Durchschnitt beobachten wir nur 2/3 der wahren Fehlerrate für die scheinbar besten der 100 verglichenen Modelle (für die Simulation wissen wir, dass sie alle mit 97% korrekten Vorhersagen gleich gut abschneiden).

Diese Simulation ist offensichtlich sehr vereinfacht:

  • Neben der Varianz der Stichprobengröße gibt es mindestens die Varianz aufgrund von Modellinstabilität, daher unterschätzen wir die Varianz hier
  • Parameter, die sich auf die Modellkomplexität auswirken, decken in der Regel Parametersätze ab, bei denen die Modelle instabil sind und daher eine hohe Varianz aufweisen.
  • Für die UCI-Ziffern aus dem Beispiel hat die ursprüngliche Datenbank ca. 11000 Ziffern von 44 Personen geschrieben. Was ist, wenn die Daten nach der Person gruppiert werden, die sie geschrieben hat? (Dh es ist einfacher, eine von jemandem geschriebene 8 zu erkennen, wenn Sie wissen, wie diese Person beispielsweise eine 3 schreibt?) Die effektive Stichprobengröße kann dann so niedrig wie 44 sein.
  • Das Optimieren von Modell-Hyperparametern kann zu einer Korrelation zwischen den Modellen führen (was aus der Perspektive der numerischen Optimierung als gut angesehen wird). Es ist schwierig, den Einfluss davon vorherzusagen (und ich vermute, dass dies unmöglich ist, ohne den tatsächlichen Typ des Klassifikators zu berücksichtigen).

Im Allgemeinen erhöhen jedoch sowohl die geringe Anzahl unabhängiger Testfälle als auch die hohe Anzahl verglichener Modelle die Verzerrung. Das Papier von Cawley und Talbot liefert auch empirisch beobachtetes Verhalten.


@cbleites: Wenn die Rastersuche möglicherweise keine geeignete Methode zum Finden des optimalen Modells ist, welche Methode sollte ich dann wählen?
Tipp

1
@ ta.ft: Zwei Ansätze sind: a) Integrieren Sie so viel externes Wissen über Ihre Anwendung und Daten in die Modellierung, um die Anzahl der zu vergleichenden Modelle drastisch zu reduzieren (= Hyperparameter entscheiden statt optimieren). Es kann insgesamt besser sein, zu einem Klassifikator zu wechseln, der an sich bedeutsame Hyperparameter aufweist, dh wo Sie anhand der Anwendung und des Datentyps wissen können, wie der Hyperparameter (ungefähr) sein sollte. b) Vergleichen Sie die wenigen verbleibenden Modelle nach der richtigen Bewertungsregel. Beispielsweise hat der Briers-Score für viele Klassifikatoren weitaus bessere Varianz-Eigenschaften.
Glaube

1
Sie können die Optimierung auch ablehnen (über Entscheidungen (a)). Wenn Sie einen ausreichend guten Klassifikator erhalten und behaupten können, dass Sie angesichts der verfügbaren Stichprobengröße keine Chance haben, die Überlegenheit eines anderen Klassifikators zu beweisen (z. B. führen Sie einige Demo-McNemar-Berechnungen durch, und suchen Sie die erforderliche Stichprobengröße für Proportionsvergleiche für einen hypothetisch besseren Klassifikator - es gibt Eine gute Chance, dass diese auch für lächerlich große hypothetische Verbesserungen lächerlich groß sein werden. Sie können argumentieren, dass Optimierung keinen Sinn ergibt und nur die Gefahr einer Überanpassung besteht.
Glaube

Ich stimme Ihnen in Bezug auf "Skimming Varianz" nicht zu. Wenn Sie viele Punkte für die Hyperparameteroptimierung im Raster haben, kann ein Punkt in einer Falte des Lebenslaufs opportunistisch Glück haben. Wenn Sie jedoch beispielsweise einen 10-fachen Lebenslauf haben, ist es unwahrscheinlich, dass ein Parametersatz versehentlich auf allen 10-fachen Lebensläufen Glück hat.
RNA

1
@RNA: Die Wahrscheinlichkeit, in allen Falten "glücklich" zu sein, hängt direkt mit der Gesamtzahl der Fälle (in allen 10 Falten) zusammen, und in der Regel wird nur der Durchschnitt über alle diese Falten berücksichtigt. Ich habe die Antwort mit einer Simulation einer hypothetischen Auswahl der besten von 100 Modellen (z. B. 2 Hyperparameter mit jeweils 10 Schritten) aktualisiert, was bereits mit einer erheblichen Verzerrung des Beispielszenarios verbunden ist (Fehlerquote um 1/3 zu niedrig). . Viele Leute hier haben selten ein paar tausend unabhängige Fälle zur Hand - zB ich habe selten sogar die 44 Personen, die Ziffern für den vollständigen UCI-Ziffern-Datensatz geschrieben haben.
Glaube
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.