2012-07-11 5 views
21

Sto utilizzando scikit-learn per alcune analisi dei dati e il mio set di dati ha alcuni valori mancanti (rappresentato da NA). Carico i dati con genfromtxt con dtype='f8' e faccio formazione sul mio classificatore.Come far sì che gli SVM funzionino bene con i dati mancanti in scikit-learn?

La classificazione è bene su RandomForestClassifier e GradientBoostingClassifier oggetti, ma usando SVC dal sklearn.svm causa il seguente errore:

probas = classifiers[i].fit(train[traincv], target[traincv]).predict_proba(train[testcv]) 
    File "C:\Python27\lib\site-packages\sklearn\svm\base.py", line 409, in predict_proba 
    X = self._validate_for_predict(X) 
    File "C:\Python27\lib\site-packages\sklearn\svm\base.py", line 534, in _validate_for_predict 
    X = atleast2d_or_csr(X, dtype=np.float64, order="C") 
    File "C:\Python27\lib\site-packages\sklearn\utils\validation.py", line 84, in atleast2d_or_csr 
    assert_all_finite(X) 
    File "C:\Python27\lib\site-packages\sklearn\utils\validation.py", line 20, in assert_all_finite 
    raise ValueError("array contains NaN or infinity") 
ValueError: array contains NaN or infinity 

Che cosa dà? Come posso fare in modo che SVM giochi bene con i dati mancanti? Tenendo presente che i dati mancanti funzionano bene per foreste casuali e altri classificatori.

risposta

24

È possibile eseguire l'imputazione dei dati per gestire i valori mancanti prima di utilizzare SVM.

MODIFICA: in scikit-learn, c'è un modo davvero semplice per farlo, illustrato su this page.

(copiato da pag e modificato)

>>> import numpy as np 
>>> from sklearn.preprocessing import Imputer 
>>> # missing_values is the value of your placeholder, strategy is if you'd like mean, median or mode, and axis=0 means it calculates the imputation based on the other feature values for that sample 
>>> imp = Imputer(missing_values='NaN', strategy='mean', axis=0) 
>>> imp.fit(train) 
Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0) 
>>> train_imp = imp.transform(train) 
+1

Che dire di valori infiniti? Questo indica una strategia solo con NaN (cioè divisione per zero) – lefterav

+0

Ho fatto questo ma la trasformazione ha cambiato i dati in un array non intero. Se non imputo la classificazione svm funziona bene, ma quando imputo i dati ottengo l'errore 'IndexError: solo interi, slice (': '), ellissi (' ... '), numpy.newaxis (' Nessuno ') e gli interi o gli array booleani sono indici validi'. Qualche consiglio ? –

6

È possibile rimuovere i campioni con funzionalità mancanti o sostituire le funzioni mancanti con mediane o mezzi per colonna.