Feature Engineering: Фаза преобразования (Как кодировать категориальные признаки)

Введение

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

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

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

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

Что такое Feature Engineering?

Для того чтобы объяснить, что такое инженерия характеристик. Я бы хотел начать с определения, данного в Википедии, поскольку оно дало мне интуитивное представление о том, что такое инженерия признаков.

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

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

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

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

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

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

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

Категории инженерии признаков

Инженерия признаков делится на 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, а остальные значения будут закодированы по мере их появления.

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

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

Одноточечное кодирование

Рассмотрим столбец с тремя значениями: черным, красным и синим, чтобы лучше понять, что такое кодирование по методу one-hot. При кодировании по методу one-hot каждое категориальное значение в этом столбце преобразуется в новый столбец, присваивая ему значения 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 раза. Поэтому частотный кодер присваивает столбцу назад частоту, с которой эти значения встречаются. Эта техника очень эффективна. Вы также можете добавить параметр normalize, если хотите иметь относительную частоту каждого значения. Примерно так

from category_encoders import CountEncoder
transformer = CountEncoder(cols="one_hot_data", normalize=True)
df = transformer.fit_transform(df)
Вход в полноэкранный режим Выйти из полноэкранного режима

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

Когда использовать кодировку OneHot или Frequency.

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

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

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

Оцените статью
Procodings.ru
Добавить комментарий