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

Отличия LabelEncoder и OneHotEncoder в SciKit Learn

Если вы недавно начали свой путь в машинном обучении, вы можете запутаться между LabelEncoder и OneHotEncoder. Оба кодировщика — часть библиотеки SciKit Learn в Python и оба используются для преобразования категориальных или текстовых данных в числа, которые наши предсказательные модели понимают лучше. Давайте выясним отличия между кодировщиками на простеньком примере.

Кодирование признаков

Прежде всего, документацию SciKit Learn для LabelEncoder можно найти здесь. Теперь рассмотрим такие данные:

кодирование категориальных признаков pandas. Смотреть фото кодирование категориальных признаков pandas. Смотреть картинку кодирование категориальных признаков pandas. Картинка про кодирование категориальных признаков pandas. Фото кодирование категориальных признаков pandas

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

И для преобразования подобных категорий в понятные модели числовые данные мы и используем класс LabelEncoder. Таким образом, всё что нам нужно сделать, чтобы получить признак для первого столбца, это импортировать класс из библиотеки sklearn, обработать колонку функцией fit_transform и заменить существующие текстовые данные новыми закодированными. Давайте посмотрим код.

Предполагается, что данные находятся в переменной x. После запуска кода выше, если вы проверите значение x, то увидите, что три страны в первом столбце были заменены числами 0, 1 и 2.

кодирование категориальных признаков pandas. Смотреть фото кодирование категориальных признаков pandas. Смотреть картинку кодирование категориальных признаков pandas. Картинка про кодирование категориальных признаков pandas. Фото кодирование категориальных признаков pandas

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

Проблема здесь в том, что, поскольку разные числа в одном столбце, модель неправильно подумает, что данные находятся в каком-то особом порядке — 0

OneHotEncoder

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

Этот кодировщик берёт столбец с категориальными данными, который был предварительно закодирован в признак, и создаёт для него несколько новых столбцов. Числа заменяются на единицы и нули, в зависимости от того, какому столбцу какое значение присуще. В нашем примере мы получим три новых столбца, по одному для каждой страны — Франции, Германии и Испании.

Для строк, у которых первый столбец — Франция, столбец «Франция» будет установлен в «1», а два других столбца в «0». Аналогично для строк, у которых первый столбец — Германия, столбец «Германия» будет иметь «1», а два других столбца будут иметь «0».

Делается это весьма просто:

В конструкторе мы указываем, какой столбец должен быть обработан OneHotEncoder, в нашем случае — [0]. Затем преобразуем массив x с помощью функции fit_transform объекта кодировщика, который только что создали. Вот и всё, теперь у нас три новых столбца в наборе данных:

кодирование категориальных признаков pandas. Смотреть фото кодирование категориальных признаков pandas. Смотреть картинку кодирование категориальных признаков pandas. Картинка про кодирование категориальных признаков pandas. Фото кодирование категориальных признаков pandas

Как видите вместо одной колонки со страной мы получили три новых, кодирующих эту страну.

В этом и есть отличие от LabelEncoder и OneHotEncoder.

Источник

Наука о данных за 5 минут: что такое One Hot Encoding?

кодирование категориальных признаков pandas. Смотреть фото кодирование категориальных признаков pandas. Смотреть картинку кодирование категориальных признаков pandas. Картинка про кодирование категориальных признаков pandas. Фото кодирование категориальных признаков pandas

Если вы работаете в области науки о данных, вы, вероятно, слышали термин «одно горячее кодирование». Даже документация Sklearn говорит вам «кодировать категориальные целочисленные функции, используя горячую схему». Но что такое горячее кодирование и почему мы его используем?

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

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

Что такое горячее кодирование?

Категориальные данные относятся к переменным, которые состоят из значений меток, например, переменная «цвет» может иметь значения «красный», «синий» и «зелёный». Думайте о ценностях как о разных категориях, которые иногда имеют естественный порядок.

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

Одно горячее кодирование — это один из методов преобразования данных для подготовки их к алгоритму и получения лучшего прогноза. С помощью one-hot мы конвертируем каждое категориальное значение в новый категориальный столбец и присваиваем этим столбцам двоичное значение 1 или 0. Каждое целочисленное значение представлено как двоичный вектор. Все значения равны нулю, а индекс отмечен цифрой 1.

