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]