Unterschied zwischen fit und fit_transform in scikit_learn-Modellen?

110

Ich bin ein Neuling in der Datenwissenschaft und verstehe den Unterschied zwischen fitund fit_transformMethoden beim Scikit-Lernen nicht. Kann jemand einfach erklären, warum wir möglicherweise Daten transformieren müssen?

Was bedeutet es, das Modell an die Trainingsdaten anzupassen und in Testdaten umzuwandeln? Bedeutet dies beispielsweise, dass Sie kategoriale Variablen in Zahlen umwandeln und neue Features in Testdaten umwandeln?

Kaggle
quelle
@sds Die Antwort von oben gibt den Link zu dieser Frage.
Kaushal28
Wir wenden die Methode an und wenden sie fitan - den Trainingsdatensatz und den Testdatensatztraining datasettransformboth
Prakash Kumar

Antworten:

117

Um die Daten zu zentrieren (Mittelwert Null und Einheitsstandardfehler), subtrahieren Sie den Mittelwert und dividieren das Ergebnis durch die Standardabweichung.

x=xμσ

Das machen Sie mit dem Trainingsdatensatz. Dann müssen Sie jedoch die gleiche Transformation auf Ihr Testset anwenden (z. B. bei der Kreuzvalidierung) oder auf neu erhaltene Beispiele vor der Vorhersage. Sie müssen jedoch dieselben zwei Parameter und (Werte) verwenden, die Sie zum Zentrieren des Trainingssatzes verwendet haben.σμσ

Daher fit()berechnet jede sklearn-Transformation nur die Parameter (z. B. und im Fall von StandardScaler ) und speichert sie als internen Objektzustand. Anschließend können Sie seine Methode aufrufen , um die Transformation auf eine bestimmte Gruppe von Beispielen anzuwenden.σμσtransform()

fit_transform()verbindet diese beiden Schritte und wird für die anfängliche Anpassung von Parametern in der Trainingsmenge , es wird jedoch auch ein transformiertes . Intern ruft es nur zuerst und dann dieselben Daten auf.x 'xxfit()transform()

K3 --- rnc
quelle
1
Vielen Dank für Ihre Antwort. Nur eine Sache. Durch Parameter im Modell bedeutet es nicht für beispielhafte Steigung und Abfangen für Regression? Wenn Sie anpassen, sagen wir eine lineare Regression. Welche Parameter werden in die Anpassungsmethode eingepasst? Normalisierungsparameter oder Modellparameter wie Steigung und Achsenabschnitt?
Kaggle
1
Ich meine Parameter innerhalb der Transformationen ( und im Fall von StandardScaler). Die Methode der Transformation wird zurückgegeben. Siehe dieses Kapitel zur Imputation, zum Beispiel: scikit-learn.org/stable/modules/…σμσget_params()
K3 --- rnc
2
Mein vorheriger Kommentar ist eigentlich falsch. Im Falle einer linearen Regression sind die angepassten Parameter die coef_(dh Steigung und Achsenabschnitt), nicht die von get_params()(die stattdessen die Menge der Modellkonstruktorargumente mit ihren zugeordneten Werten zurückgibt).
K3 --- rnc
Gute Antwort! Ich bin auf Ihren Beitrag gestoßen, als ich nach diesem Thema gesucht habe, aber ich muss es klären. Bedeutet das, dass wir, wenn wir annehmen, dass wir jeden Satz nachfolgender Beispiele transformieren möchten, niemals aufrufen sollten, fit_transform()da dies uns nicht erlauben würde, auf den internen Objektstatus zuzugreifen, um nachfolgende Beispiele mit denselben Parametern zu transformieren, die mit fit()dem ursprünglichen Datensatz erhalten wurden? Dies ist beispielsweise der Fall, wenn Sie über einen Testdatensatz verfügen und den Testsatz so transformieren möchten, dass er an Ihren ausgebildeten Klassifizierer übergeben wird.
AKKA
Nachdem Sie angerufen haben t.fit_transform(train_data), t ist angebracht, so dass Sie sicher verwenden können t.transform(test_data).
K3 --- rnc
10

Die folgende Erklärung wird auf der Grundlage fit_transformder ImputerKlasse, aber die Idee ist das gleiche für fit_transformandere scikit_learn Klassen mögen MinMaxScaler.


transformErsetzt die fehlenden Werte durch eine Zahl. Standardmäßig ist diese Zahl das Mittel der Spalten einiger Daten, die Sie auswählen. Betrachten Sie das folgende Beispiel:

imp = Imputer()
# calculating the means
imp.fit([[1, 3], [np.nan, 2], [8, 5.5]])

Jetzt hat der Imputer gelernt, einen Mittelwert (1 + 8) / 2 = 4,5 für die erste Spalte und einen Mittelwert (2 + 3 + 5,5) / 3 = 3,5 für die zweite Spalte zu verwenden, wenn er auf zweispaltige Daten angewendet wird:

X = [[np.nan, 11], 
     [4,      np.nan], 
     [8,      2],
     [np.nan, 1]]
print(imp.transform(X))

wir bekommen

[[4.5, 11], 
 [4, 3.5],
 [8, 2],
 [4.5, 1]]

Also fitberechnet der Imputer aus einigen Daten die Mittelwerte der Spalten und transformwendet diese Mittelwerte auf einige Daten an (wobei nur fehlende Werte durch die Mittelwerte ersetzt werden). Wenn diese beiden Daten identisch sind (dh die Daten für die Mittelwertberechnung und die Daten, auf die die Mittelwerte angewendet werden), können Sie fit_transformim Grunde genommen a fitgefolgt von a verwenden transform.

Nun deine Fragen:

Warum müssen wir möglicherweise Daten transformieren?

"Aus verschiedenen Gründen enthalten viele reale Datasets fehlende Werte, die häufig als Leerzeichen, NaNs oder andere Platzhalter codiert sind. Solche Datasets sind jedoch nicht mit Schätzern kompatibel, bei denen Scikit-Learn vorausgesetzt wird, dass alle Werte in einem Array numerisch sind." ( Quelle )

Was bedeutet es, das Modell an die Trainingsdaten anzupassen und in Testdaten umzuwandeln?

Das fiteines Imputers hat nichts mit der fitVerwendung in der Modellmontage zu tun . Die Verwendung von Imputer fitfür Trainingsdaten berechnet also nur die Mittelwerte für jede Spalte von Trainingsdaten. Die Verwendung transformvon Testdaten ersetzt dann fehlende Werte von Testdaten durch Mittelwerte, die aus Trainingsdaten berechnet wurden.

LoMaPh
quelle
3

Fit_transform bedeutet für Laien, eine Berechnung und dann eine Transformation durchzuführen (z. B. die Mittelwerte der Spalten aus einigen Daten zu berechnen und dann die fehlenden Werte zu ersetzen). Für das Trainingsset müssen Sie also sowohl kalkulieren als auch transformieren.

Beim Testsatz wird beim maschinellen Lernen eine Vorhersage angewendet, die auf dem basiert, was während des Trainingssatzes gelernt wurde, sodass keine Berechnung erforderlich ist, sondern nur die Transformation ausgeführt wird.

Ashish Anand
quelle
3

Diese Methoden werden für Dataset-Transformationen in scikit-learn verwendet:

Nehmen wir ein Beispiel für das Skalieren von Werten in einem Datensatz:

Hier lernt die Anpassungsmethode , wenn sie auf den Trainingsdatensatz angewendet wird, die Modellparameter (zum Beispiel Mittelwert und Standardabweichung). Anschließend müssen wir die Transformationsmethode auf den Trainingsdatensatz anwenden , um den transformierten (skalierten) Trainingsdatensatz zu erhalten. Wir könnten diese beiden Schritte auch in einem Schritt ausführen, indem wir fit_transform auf den Trainingsdatensatz anwenden .

Warum brauchen wir dann zwei getrennte Methoden - Fit und Transformation ?

In der Praxis benötigen wir einen separaten Trainings- und Testdatensatz . Hier hilft eine separate Anpassungs- und Transformationsmethode . Wir wenden Fit auf den Trainingsdatensatz an und wenden die Transformationsmethode sowohl für den Trainingsdatensatz als auch für den Testdatensatz an. Das Training sowie der Testdatensatz werden dann unter Verwendung der Modellparameter transformiert (skaliert), die beim Anwenden der Anpassungsmethode auf den Trainingsdatensatz erlernt wurden .

Beispiel Code:

scaler = preprocessing.StandardScaler().fit(X_train)
scaler.transform(X_train) 
scaler.transform(X_test) 
Prasad Nageshkar
quelle
2

Dies ist keine technische Antwort, aber es ist hoffentlich hilfreich, unsere Intuition aufzubauen:

Erstens werden alle Schätzer auf einige Trainingsdaten trainiert (oder "fit" gemacht). Dieser Teil ist ziemlich einfach.

Zweitens können alle Scikit-Learn-Schätzer in einer Pipeline verwendet werden, und die Idee mit einer Pipeline ist, dass Daten durch die Pipeline fließen . Sobald die Daten auf einer bestimmten Ebene in die Pipeline eingepasst sind, werden sie an die nächste Stufe in der Pipeline weitergeleitet, aber offensichtlich müssen sie auf irgendeine Weise geändert (transformiert) werden. Andernfalls würden Sie diese Phase in der Pipeline überhaupt nicht benötigen. Transformation ist also eine Möglichkeit, die Daten so zu transformieren, dass sie den Anforderungen der nächsten Stufe in der Pipeline entsprechen.

Wenn Sie keine Pipeline verwenden, halte ich es immer noch für hilfreich, diese maschinellen Lernwerkzeuge auf diese Weise zu betrachten, da selbst der einfachste Klassifizierer noch eine Klassifizierungsfunktion ausführt. Es nimmt einige Daten als Eingabe und erzeugt eine Ausgabe. Dies ist auch eine Pipeline; nur eine sehr einfache.

Zusammenfassend führt fit das Training durch, transformiert die Daten in der Pipeline, um sie an die nächste Stufe in der Pipeline weiterzuleiten , und fit_transform führt sowohl die Anpassung als auch die Transformation in einem möglicherweise optimierten Schritt durch.

Eric McLachlan
quelle
"" Wir wenden Fit auf den Trainingsdatensatz an und wenden die Transformationsmethode sowohl für den Trainingsdatensatz als auch für den Testdatensatz an. "" Nice
Prakash Kumar
2
Ich denke, Sie wollten unten einen Kommentar abgeben. Ich werde es an Prasad Nageshkar weiterleiten. (Nun ... ich hätte, wenn ich den Ruf hätte.)
Eric McLachlan
1

V1V2V1V2

Bei einer anderen Frage erstellen Sie das Modell zunächst in einem Trainingssatz (das Modell lernt die Muster oder das Verhalten Ihrer Daten aus dem Trainingssatz), und wenn Sie dasselbe Modell im Testsatz ausführen, versucht es, ähnliche Muster oder Verhaltensweisen zu identifizieren Sobald es identifiziert ist, kommt es zu seinen Schlussfolgerungen und liefert die entsprechenden Trainingsdaten

user66487
quelle
0

Stellen Sie sich eine Aufgabe vor, bei der wir die Daten normalisieren müssen. Beispielsweise können wir eine Min-Max-Normalisierung oder eine Z-Score-Normalisierung verwenden. Das Modell enthält einige inhärente Parameter. Die Minimal- und Maximalwerte bei der Min-Max-Normalisierung sowie der Mittelwert und die Standardabweichung bei der Z-Score-Normalisierung. Die Funktion fit () berechnet die Werte dieser Parameter.

Fit-Effekt ()

Die Transformationsfunktion wendet die Werte der Parameter auf die tatsächlichen Daten an und gibt den normalisierten Wert an.

Wirkung von transform ()

Die Funktion fit_transform () führt beide im selben Schritt aus.

Wirkung von fit_transform ()

Beachten Sie, dass derselbe Wert erhalten wird, ob wir in 2 Schritten oder in einem einzelnen Schritt ausführen.

Lovelyn David
quelle
0

"fit" berechnet den Mittelwert und den Standardwert, der für die spätere Skalierung verwendet werden soll. (Jsut eine Berechnung), wird dir nichts gegeben .

"transform" verwendet einen zuvor berechneten Mittelwert und einen Standard, um die Daten automatisch zu skalieren (subtrahieren Sie den Mittelwert von allen Werten und dividieren Sie ihn durch Standard).

"fit_transform" erledigt beides gleichzeitig. Sie können dies also mit einer Codezeile anstelle von zwei tun.

Nun schauen wir es uns in der Praxis an:

Für den X-Trainingssatz führen wir "fit_transform" aus, weil wir Mittelwert und Standard berechnen und dann zum automatischen Skalieren der Daten verwenden müssen. Nun, für X- Testsätze haben wir bereits den Mittelwert und den Standard, also machen wir nur den "Transformation" -Teil.

Es ist ganz einfach. Das machst du toll. Mach weiter so mein Freund :-)

Salman Tabatabai
quelle