Взгляните на эту диаграмму, чтобы лучше понять:

кодирование категориальных признаков pandas. Смотреть фото кодирование категориальных признаков pandas. Смотреть картинку кодирование категориальных признаков pandas. Картинка про кодирование категориальных признаков pandas. Фото кодирование категориальных признаков pandas

Применим это к примеру. Скажем, у нас есть значения красный и синий. При использовании one-hot мы бы присвоили красному цвету числовое значение 0 и синему — числовому значению 1.

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

После присвоения числовых значений мы создаём двоичный вектор, представляющий наши числовые значения. В этом случае длина нашего вектора будет равна 2, поскольку у нас есть 2 значения. Таким образом, redзначение может быть представлено двоичным вектором [1,0], а blueзначение будет представлено как [0,1].

Зачем использовать одно горячее кодирование?

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

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

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

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

Преобразование наших данных в числовые значения вручную включает два основных шага:

На первом этапе нам нужно присвоить каждому значению категории целочисленное или числовое значение. Если бы у нас были значения красный, жёлтый и синий, мы могли бы присвоить им 1, 2 и 3 соответственно.

Имея дело с категориальными переменными, которые не имеют порядка или взаимосвязи, нам нужно сделать ещё один шаг вперёд. Шаг второй включает применение однократного кодирования к только что присвоенным целым числам. Для этого мы удаляем целочисленную переменную и добавляем двоичную переменную для каждой уникальной переменной.

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

Примечание. Во многих других полях двоичные переменные называются фиктивными переменными.

Одно горячее кодирование с помощью Pandas

Нам не нужно вручную выполнять горячее кодирование. Многие инструменты для анализа данных предлагают простые способы кодирования ваших данных. Библиотека Python Pandas предоставляет функцию, вызываемую get_dummiesдля включения быстрого кодирования.

Источник

«От категорий к векторам» или нестандартное кодирование категориальных данных. Часть 1

кодирование категориальных признаков pandas. Смотреть фото кодирование категориальных признаков pandas. Смотреть картинку кодирование категориальных признаков pandas. Картинка про кодирование категориальных признаков pandas. Фото кодирование категориальных признаков pandas

Привет, Хабр! С вами Артём, аналитик больших данных МегаФона. На работе занимаюсь рекомендательными системами и интересуюсь NLP. Эти две вещи и привели меня к рассматриваемой тут теме, так что садитесь поудобнее, и поехали. Кстати, к статье прилагается код, ищите ссылки внутри.

Интро или «откуда ноги растут»

кодирование категориальных признаков pandas. Смотреть фото кодирование категориальных признаков pandas. Смотреть картинку кодирование категориальных признаков pandas. Картинка про кодирование категориальных признаков pandas. Фото кодирование категориальных признаков pandas

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

Но как это все удобнее делать, ведь у категориальных признаков особый характер?

Примерно из такого праздного вопроса родилась идея провести несколько экспериментов с кодом, а потом появилась возможность выступить на Data Fest 2021 с этой темой. Чтобы помочь всем заинтересованным, мне захотелось оформить результаты в виде статьи: при желании можете воспользоваться наработками и развить их во что-то большее.

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

кодирование категориальных признаков pandas. Смотреть фото кодирование категориальных признаков pandas. Смотреть картинку кодирование категориальных признаков pandas. Картинка про кодирование категориальных признаков pandas. Фото кодирование категориальных признаков pandas

Надеюсь, вам еще не наскучила статья, перейдем же к делу.

Завязка или «жила-была модельная задача»

Рассмотрим задачу, которую вы, при желании, можете транслировать на свои кейсы:

У нас есть датасет, который полностью состоит из категориальных признаков. В данном случае использовались материалы одного из соревнований на Kaggle. Датасет имеет следующий вид:

кодирование категориальных признаков pandas. Смотреть фото кодирование категориальных признаков pandas. Смотреть картинку кодирование категориальных признаков pandas. Картинка про кодирование категориальных признаков pandas. Фото кодирование категориальных признаков pandas

