Разработка признаков: этап преобразования (как кодировать категориальные признаки)

Введение

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

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

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

  • Что такое функциональная инженерия?
  • Категории функциональной инженерии
  • Что такое Категориальный признак?
  • Каковы типы категориальных признаков
  • Как вы кодируете категориальную функцию и каковы варианты использования, которые позволят вам использовать конкретный метод кодирования.

Что такое функциональная инженерия?

Чтобы я мог уточнить, что влечет за собой проектирование функций. Я хотел бы начать с этого определения из Википедии, потому что оно дало мне представление о том, что такое Feature Engineering.

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

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

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

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

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

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

Функция, которую вы используете, больше всего влияет на результат. Насколько мне известно, ни один алгоритм сам по себе не может дополнить прирост информации, полученный за счет правильной разработки функций — Лука Массарон

Категории функциональной инженерии

Feature Engineering делится на 4 различные категории, которые включают в себя:

  • Преобразование признаков.
  • Извлечение признаков.
  • Создание функции.
  • Выбор функции.

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

Преобразование функции

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

Что такое категориальные переменные/функции?

Категориальные признаки представляют данные, которые можно классифицировать по группам. Они могли представлять цвета, животных и другие вещи. Примеры включают расу, цвет кожи, животное и так далее.

Тип категориальных признаков

Категориальные переменные можно разделить на 3 категории, которые включают в себя:

  • Двоичные значения. Они часто отображают две величины. Они рассматриваются как значения «или/или». Примеры включают «да» или «нет», «истина» или «ложь».
  • Номинальные значения. В реальном мире этот тип функции категории не отображает порядок. Когда вы пытаетесь заказать их, ничего не имеет смысла. Примеры включают (Цвета: черный, синий и красный), (Животное: кошка, собака, лиса) и т. д. Мы видим, что каждый элемент представляет собой отдельную единицу, поэтому пытаться организовать их бессмысленно.
  • Порядковые значения. В реальном мире этот тип данных можно упорядочить. Например, (холодно, жарко, очень жарко), (низко, средне, высоко), оценка (A, B, C) и так далее.

Как кодировать категориальные признаки

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

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

#For Pip install
pip install category_encoders
#For conda environment 
conda install -c conda-forge category_encoders

Кодирование двоичных значений

Кодировать двоичные категориальные переменные несложно. Поскольку бинарные категориальные переменные, такие как True или False, могут быть связаны со значением логического элемента (0 и 1). Мы можем просто выполнить это с помощью функции или метода Python. Истинные значения будут обрабатываться как 1 с, а ложные значения будут рассматриваться как 0 с. Это также работает для «Да» и «Нет». Мы можем использовать любой из этих кодов для достижения этого.

#converting the first feature win1 using the replace method
df["win1"] = df["win1"].replace({"N":0, "Y":1})
#converting the second feature win2 using an anonymous function
df["win2"] = df["win2"].apply(lambda x: 1 if x=="T" else (0 if x == "F" else None))

Кодирование порядковых значений

Кодирование порядковых значений также является довольно сложной задачей, поскольку эти значения упорядочены, т. Е. Их можно ранжировать, с ними легче разобраться. Рассмотрим следующий сценарий. У вас есть порядковый номер в диапазоне от крайне слабого до слабого и сильного. Поскольку крайний слабый — это самое низкое значение, а сильный — самое высокое, мы можем закодировать это значение в логическом порядке 1, 2, 3. 1 — очень слабый, 2 — слабый, 3 — сильный. Теперь, когда мы поняли, что для того, чтобы сделать это в python, мы печатаем.

from category_encoders import OrdinalEncoder
transformer = OrdinalEncoder(mapping= [{'col': 'ordinal_data',
                            'mapping': {"strong": 3, 'weak': 2, 'extremely weak': 1}}])
df["ordinal_data"] = transformer.fit_transform(df["ordinal_data"])

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

Кодирование номинальных данных

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

Горячее кодирование

Рассмотрим столбец с тремя значениями: черный, красный и синий, чтобы лучше понять одно горячее кодирование. Горячее кодирование будет принимать каждое категориальное значение в этом столбце и преобразовывать его в новый столбец, присваивая им значения 1 и 0. Давайте посмотрим на пример, чтобы лучше понять, что происходит.

from category_encoders import OneHotEncoder
transformer = OneHotEncoder(cols="one_hot_data", use_cat_names=True)
df = transformer.fit_transform(df)

Как видно на предыдущем рисунке, новые столбцы были созданы из этих значений, и всякий раз, когда каждое значение встречается в этой строке, ему будет присвоено значение 1, а другим будет присвоено значение 0. Мы можем видеть на предыдущем изображении, что черный цвет был первым значением. это произошло в строке, а на втором изображении ему было присвоено 1, а другим значениям было присвоено 0, потому что в строке был только черный цвет. Точно так же синий появился во второй строке, поэтому в новом изображении синему присваивался 1 только тогда, когда черному и синему столбцам присваивался 0.

Частотное кодирование

Это очень простая техника. Что он делает, так это то, что он подсчитывает, сколько раз встречается номинальное значение. Затем он отображает частоту обратно в столбец. Давайте рассмотрим пример, чтобы понять, что происходит.

from category_encoders import CountEncoder
transformer = CountEncoder(cols="one_hot_data")
df = transformer.fit_transform(df)

Мы видим, что на предыдущем рисунке черный цвет встречался 2 раза, а красный — 3 раза. Таким образом, частотный кодировщик назначает частоту, с которой эти значения встречаются в столбце назад. Эта техника очень эффективна. Вы также можете добавить параметр нормализации, если хотите иметь относительную частоту каждого значения. Что-то вроде этого

from category_encoders import CountEncoder
transformer = CountEncoder(cols="one_hot_data", normalize=True)
df = transformer.fit_transform(df)

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

Когда использовать OneHot или частотное кодирование.

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

Заключение и изучение Подробнее.

Имейте в виду, что существуют и другие методы кодирования, каждый из которых имеет свой собственный набор приложений. Если вы хотите узнать о них больше, я найму вас для более подробного изучения в Интернете. Однако перечисленные выше кодировки являются одними из наиболее типичных, которые вы будете видеть ежедневно. Спасибо, что нашли время, чтобы прочитать это. Скоро я выпущу свою вторую серию, которая будет посвящена численному преобразованию и масштабированию. Будьте осторожны 🚀🚀.