Здесь вы увидите несколько очень интересных методов кодирования данных для категориальных функций вашего проекта машинного обучения.
Обзор
- Понять, что такое категориальное кодирование данных
- Изучите различные методы кодирования и когда их использовать
Введение
Производительность модели машинного обучения зависит не только от модели и гиперпараметров, но и от того, как мы обрабатываем и вводим в модель различные типы переменных. Поскольку большинство моделей машинного обучения принимают только числовые переменные, предварительная обработка категориальных переменных становится необходимым шагом. Нам необходимо преобразовать эти категориальные переменные в числа, чтобы модель могла понимать и извлекать ценную информацию.
Типичный специалист по обработке данных тратит 70–80% своего времени на очистку и подготовку данных. А преобразование категориальных данных - неизбежное занятие. Это не только повышает качество модели, но и помогает улучшить конструкцию элементов. Теперь вопрос в том, как нам действовать дальше? Какой метод категориального кодирования данных мы должны использовать?
В этой статье я объясню различные типы методов категориального кодирования данных с реализацией на Python.
Если вы хотите изучить концепции науки о данных в видеоформате, ознакомьтесь с нашим курсом Введение в науку о данных
Оглавление
- Что такое категориальные данные?
- Кодирование метки или порядковое кодирование
- Одно горячее кодирование
- Фиктивное кодирование
- Кодирование эффектов
- Двоичное кодирование
- Кодирование BaseN
- Хеш-кодирование
- Целевое кодирование
Что такое категориальные данные?
Поскольку в этой статье мы собираемся работать с категориальными переменными, здесь можно быстро освежить их с помощью пары примеров. Категориальные переменные обычно представлены как «строки» или «категории» и имеют конечное число. Вот несколько примеров:
- Город, в котором проживает человек: Дели, Мумбаи, Ахмадабад, Бангалор и др.
- Подразделения, в которых работает человек: Финансы, Кадры, IT, Производство.
- Высшая степень: средняя школа, диплом, бакалавр, магистр, доктор философии.
- Оценки ученика: A +, A, B +, B, B- и т. Д.
В приведенных выше примерах переменные имеют только определенные возможные значения. Кроме того, мы можем видеть, что есть два типа категориальных данных:
- Порядковые данные. Категории имеют собственный порядок.
- Номинальные данные. Категории не имеют определенного порядка.
В порядковых данных при кодировании следует сохранять информацию о порядке предоставления категории. Как и в приведенном выше примере, самая высокая степень, которой обладает человек, дает важную информацию о его квалификации. Степень - важная характеристика, позволяющая решить, подходит ли человек для должности или нет.
При кодировании номинальных данных мы должны учитывать наличие или отсутствие функции. В таком случае понятие порядка отсутствует. Например, город, в котором живет человек. Для данных важно сохранить место проживания человека. Здесь у нас нет никакого порядка или последовательности. Равно, если человек живет в Дели или Бангалоре.
Для кодирования категориальных данных у нас есть пакет python category_encoders. Следующий код поможет вам легко установить.
pip install category_encoders
Кодирование метки или порядковое кодирование
Мы используем этот метод кодирования категориальных данных, когда категориальный признак является порядковым. В этом случае важно соблюдать порядок. Следовательно, кодирование должно отражать последовательность.
В кодировке Label каждая метка преобразуется в целочисленное значение. Мы создадим переменную, которая будет содержать категории, представляющие образовательную квалификацию человека.
import category_encoders as ce import pandas as pd train_df=pd.DataFrame({'Degree':['High school','Masters','Diploma','Bachelors','Bachelors','Masters','Phd','High school','High school']}) # create object of Ordinalencoding encoder= ce.OrdinalEncoder(cols=['Degree'],return_df=True, mapping=[{'col':'Degree', 'mapping':{'None':0,'High school':1,'Diploma':2,'Bachelors':3,'Masters':4,'phd':5}}]) #Original data train_df
#fit and transform train data df_train_transformed = encoder.fit_transform(train_df) df_train_transformed
Одно горячее кодирование
Мы используем эту технику категориального кодирования данных, когда функции являются номинальными (без какого-либо порядка). В одном горячем кодировании для каждого уровня категориальной функции мы создаем новую переменную. Каждой категории сопоставляется двоичная переменная, содержащая 0 или 1. Здесь 0 представляет отсутствие, а 1 представляет наличие этой категории.
Эти недавно созданные двоичные функции известны как фиктивные переменные. Количество фиктивных переменных зависит от уровней, присутствующих в категориальной переменной. Это может показаться сложным. Давайте рассмотрим пример, чтобы лучше понять это. Предположим, у нас есть набор данных с категорией животных, в которой есть разные животные, такие как Собака, Кошка, Овца, Корова, Лев. Теперь нам нужно горячо закодировать эти данные.
После кодирования во второй таблице у нас есть фиктивные переменные, каждая из которых представляет категорию в функции Animal. Теперь для каждой категории, которая присутствует, у нас есть 1 в столбце этой категории и 0 для остальных. Давайте посмотрим, как реализовать горячую кодировку в Python.
import category_encoders as ce import pandas as pd data=pd.DataFrame({'City':[ 'Delhi','Mumbai','Hydrabad','Chennai','Bangalore','Delhi','Hydrabad','Bangalore','Delhi' ]}) #Create object for one-hot encoding encoder=ce.OneHotEncoder(cols='City',handle_unknown='return_nan',return_df=True,use_cat_names=True) #Original Data data
#Fit and transform Data data_encoded = encoder.fit_transform(data) data_encoded
Теперь перейдем к другому очень интересному и широко используемому методу кодирования, то есть к фиктивному кодированию.
Фиктивное кодирование
Схема фиктивного кодирования похожа на горячее кодирование. Этот метод кодирования категориальных данных преобразует категориальную переменную в набор двоичных переменных (также известных как фиктивные переменные). В случае однократного кодирования для N категорий в переменной используется N двоичных переменных. Фиктивное кодирование - небольшое улучшение по сравнению с однократным горячим кодированием. Фиктивная кодировка использует функции N-1 для представления N меток / категорий.
Чтобы лучше понять это, давайте посмотрим на изображение ниже. Здесь мы кодируем одни и те же данные, используя методы однократного и фиктивного кодирования. В то время как one-hot использует 3 переменных для представления данных, тогда как фиктивное кодирование использует 2 переменные для кодирования 3 категорий.
Реализуем это на Python.
import category_encoders as ce import pandas as pd data=pd.DataFrame({'City':['Delhi','Mumbai','Hyderabad','Chennai','Bangalore','Delhi,'Hyderabad']}) #Original Data data
#encode the data data_encoded=pd.get_dummies(data=data,drop_first=True) data_encoded
Здесь, используя аргумент drop_first, мы представляем первую метку Бангалор, используя 0.
Недостатки One-Hot и фиктивного кодирования
Один «горячий» кодировщик и фиктивный кодировщик - это две мощные и эффективные схемы кодирования. Они также очень популярны среди специалистов по анализу данных, но могут оказаться не столь эффективными, когда:
- В данных присутствует большое количество уровней. Если в переменной функции есть несколько категорий, в таком случае нам понадобится аналогичное количество фиктивных переменных для кодирования данных. Например, столбец с 30 различными значениями потребует 30 новых переменных для кодирования.
- Если у нас есть несколько категориальных функций в наборе данных, возникнет аналогичная ситуация, и снова у нас будет несколько двоичных функций, каждая из которых представляет категориальную функцию и их несколько категорий, например, набор данных, имеющий 10 или более категориальных столбцов.
В обоих вышеупомянутых случаях эти две схемы кодирования вносят разреженность в набор данных, то есть несколько столбцов имеют нули, а некоторые из них имеют единицы. Другими словами, он создает несколько фиктивных объектов в наборе данных без добавления дополнительной информации.
Кроме того, они могут привести к ловушке фиктивной переменной. Это феномен, в котором особенности сильно взаимосвязаны. Это означает, что, используя другие переменные, мы можем легко предсказать значение переменной.
Из-за значительного увеличения набора данных кодирование замедляет обучение модели вместе с ухудшением общей производительности, что в конечном итоге делает модель дорогостоящей с точки зрения вычислений. Кроме того, при использовании древовидных моделей эти кодировки не являются оптимальным выбором.
Кодирование эффекта:
Этот метод кодирования также известен как Кодирование отклонения или Кодирование суммы. Кодирование эффекта почти аналогично фиктивному кодированию с небольшой разницей. В фиктивном кодировании мы используем 0 и 1 для представления данных, но при действительном кодировании мы используем три значения, то есть 1,0 и -1.
Строка, содержащая только 0 в фиктивной кодировке, кодируется как -1 в кодировке эффекта. В примере фиктивного кодирования город Бангалор с индексом 4 был закодирован как 0000. В то время как в действительном кодировании он представлен как -1–1–1–1.
Давайте посмотрим, как мы реализуем это в python-
import category_encoders as ce import pandas as pd data=pd.DataFrame({'City':['Delhi','Mumbai','Hyderabad','Chennai','Bangalore','Delhi,'Hyderabad']}) encoder=ce.sum_coding.SumEncoder(cols='City',verbose=False,) #Original Data data
encoder.fit_transform(data)
Кодирование эффектов - это продвинутая техника. Если вам интересно узнать больше о кодировании эффектов, обратитесь к этой интересной статье.
Хеш-кодировщик
Чтобы понять кодировку хеширования, необходимо знать о хешировании. Хеширование - это преобразование ввода произвольного размера в значение фиксированного размера. Мы используем алгоритмы хеширования для выполнения операций хеширования, то есть для генерации хеш-значения входных данных. Кроме того, хеширование - это односторонний процесс, другими словами, нельзя сгенерировать исходный ввод из хеш-представления.
У хеширования есть несколько приложений, таких как поиск данных, проверка повреждения данных, а также шифрование данных. У нас есть несколько доступных хеш-функций, например дайджест сообщений (MD, MD2, MD5), безопасная хеш-функция (SHA0, SHA1, SHA2) и многие другие.
Как и в случае однократного кодирования, кодировщик Hash представляет категориальные функции с использованием новых измерений. Здесь пользователь может указать количество измерений после преобразования с помощью аргумента n_component. Вот что я имею в виду - функция с 5 категориями может быть представлена с помощью N новых функций, аналогично функция со 100 категориями также может быть преобразована с помощью N новых функций. Разве это не звучит потрясающе?
По умолчанию кодировщик хеширования использует алгоритм хеширования md5, но пользователь может передать любой алгоритм по своему выбору. Если вы хотите изучить алгоритм md5, я предлагаю эту статью.
import category_encoders as ce import pandas as pd #Create the dataframe data=pd.DataFrame({'Month':['January','April','March','April','Februay','June','July','June','September']}) #Create object for hash encoder encoder=ce.HashingEncoder(cols='Month',n_components=6)
#Fit and Transform Data encoder.fit_transform(data)
Поскольку хеширование преобразует данные в меньших размерах, это может привести к потере информации. Другой проблемой, с которой сталкивается хеш-кодировщик, является коллизия. Поскольку здесь большое количество функций отображается в меньших размерах, следовательно, несколько значений могут быть представлены одним и тем же хеш-значением, это называется коллизией.
Более того, хеширующие кодеры были очень успешны в некоторых соревнованиях Kaggle. Замечательно попробовать, если набор данных имеет функции высокой мощности.
Двоичное кодирование
Двоичное кодирование - это комбинация хеш-кодирования и однократного кодирования. В этой схеме кодирования категориальный признак сначала преобразуется в числовой с помощью порядкового кодировщика. Затем числа преобразуются в двоичное число. После этого двоичное значение разбивается на разные столбцы.
Двоичное кодирование действительно хорошо работает при большом количестве категорий. Например, города страны, в которую компания поставляет свою продукцию.
#Import the libraries import category_encoders as ce import pandas as pd #Create the Dataframe data=pd.DataFrame({'City':['Delhi','Mumbai','Hyderabad','Chennai','Bangalore','Delhi','Hyderabad','Mumbai','Agra']}) #Create object for binary encoding encoder= ce.BinaryEncoder(cols=['city'],return_df=True) #Original Data data
#Fit and Transform Data data_encoded=encoder.fit_transform(data) data_encoded
Двоичное кодирование - это схема кодирования с эффективным использованием памяти, поскольку в ней используется меньше функций, чем при однократном кодировании. Кроме того, это уменьшает проклятие размерности для данных с высокой мощностью.
Кодировка Base N
Прежде чем погрузиться в кодировку BaseN, давайте сначала попробуем понять, что здесь такое Base?
В системе счисления основание или основание системы счисления - это количество цифр или комбинация цифр и букв, используемых для представления чисел. Наиболее распространенная основа, которую мы используем в нашей жизни, - это 10 или десятичная система, поскольку здесь мы используем 10 уникальных цифр, то есть от 0 до 9 для представления всех чисел. Другая широко используемая система - двоичная, то есть с основанием 2. В ней используются 0 и 1, то есть 2 цифры для выражения всех чисел.
Для двоичного кодирования Base - 2, что означает, что числовые значения категории преобразуются в соответствующую двоичную форму. Если вы хотите изменить базовую схему кодирования, вы можете использовать кодировщик Base N. В случае, когда категорий больше, а двоичное кодирование не может обрабатывать размерность, мы можем использовать более крупную базу, такую как 4 или 8.
#Import the libraries import category_encoders as ce import pandas as pd #Create the dataframe data=pd.DataFrame({'City':['Delhi','Mumbai','Hyderabad','Chennai','Bangalore','Delhi','Hyderabad','Mumbai','Agra']}) #Create an object for Base N Encoding encoder= ce.BaseNEncoder(cols=['city'],return_df=True,base=5) #Original Data data
#Fit and Transform Data data_encoded=encoder.fit_transform(data) data_encoded
В приведенном выше примере я использовал основание 5, также известное как пятеричная система. Это похоже на пример двоичного кодирования. В то время как двоичное кодирование представляет те же данные с помощью 4 новых функций, кодирование BaseN использует только 3 новые переменные.
Следовательно, метод кодирования BaseN дополнительно сокращает количество функций, необходимых для эффективного представления данных, и улучшает использование памяти. По умолчанию Base N - 2, что эквивалентно двоичному кодированию.
Целевое кодирование
Целевое кодирование - это метод кодирования Байса.
Байесовские кодировщики используют информацию из зависимых / целевых переменных для кодирования категориальных данных.
В целевой кодировке мы вычисляем среднее значение целевой переменной для каждой категории и заменяем переменную категории средним значением. В случае категориальных целевых переменных каждая категория заменяется апостериорной вероятностью цели.
#import the libraries import pandas as pd import category_encoders as ce #Create the Dataframe data=pd.DataFrame({'class':['A,','B','C','B','C','A','A','A'],'Marks':[50,30,70,80,45,97,80,68]}) #Create target encoding object encoder=ce.TargetEncoder(cols='class') #Original Data Data
#Fit and Transform Train Data encoder.fit_transform(data['class'],data['Marks'])
Мы выполняем целевое кодирование только для обучающих данных и кодируем тестовые данные, используя результаты, полученные из набора обучающих данных. Несмотря на то, что это очень эффективная система кодирования, у нее есть следующие проблемы, которые приводят к ухудшению производительности модели:
- Это может привести к утечке или переоснащению. Чтобы решить проблему переобучения, мы можем использовать разные методы.
A. При кодировании с исключением одного значения текущее целевое значение уменьшается от общего среднего целевого значения, чтобы избежать утечки.
Б. В другом методе мы можем ввести некоторый гауссов шум в целевую статистику. Величина этого шума является гиперпараметром модели.
2. Вторая проблема, с которой мы можем столкнуться, - это неправильное распределение категорий в обучающих и тестовых данных. В таком случае категории могут принимать экстремальные значения. Следовательно, целевые средние для категории смешиваются с предельным средним целевого значения.
Сноска
Подводя итог, можно сказать, что кодирование категориальных данных - неизбежная часть разработки функций. Более важно знать, какую схему кодирования мы должны использовать. Принимая во внимание набор данных, с которым мы работаем, и модель, которую мы собираемся использовать. В этой статье мы рассмотрели различные методы кодирования, их проблемы и подходящие варианты использования.
Если у вас есть какие-либо комментарии, напишите мне в комментариях ниже.
Первоначально опубликовано на https://www.analyticsvidhya.com 13 августа 2020 г.