values sklearn missing imputer data python pandas machine-learning scikit-learn nan

python - sklearn - clasificadores en scikit-learn que manejan nan/null



missing data imputation python (1)

Me preguntaba si hay clasificadores que manejen valores nan / null en scikit-learn. Pensé que el regresor de bosque aleatorio maneja esto, pero recibí un error cuando llamé a predict .

X_train = np.array([[1, np.nan, 3],[np.nan, 5, 6]]) y_train = np.array([1, 2]) clf = RandomForestRegressor(X_train, y_train) X_test = np.array([7, 8, np.nan]) y_pred = clf.predict(X_test) # Fails!

¿No puedo llamar a predict con ningún algoritmo scikit-learn con valores perdidos?

Editar. Ahora que pienso en esto, tiene sentido. No es un problema durante el entrenamiento, pero cuando predice ¿cómo se ramifica cuando la variable es nula? tal vez podrías dividir ambos caminos y promediar el resultado? Parece que k-NN debería funcionar bien siempre que la función de distancia ignore los nulos.

Editar 2 (más antiguo y más sabio) Algunas bibliotecas gbm (como xgboost) usan un árbol ternario en lugar de un árbol binario precisamente para este propósito: 2 niños para la decisión de sí / no y 1 niño para la decisión faltante. sklearn está usando un árbol binario


Hice un ejemplo que contiene los dos valores faltantes en el entrenamiento y los conjuntos de prueba

Imputer una estrategia para reemplazar los datos faltantes por la media, usando la clase Imputer . Hay otras estrategias

from __future__ import print_function import numpy as np from sklearn.ensemble import RandomForestClassifier from sklearn.preprocessing import Imputer X_train = [[0, 0, np.nan], [np.nan, 1, 1]] Y_train = [0, 1] X_test_1 = [0, 0, np.nan] X_test_2 = [0, np.nan, np.nan] X_test_3 = [np.nan, 1, 1] # Create our imputer to replace missing values with the mean e.g. imp = Imputer(missing_values=''NaN'', strategy=''mean'', axis=0) imp = imp.fit(X_train) # Impute our data, then train X_train_imp = imp.transform(X_train) clf = RandomForestClassifier(n_estimators=10) clf = clf.fit(X_train_imp, Y_train) for X_test in [X_test_1, X_test_2, X_test_3]: # Impute each test item, then predict X_test_imp = imp.transform(X_test) print(X_test, ''->'', clf.predict(X_test_imp)) # Results [0, 0, nan] -> [0] [0, nan, nan] -> [0] [nan, 1, 1] -> [1]