Рубрики
Без рубрики

One-Hot Encoding in Python with Pandas and Scikit-Learn

Однократное кодирование-это фундаментальная и распространенная схема кодирования, используемая в машинном обучении и науке о данных. В этой статье мы рассмотрим одноразовое кодирование с помощью Pandas и Scikit-Learn в Python.

Автор оригинала: Mila Lukic.

Вступление

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

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

Это действие называется предварительной обработкой . Большая часть предварительной обработки-это кодирование – представление каждого отдельного фрагмента данных способом, который может понять компьютер (название буквально означает “преобразование в компьютерный код”).

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

В этой статье мы объясним, что такое one-hot кодирование и реализуем его в Python, используя несколько популярных вариантов: Pandas и Scikit-Learn . Мы также сравним его эффективность с другими типами представления в компьютерах, его сильные и слабые стороны, а также его приложения.

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

Однострочное кодирование-это тип векторного представления, в котором все элементы в векторе равны 0, за исключением одного, который имеет значение 1, где 1 представляет собой логическое определение категории элемента.

Существует также аналогичная реализация, называемая One-Cold Encoding , где все элементы вектора равны 1, за исключением одного, значение которого равно 0.

Например, [0, 0, 0, 1, 0] и [1 ,0, 0, 0, 0] это могут быть некоторые примеры однократных горячих векторов. Подобный метод, также используемый для представления данных, был бы фиктивными переменными в статистике.

Это очень отличается от других схем кодирования, которые все позволяют нескольким битам иметь значение 1. Ниже приведена таблица, в которой сравнивается представление чисел от 0 до 7 в двоичном коде, коде Грея и единице-hot:

0 0 0 0
1 1 1 1
10 2 10 11
11 3 100 10
100 4 1000 110
101 5 10000 111
110 6 100000 101
111 7 1000000 100

Практически для каждого одного горячего вектора мы задаем n вопросов, где n -количество категорий, которые у нас есть:

Это номер 1? Это номер 2? … Это номер 7?

Каждый “0” является “ложным”, и как только мы попадаем в “1” в векторе, ответ на вопрос будет “истинным”.

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

Например, некоторые векторы могут быть оптимальными для регрессии (аппроксимирующие функции, основанные на прежних возвращаемых значениях), а некоторые могут быть оптимальными для классификации (категоризация в фиксированные наборы/классы, обычно двоичные):

1 Клубника
2 Яблоко
3 Арбуз
4 Лимон
5 Персик
6 Оранжевый

Здесь мы имеем шесть выборочных входных данных категориальных данных. Тип кодировки, используемый здесь, называется “label encoding” – и это очень просто: мы просто присваиваем идентификатор категориальному значению.

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

Было бы бессмысленно говорить, что наша категория “Клубника” больше или меньше, чем “Яблоки”, или что добавление категории “Лимон” к “Персику” даст нам категорию “Апельсин”, поскольку эти значения не являются порядковыми.

Если бы мы представляли эти категории в одной горячей кодировке, мы бы фактически заменили строки столбцами. Мы делаем это, создавая один логический столбец для каждой из наших заданных категорий, где только один из этих столбцов может принимать значение 1 для каждого образца:

1 0 0 0 0 1 0
2 1 0 0 0 0 0
3 0 0 0 0 0 1
4 0 1 0 0 0 0
5 0 0 1 0 0 0
6 0 0 0 1 0 0

Из приведенных выше таблиц видно, что в одномерном представлении требуется больше цифр по сравнению с двоичным или серым кодом. Для цифр n однократное кодирование может представлять только значения n , в то время как двоичное или серое кодирование может представлять 2 n значения с использованием n цифр.

Реализация

Панды

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

Мы создадим очень простой набор данных – список стран и их детей:

import pandas as pd

ids = [11, 22, 33, 44, 55, 66, 77]
countries = ['Spain', 'France', 'Spain', 'Germany', 'France']

df = pd.DataFrame(list(zip(ids, countries)),
                  columns=['Ids', 'Countries'])

В приведенном выше скрипте мы создаем фрейм данных Pandas dataframe , называемый df , используя два списка, т. е. ids и страны . Если вы вызовете метод head() для фрейма данных, то увидите следующий результат:

df.head()
заголовок кадра данных одно горячее кодирование

Столбец Страны содержит категориальные значения. Мы можем преобразовать значения в столбце Страны в однократно закодированные векторы с помощью функции get_dummies() :

y = pd.get_dummies(df.Countries, prefix='Country')
print(y.head())

