2016-04-23 2 views
9

Я использую кодировщик меток для преобразования категориальных данных в числовые значения.Отсутствие значений кодировки метки-кодировщика

Как LabelEncoder обрабатывает отсутствующие значения?

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) 

Выход:

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

Для приведенного выше примера, метка датчика изменилось NaN значения к категории. Как я узнаю, какая категория представляет недостающие значения?

ответ

4

Не используйте LabelEncoder с отсутствующими значениями. Я не знаю, какую версию scikit-learn вы используете, но в 0.17.1 ваш код вызывает TypeError: unorderable types: str() > float().

Как вы можете видеть in the source, он использует numpy.unique против данных для кодирования, что вызывает TypeError, если отсутствующие значения не найдены. Если вы хотите, чтобы кодировать пропущенные значения, сначала изменить его тип строки:

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

Таким образом, вы бы кодирования «NaN» в качестве фиктивного значения? У меня такая же проблема, но я хочу использовать условное значение для линейной регрессии. –

0

я столкнулся с той же проблемой, но ни один из вышеперечисленного не работает для меня. Поэтому я добавил новую строку к данным тренировки, состоящим только из «nan»

1

Вы можете заполнить значение na на некоторое значение, а затем изменить тип столбца dataframe на строку, чтобы заставить все работать.

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

Здравствуйте немного Вычислительный хак я сделал для моей работы:

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' - это список, списки не имеют метода' .apply() ', пожалуйста, исправьте – gboffi

Смежные вопросы