2016-04-23 25 views
9

Sto utilizzando l'encoder di etichette per convertire i dati categoriali in valori numerici.codifica encoder codifica valori mancanti

In che modo LabelEncoder gestisce i valori mancanti?

from sklearn.preprocessing import LabelEncoder 
import pandas as pd 
import numpy as np 
a = pd.DataFrame(['A','B','C',np.nan,'D','A']) 
le = LabelEncoder() 
le.fit_transform(a) 

uscita:

array([1, 2, 3, 0, 4, 1]) 

Per l'esempio precedente, encoder etichetta cambiato NaN valori da una categoria. Come faccio a sapere quale categoria rappresenta i valori mancanti?

risposta

4

Non utilizzare LabelEncoder con valori mancanti. Non so quale versione di scikit-learn stai utilizzando, ma in 0.17.1 il tuo codice genera TypeError: unorderable types: str() > float().

Come si può vedere in the source utilizza numpy.unique rispetto ai dati da codificare, che solleva TypeError se vengono rilevati valori mancanti. Se si vuole codificare valori mancanti, prima modificarne il tipo in una stringa:

a[pd.isnull(a)] = 'NaN' 
+0

modo che sarebbe una marcatura di 'NaN' come un valore fittizio? Ho lo stesso problema ma voglio usare il valore imputato per la regressione lineare. –

0

Ho affrontato lo stesso problema, ma nessuna di queste ha lavorato per me. Quindi ho aggiunto una nuova riga ai dati di allenamento che consistono solo in "nan"

1

È possibile riempire i valori di na con un certo valore e successivamente modificare il tipo di colonna dataframe in stringa per far funzionare le cose.

from sklearn.preprocessing import LabelEncoder 
import pandas as pd 
import numpy as np 
a = pd.DataFrame(['A','B','C',np.nan,'D','A']) 
a.fillna(99) 
le = LabelEncoder() 
le.fit_transform(a.astype(str)) 
2

Ciao un piccolo hack computazionale che ho fatto per il mio lavoro:

from sklearn.preprocessing import LabelEncoder 
import pandas as pd 
import numpy as np 
a = pd.DataFrame(['A','B','C',np.nan,'D','A']) 
le = LabelEncoder() 
### fit with the desired col, col in position 0 for this example 
fit_by = pd.Series([i for i in a.iloc[:,0].unique() if type(i) == str]) 
le.fit(fit_by) 
### Set transformed col leaving np.NaN as they are 
a["transformed"] = fit_by.apply(lambda x: le.transform([x])[0] if type(x) == str else x) 
+0

'fit_by' è una lista, le liste non hanno un metodo' .apply() ', correggi – gboffi