Что же мы хотим и зачем задумались об этой проблеме? Мы хотим получить числовые признаки, полезные для решения задач supervised learning (классификация, регрессия) и unsupervised learning (кластеризация, визуализация, простейшие рекомендательные системы). Мы сможем заменить ими исходные и неудобные представления объектов, ну или дополнить такими признаками нашу базу кодировок. Было бы неплохо, чтобы данные признаки были доступны в виде числовых векторов, с которыми мы все уже умеем работать, к примеру так:

кодирование категориальных признаков pandas. Смотреть фото кодирование категориальных признаков pandas. Смотреть картинку кодирование категориальных признаков pandas. Картинка про кодирование категориальных признаков pandas. Фото кодирование категориальных признаков pandas

Простор для фантазии, главное, чтобы хватило времени на эксперименты.

Также немного ограничим себя и не будет использовать информацию о target, только сами признаки. То есть получать мы будем наши векторы в unsupervised манере.

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

Схема кодирования будет выглядеть примерно так:

кодирование категориальных признаков pandas. Смотреть фото кодирование категориальных признаков pandas. Смотреть картинку кодирование категориальных признаков pandas. Картинка про кодирование категориальных признаков pandas. Фото кодирование категориальных признаков pandas

Качество полученных числовых векторов, которые будем называть векторными представлениями объектов, или эмбеддингами, проверим на задаче классификации: посмотрим на метрику площади под кривой AUC ROC и оценим время инференса.

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

Схема проверки качества на модельной задаче выглядит примерно так:

кодирование категориальных признаков pandas. Смотреть фото кодирование категориальных признаков pandas. Смотреть картинку кодирование категориальных признаков pandas. Картинка про кодирование категориальных признаков pandas. Фото кодирование категориальных признаков pandas

Сомнения или «Почему же не one-hot?!»

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

кодирование категориальных признаков pandas. Смотреть фото кодирование категориальных признаков pandas. Смотреть картинку кодирование категориальных признаков pandas. Картинка про кодирование категориальных признаков pandas. Фото кодирование категориальных признаков pandas

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

Источник

One-Hot Encoding in Python with Pandas and Scikit-Learn

Однократное кодирование-это фундаментальная и распространенная схема кодирования, используемая в машинном обучении и науке о данных. В этой статье мы рассмотрим одноразовое кодирование с помощью Pandas и Scikit-Learn в Python.

Вступление

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

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

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

Что такое Одногорячее кодирование?

Однострочное кодирование-это тип векторного представления, в котором все элементы в векторе равны 0, за исключением одного, который имеет значение 1, где 1 представляет собой логическое определение категории элемента.

Это очень отличается от других схем кодирования, которые все позволяют нескольким битам иметь значение 1. Ниже приведена таблица, в которой сравнивается представление чисел от 0 до 7 в двоичном коде, коде Грея и единице-hot:

0000
1111
1021011
11310010
10041000110
101510000111
1106100000101
11171000000100

Это номер 1? Это номер 2? … Это номер 7?

Каждый “0” является “ложным”, и как только мы попадаем в “1” в векторе, ответ на вопрос будет “истинным”.

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

Например, некоторые векторы могут быть оптимальными для регрессии (аппроксимирующие функции, основанные на прежних возвращаемых значениях), а некоторые могут быть оптимальными для классификации (категоризация в фиксированные наборы/классы, обычно двоичные):

1Клубника
2Яблоко
3Арбуз
4Лимон
5Персик
6Оранжевый

Здесь мы имеем шесть выборочных входных данных категориальных данных. Тип кодировки, используемый здесь, называется “label encoding” – и это очень просто: мы просто присваиваем идентификатор категориальному значению.

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

Было бы бессмысленно говорить, что наша категория “Клубника” больше или меньше, чем “Яблоки”, или что добавление категории “Лимон” к “Персику” даст нам категорию “Апельсин”, поскольку эти значения не являются порядковыми.

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

1000010
2100000
3000001
4010000
5001000
6000100

Реализация

Панды

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

Мы создадим очень простой набор данных – список стран и их детей:

Столбец Страны содержит категориальные значения. Мы можем преобразовать значения в столбце Страны в однократно закодированные векторы с помощью функции get_dummies() :

Запуск этого кода дает:

Scikit-Учись

Во-первых, давайте начнем с импорта LabelBinarizer :

