Используйте одноразовую кодировку для нескольких категорий для одной строки

#python #neural-network #one-hot-encoding

#python #нейронная сеть #однократное кодирование

Вопрос:

У меня есть такой категориальный набор данных:

Имя Цвет (категория)
Автомобиль Красный
Grass Зеленый
Небо Синий
Apple Красный, зеленый
Фото Черный, белый

Таким образом, в одной строке может быть одна или несколько категорий.

Также я использую OneHotEncoder для категорий:

 data = asarray([['red'], ['green'], ['blue']])
print(data)
encoder = OneHotEncoder(sparse=False)
onehot = encoder.fit_transform(data)
print(onehot)
 

Вывод будет

 [['red']
 ['green']
 ['blue']]
[[0. 0. 1.]
 [0. 1. 0.]
 [1. 0. 0.]]
 

Можно ли использовать OneHotEncoding для двух или более категорий?

Как Red,Green преобразовать в [0. 1. 1.] ?

Я читаю документацию OneHotEncoder и tensorflow.keras.utils.to_categorical и не могу найти такое решение.

Другое решение

Я где-то встречал мнение, что мне нужно изменить свою логику на это:

Имя Цвет (категория) (удалить) Красный Зеленый Синий Черный Белый
Автомобиль // Красный Верно False False False False
Grass // Зеленый False Верно False False False
Небо // Синий False False Верно False False
Apple // Красный, зеленый Верно Верно False False False
Фото // Черный, белый False False False Верно Верно

Так что просто игнорируйте цветовой столбец и делайте несколько выходных данных для последовательной модели.

Но разве это не то же самое, что преобразование Red,Green в [0. 1. 1.] ?

Я чувствую, что упускаю что-то очевидное, извините, если мой вопрос глуп.

Ответ №1:

В вашем случае лучше использовать MultiLabelBinarizer from sklearn . Если df это фрейм данных с данными вашего набора данных, вы можете сделать что-то подобное :

 mlb = MultiLabelBinarizer()
mlb.fit_transform(df["Color (Category)"].str.split(","))
 

Ссылка на документацию sklearn: https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing .MultiLabelBinarizer.html

Ответ №2:

Одно имя горячей кодировки исходит из одного старшего бита, а остальные — низкие. Поэтому, если вы закодируете его как 011, это больше не одна горячая кодировка. Существует подход двоичного кодирования, но в том случае, если вы кодируете случайным образом, как это

 001 blue
010 red
011 green
100 blue red
 

Тогда это будет проблематично для этого сценария, потому что красный и зеленый разделят второй бит, и они будут влиять друг на друга на весь процесс обучения.

Итак, чтобы упорядочить эти общие биты для содействия обучению, таблица, которую вы показали, является логическим подходом к этой проблеме, как показано ниже

     001 blue
    010 red
    100 green
    110 green red
    111 green blue red