Ich bin ein Neuling in der Datenwissenschaft und verstehe den Unterschied zwischen fit
und fit_transform
Methoden 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?
python
scikit-learn
Kaggle
quelle
quelle
fit
an - den Trainingsdatensatz und den Testdatensatztraining dataset
transform
both
Antworten:
Um die Daten zu zentrieren (Mittelwert Null und Einheitsstandardfehler), subtrahieren Sie den Mittelwert und dividieren das Ergebnis durch die Standardabweichung.
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 'fit()
transform()
quelle
get_params()
coef_
(dh Steigung und Achsenabschnitt), nicht die vonget_params()
(die stattdessen die Menge der Modellkonstruktorargumente mit ihren zugeordneten Werten zurückgibt).fit_transform()
da dies uns nicht erlauben würde, auf den internen Objektstatus zuzugreifen, um nachfolgende Beispiele mit denselben Parametern zu transformieren, die mitfit()
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.t.fit_transform(train_data)
,t
ist angebracht, so dass Sie sicher verwenden könnent.transform(test_data)
.Die folgende Erklärung wird auf der Grundlage
fit_transform
derImputer
Klasse, aber die Idee ist das gleiche fürfit_transform
andere scikit_learn Klassen mögenMinMaxScaler
.transform
Ersetzt 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: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:
wir bekommen
Also
fit
berechnet der Imputer aus einigen Daten die Mittelwerte der Spalten undtransform
wendet 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 Siefit_transform
im Grunde genommen afit
gefolgt von a verwendentransform
.Nun deine Fragen:
"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 )
Das
fit
eines Imputers hat nichts mit derfit
Verwendung in der Modellmontage zu tun . Die Verwendung von Imputerfit
für Trainingsdaten berechnet also nur die Mittelwerte für jede Spalte von Trainingsdaten. Die Verwendungtransform
von Testdaten ersetzt dann fehlende Werte von Testdaten durch Mittelwerte, die aus Trainingsdaten berechnet wurden.quelle
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.
quelle
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:
quelle
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.
quelle
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
quelle
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.
Die Transformationsfunktion wendet die Werte der Parameter auf die tatsächlichen Daten an und gibt den normalisierten Wert an.
Die Funktion fit_transform () führt beide im selben Schritt aus.
Beachten Sie, dass derselbe Wert erhalten wird, ob wir in 2 Schritten oder in einem einzelnen Schritt ausführen.
quelle
"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 :-)
quelle