Концепции и приложения категориального кодирования, которые помогут вашей работе

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

Категориальное кодирование - это процесс преобразования категориальных данных в числовые. Существует множество методов категориального кодирования, но я хочу объяснить базовый процесс, который должен знать каждый специалист по данным. В этой статье я выделю четыре категориальных концепции кодирования, которые нужно знать специалистам по данным. Давайте вникнем в это.

1. Горячее кодирование (OHE)

One-Hot Encoding или OHE - это метод, который преобразует все элементы категориального столбца в новые столбцы, представленные 0 или 1 (двоичные значения), чтобы обозначить наличие значения категории. Давайте посмотрим на пример на изображении ниже.

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

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

Еще одно замечание: One-Hot Encoding может не подходить для машинного обучения на основе дерева, потому что OHE вызывает неэффективность во время разделения. Возможно, вы захотите прочитать об этом подробнее в статье ниже.



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

import pandas as pd
import seaborn as sns
mpg = sns.load_dataset('mpg')
mpg.head()

В этом примере я бы использовал набор данных mpg из пакета seaborn. Данные содержат как категориальные, так и числовые столбцы, с которыми мы могли бы поэкспериментировать.

На следующем шаге я бы использовал пакет Pandas, используя функцию с именем get_dummies для выполнения OHE.

pd.get_dummies(mpg, drop_first = True, columns = ['origin'] ).head()

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

2. Кодировка ярлыка

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

Как видно из изображения выше, категориальный столбец преобразован в числовое значение (начальная школа = 1, средняя школа = 2 и т. Д.).

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

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

Я часто создаю свою функцию, но давайте попробуем использовать пакет Sklearn Python для процесса кодирования меток.

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
mpg['origin_le'] = le.fit_transform(mpg['origin'])
mpg.sample(5)

Кодировка метки преобразует столбец «происхождение» в числовой. Порядок алфавита определял значения; поэтому значения «европа» были присвоены 0, а «США» - 2.

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

Хотя, если вы хотите положиться на Sklearn; он предоставляет OrdinalEncoder класс, который может преобразовать категорию в присвоенную нами метку.

3. Хеш-кодирование

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

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

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

Основное преимущество использования Hash Encoding заключается в том, что вы можете контролировать количество числовых столбцов, создаваемых процессом. Вы можете представить категориальные данные с 25 или 50 значениями с пятью столбцами (или любым числом, которое хотите). Давайте попробуем выполнить Hash Encoding на примере кодирования.

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

pip install category_encoders

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



Используя category_encoders, давайте попробуем хешировать данные категории в образце набора данных mpg. В нашем наборе данных есть данные «model_year» с 13 кардинальными числами, и я хочу преобразовать их в пять числовых характеристик. Для этого мы могли бы попробовать следующий код.

import category_encoders as ce
encoder=ce.HashingEncoder(cols='model_year',n_components=5)
hash_res = encoder.fit_transform(mpg['model_year'])
hash_res.sample(5)

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

pd.concat([encoder.fit_transform(mpg['model_year']), mpg], axis =1).sample(5)

Как видно из изображения выше, данные «model_year» были преобразованы в числовые значения 0 или 1, и модель машинного обучения может использовать эти данные для обучения.

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

Но многие конкуренты Kaggle используют Hash Encoding, чтобы выиграть соревнование, поэтому попробовать стоит.

4. Оставить одноразовую кодировку (LOOE)

Leave One Out Encoding похожа на Target Encoding, но добавляет еще один шаг для обработки переобучения. Чтобы понять процесс LOOE, позвольте мне сначала объяснить концепцию целевой кодировки. Метод целевого кодирования - это категориальное кодирование, которое преобразует категориальные данные в числовое значение с использованием целевой (y) информации. Давайте воспользуемся образцом изображения, чтобы лучше понять концепцию.

У нас есть «Pclass» как наша независимая функция и «Survived» как цель на изображении выше. При применении метода целевого кодирования он преобразует значения класса 2 в 0,5, класса 3 в 0 и класса 1 в 1. Это преобразование основывается на информации о «выживших» данных или целевом объекте.

Процесс прост - общее количество выживших классов (1) для каждого элемента (Class 1, Class 2, Class 3) делится на общее количество для каждого класса. В классе 2 1 выжил и 1 не выжил, что отображается как 1/2 или 0,5 при использовании техники целевого кодирования.

Leave One Out Encoding имеет точный подход к целевой кодировке, за исключением того, что LOOE исключает цель текущей строки в вычислении, чтобы уменьшить эффект выброса. Это означает, что результат вычисления между классами True и False цели может быть разным для каждого класса. Функция LOOE также может ввести распределение гауссова шума для уменьшения переобучения.

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

titanic = sns.load_dataset('titanic')
#Passing value 0.1 at sigma parameter to introduce noise
loo_encoder=ce.LeaveOneOutEncoder(cols='pclass', sigma = 0.1)
loo_res = loo_encoder.fit_transform(titanic['pclass'], titanic['survived']).rename(columns = {'pclass': 'loo_pclass'})
pd.concat([loo_res,titanic], axis =1).sample(5)

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

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

Заключение

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

В этой статье я описываю 4 метода категориального кодирования, которые необходимо знать специалистам по данным; они есть:

  1. Одно горячее кодирование
  2. Кодировка метки
  3. Хеш-кодирование
  4. Оставить одну кодировку

Я надеюсь, что это помогает!

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

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

Посетите меня в моем LinkedIn или Twitter.