StandardScaler vor und nach dem Aufteilen von Daten

20

Als ich über das Verwenden las StandardScaler, sagten die meisten Empfehlungen, dass Sie verwenden sollten, StandardScaler bevor Sie die Daten in Zug / Test aufteilen, aber als ich einige der online veröffentlichten Codes überprüfte (mit sklearn), gab es zwei Hauptverwendungen.

1- Mit StandardScalerauf alle Daten. Z.B

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_fit = sc.fit(X)
X_std = X_fit.transform(X)

Oder

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X = sc.fit(X)
X = sc.transform(X)

Oder einfach

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_std = sc.fit_transform(X)

2- Verwendung StandardScaleraufgeteilter Daten.

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform (X_test)

Ich möchte meine Daten standardisieren, bin aber verwirrt, welche Methode die beste ist!

Tsumaranaina
quelle

Antworten:

25

Um zu verhindern, dass Informationen über die Verteilung des Testsets in Ihr Modell gelangen, sollten Sie Option 2 auswählen und den Skalierer nur auf Ihre Trainingsdaten anwenden. Anschließend sollten Sie sowohl Trainings- als auch Testsets mit diesem Skalierer standardisieren. Durch Anpassen des Skalierers an den vollständigen Datensatz vor dem Aufteilen (Option 1) werden Informationen zum Testsatz verwendet, um den Trainingssatz zu transformieren, der wiederum stromabwärts weitergeleitet wird.

Wenn Sie beispielsweise die Verteilung des gesamten Datensatzes kennen, kann dies Einfluss darauf haben, wie Sie Ausreißer erkennen und verarbeiten und wie Sie Ihr Modell parametrisieren. Obwohl die Daten selbst nicht verfügbar sind, werden Informationen zur Verteilung der Daten angezeigt. Infolgedessen ist die Leistung Ihres Testsets keine echte Schätzung der Leistung für nicht angezeigte Daten. Einige weitere Diskussionen, die Sie vielleicht nützlich finden, finden Sie auf Informationen Cross Validated .

redhqs
quelle
Gilt das auch für ein Validierungsset? Mit anderen Worten, wenn ich mein Trainingsset in ein Zug- und ein Validierungsset aufteile, lerne ich dann die Anpassung nur für den Zug und wende sie später sowohl für das Validierungsset als auch für das Testset an? Oder lerne ich die Anpassung des gesamten Datensatzes, der sowohl die Validierungs- als auch die Schulungsbeispiele enthält, und kümmere mich erst später darum, ihn auf den Testsatz anzuwenden.
Phil Glau
hi - das ist richtig, passt nur
redhqs
0

Wie wäre es mit Folgendem:

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()

X_train = sc.fit_transform(X_train)

X_test = sc.fit_transform (X_test)

Denn wenn X_test = sc.transform(X_test), wird ein Fehler zurückgegeben, der X_testnoch nicht angepasst wurde. Oder habe ich hier etwas verpasst?

user253546
quelle
2
Entfernen Sie einfach fit aus dem X_test
tsumaranaina
0

Sie sollten fit_transform (X_test) nicht für die Testdaten ausführen.
Die Anpassung ist oben bereits aufgetreten.

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform (X_test)
starsini
quelle
Entschuldigung, dies war als Antwort auf das, was unten steht,
gedacht