#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