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

Обзор

  • Понять, что такое категориальное кодирование данных
  • Изучите различные методы кодирования и когда их использовать

Введение

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

Типичный специалист по обработке данных тратит 70–80% своего времени на очистку и подготовку данных. А преобразование категориальных данных - неизбежное занятие. Это не только повышает качество модели, но и помогает улучшить конструкцию элементов. Теперь вопрос в том, как нам действовать дальше? Какой метод категориального кодирования данных мы должны использовать?

В этой статье я объясню различные типы методов категориального кодирования данных с реализацией на Python.

Если вы хотите изучить концепции науки о данных в видеоформате, ознакомьтесь с нашим курсом Введение в науку о данных

Оглавление

  • Что такое категориальные данные?
  • Кодирование метки или порядковое кодирование
  • Одно горячее кодирование
  • Фиктивное кодирование
  • Кодирование эффектов
  • Двоичное кодирование
  • Кодирование BaseN
  • Хеш-кодирование
  • Целевое кодирование

Что такое категориальные данные?

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

  1. Город, в котором проживает человек: Дели, Мумбаи, Ахмадабад, Бангалор и др.
  2. Подразделения, в которых работает человек: Финансы, Кадры, IT, Производство.
  3. Высшая степень: средняя школа, диплом, бакалавр, магистр, доктор философии.
  4. Оценки ученика: 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 и фиктивного кодирования

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

  1. В данных присутствует большое количество уровней. Если в переменной функции есть несколько категорий, в таком случае нам понадобится аналогичное количество фиктивных переменных для кодирования данных. Например, столбец с 30 различными значениями потребует 30 новых переменных для кодирования.
  2. Если у нас есть несколько категориальных функций в наборе данных, возникнет аналогичная ситуация, и снова у нас будет несколько двоичных функций, каждая из которых представляет категориальную функцию и их несколько категорий, например, набор данных, имеющий 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'])

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

  1. Это может привести к утечке или переоснащению. Чтобы решить проблему переобучения, мы можем использовать разные методы.

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

Б. В другом методе мы можем ввести некоторый гауссов шум в целевую статистику. Величина этого шума является гиперпараметром модели.

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

Сноска

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

Если у вас есть какие-либо комментарии, напишите мне в комментариях ниже.

Первоначально опубликовано на https://www.analyticsvidhya.com 13 августа 2020 г.