Wie verwende ich die Ausgabe von GridSearch?

23

Momentan arbeite ich mit Python und Scikit, lerne für Klassifizierungszwecke und lese etwas über GridSearch. Ich dachte, dies wäre eine großartige Möglichkeit, meine Schätzparameter zu optimieren, um die besten Ergebnisse zu erzielen.

Meine Methodik ist folgende:

  1. Teilen Sie meine Daten in Training / Test.
  2. Verwenden Sie GridSearch mit 5-facher Kreuzvalidierung, um meine Schätzer zu trainieren und zu testen (Random Forest, Gradient Boost, SVC ua), um die besten Schätzer mit der optimalen Kombination von Hyperparametern zu erhalten.
  3. Ich berechne dann Metriken für jeden meiner Schätzer, wie z. B. Präzision, Rückruf, FMeasure und Matthews-Korrelationskoeffizient, wobei ich meinen Testsatz verwende, um die Klassifizierungen vorherzusagen und sie mit tatsächlichen Klassenbeschriftungen zu vergleichen.

In diesem Stadium sehe ich seltsames Verhalten und bin mir nicht sicher, wie ich vorgehen soll. Nehme ich den .best_estimator_ aus der GridSearch und verwende diesen als "optimale" Ausgabe der Rastersuche und führe eine Vorhersage mit diesem Schätzer durch? Wenn ich das tue, stelle ich fest, dass die Metriken der Stufe 3 normalerweise viel niedriger sind, als wenn ich einfach alle Trainingsdaten trainiere und auf dem Test-Set teste. Oder nehme ich einfach das ausgegebene GridSearchCV-Objekt als neuen Schätzer ? Wenn ich das tue, erhalte ich bessere Ergebnisse für meine Metriken der Stufe 3, aber es scheint seltsam, ein GridSearchCV-Objekt anstelle des beabsichtigten Klassifikators zu verwenden (z. B. eine zufällige Gesamtstruktur) ...

EDIT: Meine Frage ist also, was ist der Unterschied zwischen dem zurückgegebenen GridSearchCV-Objekt und dem Attribut .best_estimator_? Welche davon soll ich zur Berechnung weiterer Kennzahlen verwenden? Kann ich diese Ausgabe wie einen regulären Klassifikator verwenden (z. B. unter Verwendung von Predict) oder wie soll ich sie verwenden?

Dan Carter
quelle

Antworten:

27

Beschlossen, wegzugehen und die Antworten zu finden, die meine Frage befriedigen würden, und sie hier für alle anderen zu schreiben, die sich fragen.

Das Attribut .best_estimator_ ist eine Instanz des angegebenen Modelltyps, die die 'beste' Kombination der angegebenen Parameter aus dem param_grid aufweist. Ob diese Instanz nützlich ist oder nicht, hängt davon ab, ob der refit-Parameter auf True gesetzt ist (dies ist standardmäßig der Fall). Beispielsweise:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
optimised_random_forest = clf.best_estimator_
return optimised_random_forest

Gibt einen RandomForestClassifier zurück. Dies ist alles ziemlich klar aus der Dokumentation . Was in der Dokumentation nicht klar ist, ist, warum die meisten Beispiele den .best_estimator_ nicht speziell verwenden und dies stattdessen tun:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
return clf

Dieser zweite Ansatz gibt eine GridSearchCV-Instanz zurück, die alle Details der GridSearchCV-Instanz enthält, z.

Optimised Random Forest Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]
GridSearchCV Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]

Es wird nur die gleiche beste Schätzinstanz verwendet, wenn Vorhersagen getroffen werden. In der Praxis gibt es also keinen Unterschied zwischen diesen beiden, es sei denn, Sie möchten speziell nur die Schätzerinstanz selbst. Als Randnotiz, meine Unterschiede in den Metriken hatten nichts mit einer fehlerhaften Klassengewichtungsfunktion zu tun.

Dan Carter
quelle
Danke für deinen Beitrag @Dan, er ist sehr hilfreich. Ich wollte Sie um eine Klarstellung bitten. Im letzteren Fall, wenn ich refit=Falsedann clf.fitnicht mit dem besten Klassifikator fertig bin ?
Poete Maudit
@PoeteMaudit Der refit-Parameter weist die GridSearchCV-Funktion an, die besten gefundenen Parameter zu verwenden und das Modell anhand dieser Parameter für den gesamten Datensatz neu zu trainieren. Wenn refit = False ist, ist laut der Dokumentation best_estimator nicht verfügbar: scikit-learn.org/stable/modules/generated/…
Dan Carter
0

Mit GridSearchCV können Sie einen Schätzer mit einer Präambel für die Rastersuche kombinieren, um Hyperparameter zu optimieren. Die Methode wählt den optimalen Parameter aus der Rastersuche aus und verwendet ihn mit dem vom Benutzer ausgewählten Schätzer. GridSearchCV erbt die Methoden vom Klassifizierer. Sie können also die Methoden .score, .predict usw. direkt über die GridSearchCV-Schnittstelle verwenden. Wenn Sie die besten durch die Rastersuche identifizierten Hyperparameter extrahieren möchten, können Sie .best_params_ verwenden. Dadurch wird der beste Hyperparameter zurückgegeben. Sie können diesen Hyperparameter dann separat an Ihren Schätzer übergeben.

