Статья о том, что такое горячее кодирование, зачем его использовать и как это сделать (на Python)

При работе с реальными данными часто возникают наборы данных со «смешанными» значениями: строками и числами. Если вы новичок в мире наук о данных и машинного обучения, вы обычно находите «идеально красивые» столбцы (в лучшем случае, с некоторыми Nans), часто с масштабированными значениями. Но когда дело доходит до реальных данных, нам часто приходится иметь дело с беспорядочными данными.

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

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

1. Зачем вам нужно горячее кодирование

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

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

Теперь представьте колонну с какими-то животными; что-то вроде:

animals = ['dog', 'cat', 'mouse'] 

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

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

Ловушка фиктивных переменных — это сценарий, в котором присутствующие переменные становятся сильно коррелированными друг с другом, и это означает важную вещь: однократное кодирование может привести к мультиколлинеарности; это означает, что мы всегда должны анализировать переменные (новые функции, также известные как новые столбцы) и решать, стоит ли удалять некоторые из них (вы можете прочитайте мою статью здесь о выборе признаков: она охватывает даже сценарий мультиколлинеарности).

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

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

2. Метод «OneHotEncoder» в scikit-learn

Первый метод, который я хочу вам показать, — это метод «OneHotEncoder», предоставленный scikit-learn. Давайте непосредственно сделаем практический пример. Предположим, у нас есть такой набор данных:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
# initializing values
data = {'Name':['Tom', 'Jack', 'Nick', 'John',
                'Tom', 'Jack', 'Nick', 'John',
                'Tom', 'Jack', 'Nick', 'John',],
        'Time':[20, 21, 19, 18,
                20, 100, 19, 18,
                21, 22, 21, 20]
}
#creating dataframe
df = pd.DataFrame(data)
#showing head
df.head()

Чтобы выполнить однократное кодирование, мы можем использовать следующий код:

#creating instance of one-hot-encoder
encoder = OneHotEncoder(handle_unknown='ignore')
#perform one-hot encoding on columns 
encoder_df = pd.DataFrame(encoder.fit_transform(df[['Name']]).toarray())
#merge one-hot encoded columns back with original DataFrame
df2 = df.join(encoder_df)
#drop columns with strings
df2.drop('Name', axis=1, inplace=True)
#showing new head
df2.head()

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

Теперь у этого метода есть проблема: как видите, новые столбцы — это числа… как понять, какое число представляет ваше старое строковое значение? Чтобы быть более конкретным: какие из этих чисел Том, а какие Ник? Мы должны каким-то образом переименовать столбцы.

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

К счастью, я разместил этот метод на Linkedin, и Филиппо, парень из моей сети, ответил и предложил мне другой метод. Давай увидим это.

3. «get_dummy» в пандах

Существует гораздо более простой способ выполнить однократное кодирование, и это можно сделать непосредственно в pandas. Рассмотрим фрейм данных df в том виде, в каком мы его создали ранее. Чтобы закодировать его, мы можем просто написать следующую строку кода:

#one-hot encoding
df3 = pd.get_dummies(df, dtype=int)
#showing new head
df3.head()

Так просто, как, что. С помощью всего одной строки кода вы получаете столбцы, названные с уникальными значениями, присутствующими в столбце «Имя», и вы удаляете столбец «Имя». Теперь, если вы хотите переименовать столбцы, например, с «Name_Jack» на «Jack», вы можете легко сделать это с помощью Pandas, но имена столбцов известны.

Выводы

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

  • Подпишитесь на бюллетень my Substack, чтобы получать больше материалов о Python и машинном обучении.
  • Понравилась статья? Присоединяйтесь к Medium по моей реферальной ссылке: разблокируйте весь контент на Medium за 5 долл. США в месяц (без дополнительной платы).
  • Полезно? Купите мне Ко-фи.