One hot encode python

Как выполнить горячее кодирование данных в Python

В этом руководстве мы выполним одно горячее кодирование, т.е. научимся преобразовывать наши данные входной или выходной последовательности в Python в горячую кодировку для использования в классификации последовательностей.

One Hot Encoding – полезная функция машинного обучения, поскольку некоторые алгоритмы машинного обучения не могут работать напрямую с категориальными данными. При работе с наборами данных мы сталкиваемся со столбцом, в котором нет определенного порядка предпочтений.

Если мы работаем с проблемой типа классификации последовательности, категориальные данные должны быть преобразованы в числа. Этот метод также используется, когда мы работаем с методами глубокого обучения, такими как рекуррентные нейронные сети с долговременной краткосрочной памятью.

Сначала мы обсудим категориальные данные.

Что такое категориальные данные?

Категориальные данные в Python – это типы переменных, которые имеют значение метки, а не числовые значения. Эти типы переменных также называются номинальными. Давайте посмотрим на следующий пример категориальных данных.

  • Переменная «car» со значениями: «Maruti» и «Jaguar».
  • Переменная «food» со значениями: «Veg» и «Non-Veg».
  • Переменная «место» со значениями: «первое», «второе» и «третье».

Как мы видим в приведенном выше примере, некоторые категории могут иметь естественные отношения, такие как естественный порядок. В третьем примере переменная «место» имеет естественный порядок значений.

Проблема с категориальными данными

Некоторые алгоритмы машинного обучения могут работать напрямую с категориальными данными. Некоторые алгоритмы не могут работать с данными меток напрямую, потому что они требуют, чтобы все переменные данных и выходные переменные были числовыми.

Категориальные данные

Следовательно, мы должны преобразовать иерархические данные в числовую форму. Предположим, категориальная переменная – это выходная переменная. В этом случае вы также можете преобразовать прогнозы модели обратно в категориальную форму, чтобы представить их или использовать в каком-либо приложении.

Как преобразовать категориальные данные в числовые

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

В следующем разделе мы обсудим One-Hot Encoding.

Что такое одно горячее кодирование?

Одно горячее кодирование в Python (One-Hot Encoding) используется для преобразования категориальных переменных в числовые значения. Перед дальнейшим анализом данных категориальные значения сопоставляются с целочисленными значениями. Каждый столбец содержит «0» или «1», в зависимости от того, в какой столбец он был помещен. В этом процессе каждое целочисленное значение представляется как двоичный вектор, равный нулю, за исключением индекса целого числа, который помечен 1.

Давайте разберемся в этом на следующем простом примере.

Предположим, у нас есть последовательность меток со значениями «желтый» и «красный». Чтобы преобразовать их в числовое значение, мы присваиваем «желтому» целочисленное значение 1, соответствующее количеству категорий, присутствующих в столбце, и «красному» – значение 0. Когда мы встречаем эти метки, мы присваиваем такое же целочисленное значение. Это называется целочисленной кодировкой.

Читайте также:  Data type variable in java

Давайте посмотрим на другой пример. Предположим, что есть категория под названием «животное», в которой четыре значения – «Кошка», «Собака», «Корова» и «Верблюд». Рассмотрим следующую таблицу, в которой представлены животные и соответствующие им категориальные значения.

Животное Категориальная ценность животного
Кот 5
Собака 10
Корова 15
Верблюд 11

Результат будет показан ниже после одного горячего кодирования.

Кот Собака Корова Верблюд
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

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

Зачем использовать One Hot Encoding?

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

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

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

Одно горячее кодирование вручную

В следующем примере мы рассмотрим пример строки букв алфавита, которая будет преобразована в целое число.

Теперь мы реализуем одно горячее кодирование для указанного выше строкового значения. Посмотрим на следующий пример.

