2012-07-11 19 views
21

Estoy usando scikit-learn para algunos análisis de datos, y mi conjunto de datos tiene algunos valores faltantes (representados por NA). Cargué los datos con genfromtxt con dtype='f8' y voy a entrenar mi clasificador.¿Cómo hacer que los SVM jueguen bien con los datos faltantes en scikit-learn?

La clasificación está muy bien en RandomForestClassifier y GradientBoostingClassifier objetos, pero utilizando SVC de sklearn.svm provoca el error siguiente:

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 

Lo que da? ¿Cómo puedo hacer que SVM juegue bien con la información faltante? Teniendo en cuenta que los datos faltantes funcionan bien para los bosques aleatorios y otros clasificadores ..

Respuesta

24

Puede hacer una imputación de datos para manejar los valores perdidos antes de usar SVM.

EDITAR: En scikit-learn, hay una forma muy sencilla de hacerlo, ilustrada en this page.

(copiado de página y modificado)

>>> 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

¿Qué hay de los valores infinitos? Esto indica una estrategia solo con NaN (es decir, división por cero) – lefterav

+0

Lo hice pero la transformación cambió los datos a una matriz no entera. Si no imputo, la clasificación svm funciona bien, pero cuando imputo los datos obtengo el error 'IndexError: solo enteros, slices (': '), elipsis (' ... '), numpy.newaxis (' Ninguno ') y las matrices enteras o booleanas son índices válidos'. Algun consejo ? –

6

Puede eliminar las muestras con características faltantes o reemplazar las características que faltan con sus medianas o medios en columnas.

Cuestiones relacionadas