Статья о том, что такое горячее кодирование, зачем его использовать и как это сделать (на 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 долл. США в месяц (без дополнительной платы).
- Полезно? Купите мне Ко-фи.