Мы передали Country в качестве значения атрибута prefix метода get_dummies () , поэтому вы можете увидеть строку Country с префиксом перед заголовком каждого из столбцов с одним горячим кодированием в выходных данных.

Запуск этого кода дает:

   Country_France  Country_Germany  Country_Spain
0               0                0              1
1               1                0              0
2               0                0              1
3               0                1              0
4               1                0              0

Scikit-Учись

Альтернативой было бы использование другой популярной библиотеки – Scikit-Learn. Для этой цели он предлагает как класс OneHotEncoder , так и класс LabelBinarizer .

Во-первых, давайте начнем с импорта LabelBinarizer :

from sklearn.preprocessing import LabelBinarizer

А затем, используя тот же фрейм данных, что и раньше, давайте создадим экземпляр LabelBinarizer и поместим его:

y = LabelBinarizer().fit_transform(df.Countries)

Печать y даст:

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

Хотя это далеко не так красиво, как подход Панд.

Аналогично, мы можем использовать класс OneHotEncoder , который поддерживает многоколоночные данные, в отличие от предыдущего класса:

from sklearn.preprocessing import OneHotEncoder

А затем давайте заполним список и поместим его в кодер:

x = [[11, "Spain"], [22, "France"], [33, "Spain"], [44, "Germany"], [55, "France"]]
y = OneHotEncoder().fit_transform(x).toarray()
print(y)

Запуск этого даст результат:

[[1. 0. 0. 0. 0. 0. 0. 1.]
 [0. 1. 0. 0. 0. 1. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 1.]
 [0. 0. 0. 1. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1. 1. 0. 0.]]

Применение одногорячего кодирования

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

Машинное обучение

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

Большинство методов и моделей машинного обучения работают с очень ограниченным набором данных (обычно двоичным). Нейронные сети потребляют данные и выдают результаты в диапазоне 0..1 и редко когда мы выходим за эти рамки.

Короче говоря, подавляющее большинство алгоритмов машинного обучения получают выборочные данные (” обучающие данные “), из которых извлекаются функции. На основе этих особенностей создается математическая модель, которая затем используется для прогнозирования или принятия решений без явного программирования для выполнения этих задач.

Отличным примером может быть Классификация , где входные данные могут быть технически неограниченными, но выходные данные обычно ограничены несколькими классами. В случае бинарной классификации (скажем, мы учим нейронную сеть классифицировать кошек и собак) у нас будет отображение 0 для кошек, и 1 для собак.

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

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

Проектирование Цифровых схем

Многие базовые цифровые схемы используют одноступенчатую нотацию для представления своих значений ввода-вывода.

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

Хорошим примером конечного автомата является кольцевой счетчик -тип счетчика, состоящий из триггеров, соединенных со сдвиговым регистром, в котором выход одного триггера соединяется со входом другого.

Первый триггер в этом счетчике представляет первое состояние, второй-второе состояние и так далее. В начале все триггеры в машине установлены на “0”, за исключением первого, который установлен на “1”.

Следующий тактовый край, приходящий к триггерам, продвигает один “горячий” бит ко второму триггеру. “Горячий” бит продвигается таким образом до последнего состояния, после чего машина возвращается в первое состояние.

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

Это полная противоположность и берет один горячий вход и преобразует его в двоичный или серый:

проектирование цифровых схем

Преимущества и недостатки одногорячего кодирования

Как и любой другой тип кодирования, one-hot имеет много хороших моментов, а также проблемных аспектов.

Преимущества

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

Еще одна замечательная вещь в one-hot encoding-это простота реализации. Цифровые схемы, выполненные в этой нотации, очень легко проектировать и модифицировать. Нелегальные состояния в конечной машине также легко обнаружить.

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

Недостатки

Одним из главных недостатков одногорячего кодирования является упомянутый выше факт, что оно не может представлять много значений (для n состояний нам понадобятся n цифры – или триггеры). Вот почему, если бы мы хотели реализовать, например, одноразовый кольцевой счетчик с 15 состояниями, нам понадобилось бы 15 триггеров, тогда как двоичной реализации потребовалось бы только три триггера.

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

Другая проблема с этим типом кодирования заключается в том, что многие состояния в конечной машине были бы незаконными-для каждого n допустимого состояния существует ( 2 n – n) незаконные. Хорошо, что эти незаконные состояния, как уже было сказано, действительно легко обнаружить (достаточно было бы одного XOR-гейта), так что позаботиться о них не очень сложно.

Вывод

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

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