А затем, используя тот же фрейм данных, что и раньше, давайте создадим экземпляр LabelBinarizer и поместим его:

Хотя это далеко не так красиво, как подход Панд.

А затем давайте заполним список и поместим его в кодер:

Запуск этого даст результат:

Применение одногорячего кодирования

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

Машинное обучение

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

Большинство методов и моделей машинного обучения работают с очень ограниченным набором данных (обычно двоичным). Нейронные сети потребляют данные и выдают результаты в диапазоне 0..1 и редко когда мы выходим за эти рамки.

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

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

Проектирование Цифровых схем

Многие базовые цифровые схемы используют одноступенчатую нотацию для представления своих значений ввода-вывода.

Первый триггер в этом счетчике представляет первое состояние, второй-второе состояние и так далее. В начале все триггеры в машине установлены на “0”, за исключением первого, который установлен на “1”.

Следующий тактовый край, приходящий к триггерам, продвигает один “горячий” бит ко второму триггеру. “Горячий” бит продвигается таким образом до последнего состояния, после чего машина возвращается в первое состояние.

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

Это полная противоположность и берет один горячий вход и преобразует его в двоичный или серый:

Преимущества и недостатки одногорячего кодирования

Как и любой другой тип кодирования, one-hot имеет много хороших моментов, а также проблемных аспектов.

Преимущества

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

Еще одна замечательная вещь в one-hot encoding-это простота реализации. Цифровые схемы, выполненные в этой нотации, очень легко проектировать и модифицировать. Нелегальные состояния в конечной машине также легко обнаружить.

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

Недостатки

Одним из главных недостатков одногорячего кодирования является упомянутый выше факт, что оно не может представлять много значений (для n состояний нам понадобятся n цифры – или триггеры). Вот почему, если бы мы хотели реализовать, например, одноразовый кольцевой счетчик с 15 состояниями, нам понадобилось бы 15 триггеров, тогда как двоичной реализации потребовалось бы только три триггера.

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

Другая проблема с этим типом кодирования заключается в том, что многие состояния в конечной машине были бы незаконными-для каждого n допустимого состояния существует ( 2 n – n) незаконные. Хорошо, что эти незаконные состояния, как уже было сказано, действительно легко обнаружить (достаточно было бы одного XOR-гейта), так что позаботиться о них не очень сложно.

Вывод

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

Источник

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

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

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

К счастью, есть готовые решения, например библиотека Category Encoders (CE), предоставляющая широкий набор кодировщиков категориальных признаков.

Какие преимущества у CE

Наверное, самое основное — это полная совместимость с scikit-learn. Доступны методы fit, fit_transform, get_params, set_params и transform. На основе CE можно строить пайплайны в scikit-learn.

Поддержка numpy и pandas. Что важно — pandas dataframe можно получить и на выходе кодировщика. Иногда это весьма полезно, особенно когда нужно выполнить выборочное кодирование. Это позволяет не городить самодельный забор из кодировщиков, а использовать CE непосредственно в последовательном пайплайне scikit-learn.

Есть возможность задать маску для кодирования, т.е. сделать выборочное кодирование

Можно отбросить часть данных

Спроектированный кодировщик отлично портируется на рабочие данные.

Какие задачи можно решать с помощью CE

кодирование номинальных признаков (nominal) — признаки, порядок которых не определен (часто в табличных данных к таким признакам относятся распределения по цветам или по городам)

кодирование упорядоченных признаков (ordinal) — признаки, порядок которых можно считать определенным (например, распределение по яркости)

В CE можно кодировать бинарные признаки, упорядоченные по алфавиту или численному возрастанию признаки, а также географические, геометрические данные, данные о времени и другие структурированные данные. Единственное ограничение — решение не предоставляет собственного способа для создания масок для выборочного кодирования.

Что имеется в наборе CE

Contrast Coding

Данный тип кодирование разбивает признак на уровни (в каждом только значения, относящиеся к одной категории). Затем для каждого уровня вычисляется некоторая статистика. Например, вот так это делается в statsmodels. Метод подходит для кодирования номинальных и частично упорядоченных признаков.

В CE реализованы следующие кодеры:

Backward Difference Coding — сравнивается среднее для уровня со средним предыдущего уровня

