Je me demandais s'il existe des classificateurs qui gèrent les valeurs nan/null dans scikit-learn. Je pensais que le régresseur de forêt aléatoire gère cela, mais j'ai reçu une erreur lorsque j'appelle 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!
Puis-je ne pas appeler Predict avec un algorithme Scikit-Learn avec des valeurs manquantes?
Modifier. Maintenant que j'y pense, cela a du sens. Ce n'est pas un problème pendant la formation, mais lorsque vous prédisez comment vous branchez-vous lorsque la variable est nulle? peut-être pourriez-vous simplement diviser les deux façons et faire la moyenne du résultat? Il semble que k-NN devrait fonctionner correctement tant que la fonction distance ignore les valeurs nulles.
Edit 2 (plus vieux et plus sage) Certaines bibliothèques gbm (comme xgboost) utilisent un arbre ternaire au lieu d'un arbre binaire précisément à cette fin: 2 enfants pour la décision oui/non et 1 enfant pour la décision manquante. sklearn est en utilisant un arbre binaire
J'ai fait un exemple qui contient à la fois les valeurs manquantes dans la formation et les ensembles de tests
Je viens de choisir une stratégie pour remplacer les données manquantes par la moyenne, en utilisant la classe SimpleImputer
. Il existe d'autres stratégies.
from __future__ import print_function
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.impute import SimpleImputer
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 = SimpleImputer(missing_values=np.nan, strategy='mean')
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]
Parfois, les valeurs manquantes ne sont tout simplement pas applicables. Les imputer n'a aucun sens. Dans ces cas, vous devez utiliser un modèle capable de gérer les valeurs manquantes. Les modèles de Scitkit-learn ne peuvent pas gérer les valeurs manquantes. XGBoost peut.
Comme mentionné dans cet article , les arbres de décision et les algorithmes KNN de scikit-learn ne sont pas ( encore ) assez robustes pour travailler avec des valeurs manquantes. Si l'imputation n'a pas de sens, ne le faites pas.
gardez à l'esprit que c'est un exemple inventé
Considérons un ensemble de données avec rangées de voitures ("Danho Diesel", "Estal Electric", "Hesproc Hybrid") et colonnes avec leurs propriétés (poids, vitesse de pointe, accélération, puissance de sortie, émission de dioxyde de soufre, plage).
Les voitures électriques ne produisent pas de gaz d'échappement - les émissions de dioxyde de soufre des Estal Electric doivent donc être une valeur de NaN
manquante) . On pourrait dire qu'il devrait être réglé sur 0 - mais les voitures électriques ne peuvent pas produire de dioxyde de soufre. L'imputation de la valeur ruinera vos prévisions.
Comme mentionné dans --- (cet article , les arbres de décision et les algorithmes KNN de scikit-learn ne sont pas ( encore ) assez robustes pour travailler avec des valeurs manquantes. Si l'imputation n'a pas de sens, ne le faites pas.
Si vous utilisez DataFrame, vous pouvez utiliser fillna
. Ici, j'ai remplacé les données manquantes par la moyenne de cette colonne.
df.fillna(df.mean(), inplace=True)