Это один горячий

Чтение:

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html

в нем говорится, что «кодировать категориальные целочисленные функции с использованием схемы« один из K »».

Означает ли это, что он быстро кодирует список слов?

Из определения Википедии (https://en.wikipedia.org/wiki/One-hot) одного горячего кодирования
"При обработке естественного языка одним горячим вектором является матрица (вектор) 1 × N, используемая для различения каждого слова в словаре от любого другого слова в словаре. Вектор состоит из нулей во всех ячейках, за исключением единственной единицы в ячейке, используемой для однозначной идентификации слова ".

Выполнение приведенного ниже кода кажется LabelEncoder неправильной реализацией одной горячей кодировки, тогда как OneHotEncoder - правильной реализацией:

import numpy as np
from sklearn.preprocessing import MultiLabelBinarizer
from numpy import array
from numpy import argmax
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder

# define example
data = ['w1 w2 w3', 'w1 w2']

values = array(data)
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(values)

# binary encode
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)

mlb = MultiLabelBinarizer()

print('fit_transform\n' , mlb.fit_transform(data))
print('\none hot\n' , onehot_encoder.fit_transform(integer_encoded))

Печать:

fit_transform
 [[1 1 1 1 1]
 [1 1 1 0 1]]

one hot
 [[0. 1.]
 [1. 0.]]

Итак, LabelEncoder не выполняет горячее кодирование, какой тип кодирования используется LabelEncoder?

Из приведенных выше выходных данных кажется, что OneHotEncoder создает более плотный вектор, чем схема кодирования LabelEncoder.

Обновлять :

Как решить кодировать данные для алгоритмов машинного обучения с помощью LabelEncoder или OneHotEncoder?


person blue-sky    schedule 29.05.2018    source источник
comment
Категорически! = Одно горячее. Категориальный = ›отображение значений из одного домена в другой. Один горячий = ›вектор длины K с активированным только одним элементом.   -  person cs95    schedule 29.05.2018
comment
pandas также имеет команду get_dummies () что может быть полезно.   -  person lwileczek    schedule 29.05.2018
comment
LabelEncoder производит порядковую кодировку. Кроме того, документация по кодированию категориальных целочисленных функций с использованием схемы «один-из» в LabelEncoder предназначена для описания OneHotEncoder в разделе «См. Также» и не относится к LabelEncoder.   -  person Vivek Kumar    schedule 01.06.2018


Ответы (1)


Думаю, ваш вопрос недостаточно ясен ...

Во-первых, LabelEncoder кодирует метки со значением от 0 до n_classes-1, в то время как OneHotEncoder кодирует категориальные целочисленные функции, используя схему one-hot, также известную как one-of-K. Они разные.

Во-вторых, yes OneHotEncoder кодирует список слов. В определении Википедии сказано a one-hot vector is a 1 × N matrix. Но что такое N? На самом деле N - это размер вашего словарного запаса.

Например, если у вас есть пять слов a, b, c, d, e. Затем закодируйте их в горячем режиме:

a -> [1, 0, 0, 0, 0]  # a one-hot 1 x 5 vector
b -> [0, 1, 0, 0, 0]  # a one-hot 1 x 5 vector
c -> [0, 0, 1, 0, 0]  # a one-hot 1 x 5 vector
d -> [0, 0, 0, 1, 0]  # a one-hot 1 x 5 vector
e -> [0, 0, 0, 0, 1]  # a one-hot 1 x 5 vector
# total five one-hot 1 x 5 vectors which can be expressed in a 5 x 5 matrix.

В-третьих, на самом деле я не уверен на 100%, о чем вы спрашиваете ...

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

person Sraw    schedule 29.05.2018