Die direkte Verwendung von .predict führt zu denselben Ergebnissen wie die Ermittlung des besten Hyperparameters durch .best_param_ und die anschließende Verwendung in Ihrem Modell. Wenn wir die Funktionsweise der Rastersuche verstehen, können wir erkennen, warum dies der Fall ist.


Rastersuche

Diese Technik wird verwendet, um die optimalen Parameter für einen Algorithmus zu finden. Dies sind NICHT die Gewichte oder das Modell, diese werden anhand der Daten gelernt. Dies ist offensichtlich ziemlich verwirrend, so dass ich zwischen diesen Parametern unterscheiden werde, indem ich einen Hyperparameter aufrufe.

Hyperparameter sind wie k in k-Nearest Neighbours (k-NN). Bei k-NN muss der Benutzer auswählen, welcher Nachbar bei der Berechnung der Entfernung berücksichtigt werden soll. Der Algorithmus stimmt dann einen Parameter, einen Schwellenwert, ab, um festzustellen, ob ein neues Beispiel in die erlernte Verteilung fällt. Dies erfolgt mit den Daten.

Wie wählen wir k?

Einige Leute gehen einfach mit Empfehlungen, die auf früheren Studien des Datentyps basieren. Andere verwenden die Rastersuche. Mit dieser Methode können Sie am besten bestimmen, welches k für Ihre Daten optimal ist.

Wie funktioniert es?

Zuerst müssen Sie ein Raster erstellen. Dies ist im Wesentlichen eine Reihe möglicher Werte, die Ihr Hyperparameter annehmen kann. Für unseren Fall können wir . Anschließend trainieren Sie Ihr k-NN-Modell für jeden Wert im Raster. Zuerst machst du 1-NN, dann 2-NN und so weiter. Für jede Iteration erhalten Sie einen Performance-Score, der angibt, wie gut Ihr Algorithmus mit diesem Wert für den Hyper-Parameter abschneidet. Nachdem Sie das gesamte Raster durchlaufen haben, wählen Sie den Wert aus, der die beste Leistung erbracht hat.[1,2,3,...,10]

Dies widerspricht den Grundsätzen, keine Testdaten zu verwenden !!

Du hättest absolut recht. Aus diesem Grund wird die Rastersuche häufig mit der Kreuzvalidierung gemischt. Damit wir die Testdaten vollständig getrennt halten, bis wir mit unseren Ergebnissen wirklich zufrieden sind und bereit zum Testen sind. fachen Kreuzvalidierung wird ein Trainingssatz in Teile aufgeteilt. Anschließend werden Falze trainiert und der ausgelassene Falz getestet. Für jeden Wert im Raster wird der Algorithmus mal neu trainiert , wobei jede Faltung ausgelassen wird. Dann wird die Leistung über jede Falte gemittelt und das ist die erzielte Leistung für diesen Hyperparameterwert.n n - 1 nnnn1n

Der ausgewählte Hyperparameterwert ist derjenige, der die höchste durchschnittliche Leistung über die n-Faltungen erzielt. Wenn Sie mit Ihrem Algorithmus zufrieden sind, können Sie ihn auf dem Testset testen. Wenn Sie direkt zum Testset gehen, riskieren Sie eine Überanpassung.

JahKnows
quelle
Hallo Jah, das ist eine gute Antwort, aber ich bin immer noch nicht der klügere in Bezug auf die Antwort auf meine Frage. Ich habe den Fragentitel und die Frage selbst aktualisiert, um die Dinge klarer zu machen.
Dan Carter
Schreiben Sie Ihre eigene Gittersuche. Es wird buchstäblich ein Array erstellt und anschließend eine for-Schleife um Ihr Modell hinzugefügt. Zeichnen Sie dann am Ende Ihrer for-Schleife die resultierende Leistung in einem Array auf. Nachdem Sie alle möglichen Werte in Ihrem Raster durchgegangen sind, sehen Sie sich die Leistungsreihen an und wählen Sie die beste aus. Das ist der optimale Wert für Ihren Hyperparameter. Das Verlassen auf integrierte Funktionen für die Grundlagen wird für Data Science dringend empfohlen. Die Daten variieren so stark und es ist das Beste, dass Sie die Kontrolle haben!
JahKnows
Das wäre ein guter Vorschlag, wenn ich nur einen Hyperparameter optimieren müsste, aber wenn ich 4 habe? 5? Eine 4/5 mal verschachtelte for-Schleife ist hässlich und ich sehe keine Notwendigkeit, das Rad hier neu zu erfinden, das wäre Zeitverschwendung, und es ist der Grund, warum solche Pakete existieren.
Dan Carter
Mit GridSearchCV können Sie einen Schätzer mit der GridSearchCV-Einstellung kombinieren. Es macht also genau das, was wir gerade besprochen haben. Anschließend wird der optimale Parameter ausgewählt und mit dem von Ihnen ausgewählten Schätzer verwendet. GridSearchCV erbt die Methoden vom Klassifizierer. Sie können also die Methoden .score, .predict usw. direkt über die GridSearchCV-Schnittstelle verwenden. Ich rate jedoch davon ab, einfachere Werkzeuge bedeuten weniger Kontrolle. Für etwas so Einfaches wie eine Rastersuche codiere es einfach selbst.
JahKnows
1
Diese Antwort behandelt nicht die Frage, die sich auf die Verwendung von GridSearchCV bezieht.
Hobbes