Быстрое кодирование на Python с помощью Pandas и Scikit-Learn

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

Вступление

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

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

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

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

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

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

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

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

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

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

Десятичный Двоичный Код Грея Один-горячий


0 000 000 0000000 1 001 001 0000001 2 010 011 0000010 3 011 010 0000100 4 100 110 0001000 5 101 111 0010000 6 110 101 0100000 7 111 100 1000000

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

Это номер 1? Это номер 2? ... Это цифра 7?

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

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

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


Этикетка Я БЫ клубника 1 яблоко 2 Арбуз 3 Лимон 4 Персик 5 апельсин 6


Здесь у нас есть шесть образцов входных категориальных данных. Используемый здесь тип кодирования называется «кодирование метки» - и это очень просто: мы просто назначаем идентификатор для категориального значения.

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

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

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


клубника яблоко Арбуз Лимон Персик апельсин Я БЫ 1 0 0 0 0 0 1 0 1 0 0 0 0 2 0 0 1 0 0 0 3 0 0 0 1 0 0 4 0 0 0 0 1 0 5 0 0 0 0 0 1 6


Из приведенных выше таблиц видно, что для быстрого представления требуется больше цифр, чем для двоичного кода или кода Грея. Для 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, называемый df используя два списка, то есть ids и countries . Если вы вызовете метод head() для фрейма данных, вы должны увидеть следующий результат:

 df.head() 

заголовок кадра данных - одно горячеекодирование{.ezlazyload}

Countries содержит категориальные значения. Мы можем преобразовать значения в Countries в векторы с горячим кодированием, используя 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-Learn

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

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

 from sklearn.preprocessing import LabelBinarizer 

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

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

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

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

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

Точно так же мы можем использовать 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.]] 

Приложения One-Hot Encoding

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

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

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

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

  • либо выйти за пределы этой области.

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

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

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

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

Цифровая схема проектирования

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

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

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

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

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

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

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

цифроваясхема{.ezlazyload}

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

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

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

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

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

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

Недостатки

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

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

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

Заключение

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

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

comments powered by Disqus

Содержание