2012-11-10 15 views
8

Mentre libsvm fornisce gli strumenti per i dati di scaling, con scikit-learn (che dovrebbe essere basata su libSVM per il classificatore SVC) non trovo modo per scalare i miei dati.dati di scala in scikit-learn SVM

Fondamentalmente voglio utilizzare 4 caratteristiche, di cui 3 gamma da 0 a 1 e l'ultimo è un "grande" numero molto variabile.

Se includo il quarto lungometraggio in libSVM (utilizzando lo script easy.py che scala automaticamente i miei dati) ottengo alcuni risultati molto bello (96% di precisione). Se includo la quarta variabile in Scikit-Learn la precisione scende a ~ 78% - ma se la escludo, ottengo gli stessi risultati che ottengo in libSVM quando escludo quella caratteristica. Pertanto sono abbastanza sicuro che sia un problema di ridimensionamento mancante.

Come si replica a livello di codice (cioè senza chiamare SVM-scala) il processo di ridimensionamento di SVM?

risposta

6

hai quel funzionalità 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...]]) 

I dati verranno poi media zero e varianza unitaria.

+0

Buono a sapersi, grazie. Devo standardizzare i dati del test insieme ai dati del treno e tagliarli successivamente o devo solo eseguire i dati di prova da solo? – luke14free

+3

Questo è menzionato nella [documentazione] (http://scikit-learn.org/stable/modules/preprocessing.html#standardization-or-mean-removal-and-variance-scaling). Immagino che dovresti farlo separatamente, altrimenti i dati di allenamento sarebbero influenzati dai campioni di prova. Con la classe 'Scaler' è possibile calcolare la media e la deviazione standard dei dati di allenamento e quindi applicare la stessa trasformazione ai dati di test. – Maehler

+8

Dovresti usare uno 'Scaler' per questo, non la funzione indipendente' scale'. Un 'Scaler' può essere inserito in un' Pipeline', ad es. 'scaling_svm = Pipeline ([(" scaler ", Scaler()), (" svm ", SVC (C = 1000))])'. –