2012-11-10 6 views
8

Während libsvm Werkzeuge zum Skalieren von Daten bietet, mit Scikit-Learn (das auf libSVM für den SVC-Klassifikator basieren sollte), finde ich keine Möglichkeit, meine Daten zu skalieren.Skalieren von Daten in scikit-learn SVM

Grundsätzlich möchte ich 4 Funktionen verwenden, von denen 3 von 0 bis 1 reichen und die letzte ist eine "große" stark variable Zahl.

Wenn ich das vierte Feature in libSVM einfüge (mit dem Skript easy.py, das meine Daten automatisch skaliert), bekomme ich einige sehr schöne Ergebnisse (96% Genauigkeit). Wenn ich die vierte Variable in Scikit-Learn einfüge, sinkt die Genauigkeit auf ~ 78% - aber wenn ich sie ausschließe, erhalte ich die gleichen Ergebnisse wie in libSVM, wenn ich diese Funktion ausschließe. Daher bin ich mir ziemlich sicher, dass es ein Problem der fehlenden Skalierung ist.

Wie repliziere ich programmgesteuert (d. H. Ohne Aufruf von SVM-Scale) den Skalierungsprozess von SVM?

Antwort

6

Sie haben diese Funktionalität in sklearn.preprocessing:

>>> from sklearn import preprocessing 
>>> X = [[ 1., -1., 2.], 
...  [ 2., 0., 0.], 
...  [ 0., 1., -1.]] 
>>> X_scaled = preprocessing.scale(X) 

>>> X_scaled           
array([[ 0. ..., -1.22..., 1.33...], 
     [ 1.22..., 0. ..., -0.26...], 
     [-1.22..., 1.22..., -1.06...]]) 

Die Daten werden dann Mittelwert Null und Varianz aufweisen.

+0

Gut zu wissen, danke. Soll ich die Testdaten zusammen mit den Zugdaten vereinheitlichen und anschließend zerlegen oder sollte ich Testdaten nur selbst durchführen? – luke14free

+3

Das wird in der [Dokumentation] (http://scikit-learn.org/stable/modules/preprocessing.html#standardization- or- me- removal-and-variance-scaling) erwähnt. Ich schätze, du solltest es separat machen, sonst würden die Trainingsdaten von den Testproben beeinflusst werden. Mit der Klasse "Scaler" können Sie den Mittelwert und die Standardabweichung der Trainingsdaten berechnen und dann die gleiche Transformation auf die Testdaten anwenden. – Maehler

+8

Sie sollten dafür einen 'Scaler' verwenden, nicht die freistehende Funktion' scale'. Ein "Scaler" kann in eine "Pipeline", z. 'scaling_svm = Pipeline ([(" scaler ", Scaler()), (" svm ", SVC (C = 1000))])'. –