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

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

Например, для категориальной переменной «Пол» с метками «женский» и «мужской» мы можем сгенерировать логическую переменную «женский», которая принимает 1, если человек «женский», или 0 в противном случае, или мы можем сгенерировать переменная «мужчина», которая принимает 1, если человек «мужчина», и 0 в противном случае.

Для категориальной переменной «цвет» со значениями «красный», «синий» и «зеленый» мы можем создать 3 новые переменные с именами «красный», «синий» и «зеленый». Эти переменные будут принимать значение 1, если наблюдение имеет указанный цвет, или 0 в противном случае.

Кодирование в k-1 фиктивных переменных

Однако обратите внимание, что для переменной «цвет», создав 2 двоичные переменные, скажем, «красный» и «синий», мы уже кодируем ВСЮ информацию:

- если наблюдение красное, оно будет захвачено переменной "красный" (красный = 1, синий = 0)
- если наблюдение синее, оно будет захвачено переменной "синий" (красный = 0, синий = 1)
- если наблюдение зеленое, то оно будет захвачено комбинацией «красного» и «синего» (красный = 0, синий = 0)

Нам не нужно добавлять третью переменную «зеленый», чтобы зафиксировать, что наблюдение является зеленым.

В более общем случае категориальная переменная должна быть закодирована путем создания k-1 двоичных переменных, где k — количество различных категорий. В случае пола k=2 (мужской/женский), поэтому нам нужно создать только 1 (k — 1 = 1) бинарную переменную. В случае цвета, который имеет 3 разные категории (k=3), нам нужно создать 2 (k — 1 = 2) бинарных переменных, чтобы получить всю информацию.

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

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

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

Исключение: одно горячее кодирование в k фиктивных переменных

Есть несколько случаев, когда лучше кодировать переменные в k фиктивных переменных:

- при построении древовидных алгоритмов
- при выборе признаков с помощью рекурсивных алгоритмов
- при заинтересованности в определении важности каждой отдельной категории

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

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

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

– Простота реализации
– Не делается никаких предположений о распределении или категориях категориальной переменной
– Сохраняется вся информация о категориальной переменной
– Подходит для линейных моделей

Ограничения

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

Примечания

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

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

Кодирование важно

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

Почему?

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

## Одна горячая кодировка с пандами

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

- quick
- возвращает кадр данных pandas
- возвращает имена функций для фиктивных переменных

Ограничения панд:

- он не сохраняет информацию из данных поезда для распространения на тестовые данные

— — -

Метод панд get_dummies() создаст столько двоичных переменных, сколько категорий в переменной:

Если переменная color имеет 3 категории в данных поезда, она создаст 2 фиктивные переменные. Однако, если переменная color имеет 5 категорий в тестовых данных, она создаст 4 бинарные переменные, поэтому обучающие и тестовые наборы будут иметь разное количество функций и будут несовместимы с обучением и подсчетом очков с использованием Scikit-learn.

На практике мы не должны использовать get-dummy в наших конвейерах машинного обучения. Однако это полезно для быстрого исследования данных. Давайте посмотрим на это на примерах.

в k фиктивных переменных

Бонус: get_dummies() может обрабатывать отсутствующие значения

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

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

- quick
- Создает одинаковое количество функций в обучающем и тестовом наборах.

Ограничения

  • он возвращает массив numpy вместо кадра данных pandas
    - он не возвращает имена переменных, поэтому неудобен для исследования переменных.

Спасибо за чтение. Мой линкедин