from numpy import argmax # Here we are define input string str_data = 'hello python' print(str_data) # Here we are defining possible input values of english alphabate eng_alphabet = 'abcdefghijklmnopqrstuvwxyz ' # define a mapping of chars to integers char_to_int = dict((c, i) for i, c in enumerate(eng_alphabet)) int_to_char = dict((i, c) for i, c in enumerate(eng_alphabet)) # input data is encoding in integer int_encoded = [char_to_int[char] for char in data] print(int_encoded) # one hot encode onehot_encoded = list() for value in int_encoded: letter = [0 for _ in range(len(eng_alphabet))] letter[value] = 1 onehot_encoded.append(letter) print(onehot_encoded) # invert encoding inverted = int_to_char[argmax(onehot_encoded[0])] print(inverted)
hello python [7, 4, 11, 11, 14, 26, 15, 24, 19, 7, 14, 13] [[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

В приведенном выше коде мы объявили входную строку и распечатали ее. Затем мы определили вселенную возможных входных значений. Затем создается отображение всех возможных входов из значений char в целочисленные значения. Мы использовали это отображение для кодирования входной строки.

Читайте также:  Одномерная оптимизация метод золотого сечения python

Как видно из вышеприведенного вывода, первая буква h кодируется как 7. Затем это целочисленное кодирование преобразуется в одно горячее кодирование. Одно целое число кодирует символ за раз.

Каждый символ имеет определенное значение индекса; мы отметили этот индекс конкретного символа как 1. Первый символ представлен как 7 в двоичном векторе 27. Мы отметили 7-й индекс как 1 для h.

Теперь мы научимся реализовывать одно горячее кодирование с помощью библиотеки scikit-learn.

Одно горячее кодирование с использованием Scikit-learn

В этом примере предположим, что следующая выходная последовательность 3 меток.

Примерная последовательность из 10 временных шагов может быть.

apple, apple, mango, apple, banana, banana, mango, apple.

Мы кодируем целочисленным значением для вышеуказанных меток, таких как 1, 2, 3. В одном горячем кодировании мы будем использовать двоичный вектор с 3 значениями, например [1, 0, 0]. Последовательность включает по крайней мере один пример одного возможного значения в последовательности.

Мы будем использовать библиотеку scikit-learn, точнее ее модуль LabelEncoder для создания целочисленного кодирования меток и OneHotEncoder для создания одного горячего кодирования целочисленного значения кодирования.

Давайте разберемся в следующем примере.

from numpy import array from numpy import argmax from sklearn.preprocessing import LabelEncoder from sklearn.preprocessing import OneHotEncoder # defining sequence example data_1 = ['apple', 'apple', 'mango', 'apple', 'banana', 'banana', 'mango', 'apple'] values_of_seq = array(data_1) print(values_of_seq) # first appling integer encode label_encoder = LabelEncoder() integer_encoded = label_encoder.fit_transform(values_of_seq) print(integer_encoded) # Now doing binary encode onehot_encoder = OneHotEncoder(sparse=False) integer_encoded = integer_encoded.reshape(len(integer_encoded), 1) onehot_encoded = onehot_encoder.fit_transform(integer_encoded) print(onehot_encoded)
['apple' 'apple' 'mango' 'apple' 'banana' 'banana' 'mango' 'apple'] [0 0 2 0 1 1 2 0] [[1. 0. 0.] [1. 0. 0.] [0. 0. 1.] [1. 0. 0.] [0. 1. 0.] [0. 1. 0.] [0. 0. 1.] [1. 0. 0.]]

В приведенном выше коде сначала мы напечатали последовательность этикеток. Затем мы выполнили целочисленное кодирование и, наконец, одно горячее кодирование. Класс OneHotEncoder возвращает хорошо организованную разреженную кодировку. Но это неэффективно для некоторых приложений при использовании библиотеки keras.

Читайте также:  Счетчик экземпляров класса python

Одно горячее кодирование с помощью Keras

Предположим, у нас есть последовательность, которая уже закодирована целым числом. Мы можем работать с целочисленной кодировкой напрямую или отображать целочисленную кодировку на значениях меток. Мы можем использовать функцию to_categorical() для горячего кодирования целочисленных данных.

В этом примере у нас есть пять целочисленных значений [0, 1, 2, 3, 4], и у нас есть входная последовательность из следующих 15 чисел.

data_1 = [1, 4, 3, 3, 0, 3, 2, 2, 4, 0, 1, 2, 1, 4, 3]

Давайте разберемся в следующем примере.

from numpy import array from numpy import argmax from keras.utils import to_categorical # define example data_1 = [1, 4, 3, 3, 0, 3, 2, 2, 4, 0, 1, 2, 1, 4, 3] data = array(data_1) print(data) # one hot encoding using the to_categorical() method encoded = to_categorical(data) print(encoded) # invert encoding inverted = argmax(encoded[0]) print(inverted)
[1 4 3 3 0 3 2 2 4 0 1 2 1 4 3] [[0. 1. 0. 0. 0.] [0. 0. 0. 0. 1.] [0. 0. 0. 1. 0.] [0. 0. 0. 1. 0.] [1. 0. 0. 0. 0.] [0. 0. 0. 1. 0.] [0. 0. 1. 0. 0.] [0. 0. 1. 0. 0.] [0. 0. 0. 0. 1.] [1. 0. 0. 0. 0.] [0. 1. 0. 0. 0.] [0. 0. 1. 0. 0.] [0. 1. 0. 0. 0.] [0. 0. 0. 0. 1.] [0. 0. 0. 1. 0.]] 1

В приведенном выше примере мы закодировали целое число как двоичный вектор, и распечатали. Затем мы использовали функцию Numpy argmax(), чтобы инвертировать кодировку первого значения в последовательности.

Источник

Оцените статью