2017-06-08 4 views
1

Angenommen, ich möchte mit einem LinearSVC eine k-fache Kreuzvalidierung für ein Dataset durchführen. Wie würde ich die Daten standardisieren?Wie standardisiert man Daten mit sklearns cross_val_score()

Die beste Vorgehensweise, die ich gelesen habe, besteht darin, Ihr Standardisierungsmodell auf Ihren Trainingsdaten aufzubauen und dieses Modell dann auf die Testdaten anzuwenden.

Wenn man ein einfaches train_test_split() verwendet, das ist einfach, wie wir können einfach tun:

X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y) 

clf = svm.LinearSVC() 

scalar = StandardScaler() 
X_train = scalar.fit_transform(X_train) 
X_test = scalar.transform(X_test) 

clf.fit(X_train, y_train) 
predicted = clf.predict(X_test) 

Wie würde man gehen über die Daten zu standardisieren, während tun k-fach-Kreuzvalidierung? Das Problem kommt von der Tatsache, dass jeder Datenpunkt für Training/Tests ist, so dass Sie vor cross_val_score() nicht alles standardisieren können. Brauchen Sie keine andere Standardisierung für jede Kreuzvalidierung?

Die Dokumentation erwähnt nicht die Standardisierung innerhalb der Funktion. Bin ich SOL?

EDIT: Dieser Beitrag ist super hilfreich: Python - What is exactly sklearn.pipeline.Pipeline?

Antwort

2

Sie ein Pipeline können sowohl die Prozesse zu kombinieren und sie dann in die cross_val_score send().

Wenn die fit() für die Pipeline aufgerufen wird, werden alle Transformationen nacheinander angepasst und die Daten transformiert. Anschließend werden die transformierten Daten mit dem endgültigen Schätzer angepasst. Und während predict() (Nur verfügbar, wenn das letzte Objekt in der Pipeline ein Schätzer ist, sonst transform()), wird es Transformationen auf die Daten anwenden und mit dem endgültigen Schätzer vorhersagen.

So:

scalar = StandardScaler() 
clf = svm.LinearSVC() 

pipeline = Pipeline([('transformer', scalar), ('estimator', clf)]) 

cv = KFold(n_splits=4) 
scores = cross_val_score(pipeline, X, y, cv = cv) 

Schauen Sie sich verschiedene Beispiele für Pipeline es besser zu verstehen:

Fühlen Sie sich frei, wenn irgendwelche Zweifel zu stellen.

Verwandte Themen