Helmert Coding — сравнивается среднее для уровня со средним для всех последующих уровней. Больше подходит для номинальных переменных.

Sum Coding — сравнивается среднее для уровня со средним для всех остальных уровней

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

Deviation Coding — более общий случай суммирующего кодирования, когда сравнение идет со всеми уровнями

Dummy Coding — сравнение со средним значением на уровне

Simple Coding — то же самое, что и Dummy Coding, только в качестве среднего принимается среднее всех значений фиксированного уровня

Reverse Helmet Coding

Forward Difference Coding

Target-based Coding

Для кодирования переменных используются сведения о разметке (цели) дата-сета. Тут надо знать следующие понятия: \(y\) общее число примеров, \(y^+\) число примеров, отнесенных к «положительному» классу, \(n\) число примеров на уровне, \(n^+\) число примеров уровня, отнесенных к положительному классу, \(\alpha\) регуляризирующий параметр, \(prior\) среднее значение цели. В CE реализованы:

M-estimate кодируется по формуле \(x^k = \frac + B * \frac\), где \(m = 1. 100\) — дополнительный гиперпараметр, регулирующий переобучение. По сути — упрощенный вариант Target Encoder. (На момент написания статьи кодировщик работает некорректно)

Альтернативой WOE является PRE (Probability Ratio Encoding). В этом случае для каждой метки вычисляется \(P(1)/P(0)\), т.е отношение вероятностей того, что объект размечен положительно и вероятность отрицательной разметки. Этим значением заменяется значение при кодировании. \(P(0)\) естественно ни при каких условиях не принимается равным 0. В CE метод не реализован.

Leave One Out (LOO) считается среднее цели для примера выбранной категории, для случая, когда пример удален из дата-сета.

Catboost Encoder улучшенный LOO (документация)

У всех target-based кодировщиков имеет место проблема риска переобучения, так как используются данные о разметке дата-сета. Два варианта решения — дополнительная регуляризация и двойная кросс-валидация. Кроме того LOO и Catboost Encoder работают плохо, если реальные данные имеют другую размерность, что приводит к сдвигу по отноешнию к данным, на которых производилось обучение.

Остальные кодировщики

В CE реализовано несколько базовых кодировщиков:

One Hot — аналог OnHotEncoder в scikit-learn или get_dummies в pandas

Ordinal только для упорядоченных признаков (обратите внимание при импорте, что класс в CE называется также, как OrdinalEncoder в scikit-learn)

Binary конвертит категории признака в бинарный код. Категории конвертятся в номера по порядку, затем номера кодируются на двоичной базе, а затем единицы и нули из полученых кодированных значений выносятся в новые признаки. По сути, \(n\) категорий переводятся в \(log_<2>n\) бинаризированных признаков. Это весьма значительно сокращает количество признаков на выходе по сравнению с One Hot и полезно, когда число кодируемых категорий значительно.

Base N комбинирует One Hot и Binary

Кроме того, реализован Hashing, позволяющий хешировать категории. Это аналог FeatureHasher (последний больше подходит для работы с текстом). Также походит для кодирования большого числа категорий, так как сокращает размерность на выходе по сравнению с One Hot.

Чего нет в CE

Не реализован Label Encoding. Можно воспользоваться factorize из pandas или LabelEncoder из sklearn или Ordinal, что то же самое. Не реализован Frequincy Encoding, когда категории кодируются в числовом виде в зависимости от частоты для признака в диапазоне [0, 1]. Кроме того, нет методов для кодирования признаков, которые явно упорядочены циклически, например, дат и времени. Ну и, естественно, нет методов для конструирования признаков, таких как разделение выражения на части и т.д. Все это придется написать самостоятельно или искать более специфическое решение.

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

Есть множество разных рекомендаций. Все их можно свести к следующему:

Определить, относится ли вообще признак к категориальному и посчитать количество категорий.

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

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

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

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

Для неупорядоченных признаков можно использовать One Hot, если число категорий невелико. Большое количество категорий можно также бинаризировать или хешировать, если потеря части данных приемлема. Если нет, придется использовать один из методов target encoding. Необходимо помнить о переобучении и построить, при необходимости, двойную кросс-валидацию.

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

Дополнительные статьи по этой тематике: один, два

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *