Кодировщик меток предварительной обработки Sklearn выдает ошибку для нескольких столбцов

У меня есть кадр данных pandas со следующей структурой

item_condition_id                     category
brand_name                            category
price                                  float64
shipping                              category
main_category                         category
category                              category
sub_category                          category
hashing_feature_aa                     float64
hashing_feature_ab                     float64

Пример с частью данных:

brand_name  shipping  main_category        category
Target         1         Women           Tops & Blouses
unknown        1          Home           Home Décor
unknown        0         Women            Jewelry
unknown        0         Women             Other

Я преобразовал категориальные (строки) столбцы в числовые, используя приведенный ниже код.

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
for i in range(len(X)):
    X.iloc[:,i] = le.fit_transform(X.iloc[:,i])

После преобразования

   brand_name  shipping  main_category  category
        0         1              1         3
        1         1              0         0
        1         0              1         1
        1         0              1         2

Это работает, как и ожидалось, но при попытке применить inverse_transform для получения исходных категорий из числовых категорий возникает ошибка.

for i in range(len(X)):
    X.iloc[:,i] = le.inverse_transform(X.iloc[:,i])

ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()

Как решить эту ошибку в моем случае, что не так с моим кодом?

Моя цель — преобразовать категориальные (строковые) функции в числовые с помощью кодировщика меток, чтобы применить sklearn.feature_selection.SelectKbest.fit_transform(X,y), без кодирования меток этот шаг не выполняется.

Спасибо


person Siva Naidu    schedule 28.11.2017    source источник
comment
без подготовки минимального примера с данными трудно воспроизвести эту проблему. Только одна мысль: вы используете один и тот же экземпляр файла для вызова fit_transform() и inverse_transform()? Потому что, если вы перебираете столбцы и устанавливаете один файл LabelEncoder() для каждого столбца, вы должны использовать одни и те же экземпляры файла для вызова inverse_transform() (например, сохраняя его в словаре).   -  person Marcus V.    schedule 28.11.2017
comment
Да, как @MarcusV. указали, что в итерации экземпляр LabelEncoder будет перезаписан и, таким образом, возникнет проблема. Было бы хорошо, если бы у нас был простой пример.   -  person Vivek Harikrishnan    schedule 28.11.2017
comment
Привет, ребята, добавил небольшой пример. Да, я использую один и тот же экземпляр файла LabelEncoder() как для fit_transform, так и для inverse_transform. Должен ли я создавать отдельные экземпляры LabelEncoder для каждого столбца!? например le_brand_name, le_category и т. д..   -  person Siva Naidu    schedule 28.11.2017
comment
Да, вам придется это сделать (например, сохранить их в диктофоне). Или ознакомьтесь с этим элегантным подходом к этому проблема.   -  person Marcus V.    schedule 28.11.2017
comment
На будущее также ознакомьтесь с этим относительно хороших минимальных примеров.   -  person Marcus V.    schedule 28.11.2017
comment
Спасибо.. полезно.   -  person Siva Naidu    schedule 28.11.2017
comment
Теперь я также добавил это как ответ. Так что, если он достаточно хорошо ответил на ваш вопрос, не стесняйтесь принять :)   -  person Marcus V.    schedule 28.11.2017
comment
Возможный дубликат Decode pandas dataframe   -  person Vivek Kumar    schedule 28.11.2017


Ответы (1)


Основываясь на вашем разъяснении: ваша проблема заключается в перезаписи экземпляра файла в вашем цикле, так что он обучается только в последнем столбце. Основываясь на вашем коде, я бы предложил поместить их в диктофон, например. следующим образом:

from sklearn.preprocessing import LabelEncoder
le = {}
for i in range(len(X)):
    le[i] = LabelEncoder()
    X.iloc[:,i] = le[i].fit_transform(X.iloc[:,i])
# do stuff
for i in range(len(X)):
    X.iloc[:,i] = le[i].inverse_transform(X.iloc[:,i])

Но, как указано выше, также посмотрите на это.

person Marcus V.    schedule 28.11.2017