2015-05-19 13 views
19

Mi chiedevo se ci sono classificatori che gestiscono valori nan/null in scikit-learn. Ho pensato che il regressore forestale casuale lo gestisse, ma ho ricevuto un errore quando ho chiamato lo predict.classificatori in scikit-imparare che gestire nan/null

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! 

Impossibile chiamare la previsione con qualsiasi algoritmo di apprendimento scikit con valori mancanti?

Modifica. Ora che ci penso, ha senso. Non è un problema durante l'allenamento, ma quando prevedi come ti direri quando la variabile è nullo? forse potresti semplicemente dividere in due modi e mediare il risultato? Sembra che k-NN funzioni bene finché la funzione di distanza ignora i valori nulli.

Edit 2 (vecchio e più saggio di me) Alcune librerie GBM (come ad esempio xgboost) usa un albero ternario invece di un albero binario proprio per questo scopo: 2 bambini per le decisione sì/no e 1 bambino per la decisione mancante. sklearn è using a binary tree

+0

ho anche affrontare questo problema, immagino che è necessario rimuovere tale 'valori nan' con [questa classe] (http://scikit-learn.org/stable/modules/preprocessing.html) anche fonte [this] (http://www.markhneedham.com/blog/2013/11/09/python-making-scikit-learn-and-pandas-play-nice/) ma non riesco ancora a risolvere questo problema. Probabilmente [questo] (https://stackoverflow.com/questions/9365982/missing-values-in-scikits-machine-learning) aiuterà. – skwoi

+0

Il problema qui è come dovrebbe essere rappresentato 'NaN' qui? è un problema comune in cui è necessario decidere come gestirli, è possibile eliminarli o sostituirli con un valore medio o qualche altro inidcator – EdChum

risposta

14

ho fatto un esempio che contiene sia valori mancanti nella formazione e test imposta

ho preso una strategia per sostituire i dati mancanti con la media, utilizzando la classe Imputer. Ci sono altre strategie.

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] 
+2

Grazie! Non sapevo della classe "Imputer". – anthonybell

+9

Come gestisci il caso quando i valori sono realmente etichette e non continui? –

+2

Sarei davvero interessato a vedere come funziona l'imputazione per i dati categoriali. – Vivek

Problemi correlati