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

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

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

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

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

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

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

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

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

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

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

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

OneHotEncoder

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

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

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

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

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

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

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

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

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

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

Дата публикации Jul 16, 2019

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

Последнее обновление: 24 сентября 2019 г.

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

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

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

Несколько примеров, как показано ниже для номинальной переменной:

Пример порядковых переменных:

Есть много способов, которыми мы можем кодировать эти категориальные переменные как числа и использовать их в алгоритме. Я расскажу о большинстве из них от базовых до более продвинутых в этом посте. Я буду охватывать эти кодировки:

1) Одна горячая кодировка
2) Кодировка метки
3) Порядковый кодировки
4) Кодировка Гельмерта
5) двоичное кодирование
6) частотное кодирование
7) Среднее кодирование
8) Вес доказательств кодирования
9) Кодирование вероятностного отношения
10) Хеширование
11) обратное разностное кодирование
12) Оставьте одну кодировку
13) Кодировка Джеймса-Стейна
14) M-оценка кодирования

В целях объяснения я буду использовать этот фрейм данных, который имеет две независимые переменные или функции (температура и цвет) и одну метку (цель). У этого также есть Rec-No, который является порядковым номером записи. Всего в этом фрейме данных 10 записей. Код Python будет выглядеть так, как показано ниже.

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

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

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

Мы будем использовать Pandas и Scikit-learn и category_encoders (библиотека вклада Scikit-learn), чтобы показать другой метод кодирования в Python.

Одна горячая кодировка

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

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

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

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

One Hot Encoding очень популярен. Мы можем представить всю категорию с помощью N-1 (N = No of Category), поскольку этого достаточно для кодирования того, что не включено. Обычно для регрессии мы используем N-1 (опустить первый или последний столбец новой функции One Hot Coded), но для классификации рекомендуется использовать все N столбцов без, так как большая часть алгоритма на основе дерева строит дерево на основе всех доступных

Одно горячее кодирование с N-1 двоичными переменными должно использоваться в линейной регрессии, чтобы обеспечить правильное количество степеней свободы (N-1). Линейная регрессия имеет доступ ко всем функциям в процессе обучения и поэтому исследует весь набор фиктивных переменных. Это означает, что двоичные переменные N-1 дают всю информацию о (полностью представляют) исходной категориальной переменной для линейной регрессии. Этот подход может быть принят для любого алгоритма машинного обучения, который смотрит наВСЕособенностив то же времяво время тренировки. Например, поддержка векторных машин и нейронных сетей, а также алгоритмы кластеризации.

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

Кодировка метки

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

Пандыразлагать на множителитакже выполнить ту же функцию.

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

Порядковый кодировки

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

Если мы рассмотрим в шкале температуры порядок, то порядковое значение должно быть от холодного до «очень горячего». Порядковое кодирование назначит значения как (Холодный (1)

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

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

Кодировка Гельмерта

В этом кодировании среднее значение зависимой переменной для уровня сравнивается со средним значением зависимой переменной для всех предыдущих уровней.

Версия в category_encoders иногда упоминается как кодирование обратного Хельмерта. Среднее значение зависимой переменной для уровня сравнивается со средним значением зависимой переменной по всемпредыдущие уровни, Отсюда и название‘обратный’используется для отличия от прямого кодирования Гельмерта.

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

Двоичное кодирование

Двоичное кодирование преобразует категорию в двоичные цифры. Каждая двоичная цифра создает один столбец объектов. Если естьNуникальные категории, затем двоичное кодирование приводит только к функциям log (base 2) ⁿ. В этом примере у нас есть 4 функции, таким образом, общее количество двоично-закодированных функций будет 3 функциями. По сравнению с One Hot Encoding для этого потребуется меньше столбцов функций (для 100 категорий One Hot Encoding будет иметь 100 функций, а для двоичного кодирования нам потребуется всего 7 функций).

Для двоичного кодирования необходимо выполнить следующие шаги:

Обратитесь к диаграмме ниже для лучшей интуиции.

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

Для этого мы будем использовать пакет category_encoders и имя функцииBinaryEncoder,

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

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

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

Код Pandas может быть построен следующим образом:

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

Среднее кодирование

2. Сгруппируйте по категориальной переменной и получите агрегированную сумму по «целевой» переменной. (общее количество единиц для каждой категории в «Температуре»)

3. Сгруппировать по категориальной переменной и получить агрегированное значение по целевой переменной

4. Разделите результаты шага 2 / шага 3 и соедините их с поездом.

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

Пример кода для фрейма данных:

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

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

На практике существует множество вариантов этого целевого кодирования, например сглаживание. Сглаживание может быть реализовано, как показано ниже:

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

Вес доказательств кодирования

Вес доказательств (WoE) является мерой«сила»техники группировки, чтобы разделить хорошее и плохое. Этот метод был разработан в первую очередь для построения прогностической модели для оценки риска дефолта по кредитам в кредитно-финансовой отрасли. Вес доказательств (WOE) является мерой того, насколькодоказательствоподдерживает или подрывает гипотезу,

Он рассчитывается как показано ниже:

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

Горе будет 0, если P (Товары) / P (Бады) = 1 То есть, если результат является случайным для этой группы. Если P (Bads)> P (Товары), отношение шансов будет P (Bads) в группе, то WoE> 0.

Он также имеет (как минимум) три недостатка:
1) Потеря информации (вариация) из-за разделения на несколько категорий
2) Это«Одномерный» показательпоэтому он не учитывает корреляцию между независимыми переменными
3) Легко манипулировать (переопределять) эффект переменных в зависимости от того, как создаются категории

Ниже фрагменты кода объясняют, как можно построить код для расчета WoE.

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

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

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

Кодирование коэффициента вероятности

Кодирование отношения вероятностей аналогично весовому доказательству (WoE) с той лишь разницей, что используется только соотношение хорошей и плохой вероятностей. Для каждой метки мы вычисляем среднее значение target = 1, то есть вероятность того, что оно равно 1 (P (1)), а также вероятность цели = 0 (P (0)). Затем мы рассчитываем отношение P (1) / P (0) и заменяем метки этим соотношением. Нам нужно добавить очень маленькое значение с помощью P (0), чтобы избежать любого сценария деления на ноль, где для любой конкретной категории нет цели = 0.

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

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

Хэш

Хеширование преобразует категориальные переменные в пространство целых чисел высших измерений, где расстояние между двумя векторами категориальных переменных приблизительно поддерживается в преобразованном числовом пространстве. При использовании хеширования число измерений будет намного меньше количества измерений с кодировкой, например One Hot Encoding. Этот метод очень эффективен, когда количество категорий очень велико.

Кодирование обратной разницы

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

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

Оставьте одну кодировку

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

Кодировка Джеймса-Стейна

Для значения признака оценщик Джеймса-Стейна возвращает средневзвешенное значение:

M-оценка кодирования

Вывод

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

Источник

Умная нормализация данных: категориальные и порядковые данные, “парные” признаки

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

Нормализация категориальных данных

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

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

С категориальными данными всё просто. Если целью является не просто кодировка (шифровка) значений какими-то числами, то единственный доступный вариант — это представить их в виде значений “1” — “0” (ДА — НЕТ) для каждой возможной категории. Это так называемое one-hot-кодирование. Когда вместо одного категориального признака появится столько новых “булевых” признаков, сколько существует возможных категорий.

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

Никаких вычислений медиан или средних арифметических, никаких смещений.

Если Вы подготавливаете данные для входа нейронной сети, это именно то, что нужно.

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

К тому же, если Вы хотите получить результат, основанный на данных, а не на внутренних особенностях алгоритмов, то даже после преобразования в числовую форму категориальные признаки нельзя использовать как обычные числовые для вычисления “расстояний” между объектами или их “схожести”. Если два объекта отличаются только “наличием черного цвета”, это не значит, что между ними “расстояние” равное некому безразмерному единичному интервалу. Это значит именно то, что у одного есть чёрный цвет, а у другого его нет — и не более того.

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

Нормализация порядковых данных

С порядковыми данными немного сложнее. Они занимают “промежуточное” положение между категориальным и относительным (обычными числами) типами данных. И при работе с ними необходимо сделать выбор, к какому из соседних типов их преобразовывать. Без Вашего осознанного решения здесь никак.

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

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

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

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

Дальше работаем как с обычными значениями — нормируем и т.д.

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

“Парные” признаки

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

Для начала определение. “Парными” признаками я называю признаки, которые измеряются в одинаковых единицах и вместе описывают единый комбинированный признак. Причем изменения по любому из таких “напарников” равнозначны.

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

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

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

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

Если на этот нюанс не обращать внимания, то после нормализации ситуация станет такой

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

Изначальный смысл совершенно исказился. “Расстояние” между зданиями, расположенными через дорогу стало практически таким же большим, как и между домами в начале и конце улицы. Это произошло из-за того, что значения широты и долготы были нормализированы независимо друг от друга.

Решение этой проблемы лежит в определении параметров масштабирования самого “протяженного” признака (в нашем случае долготы) и применения его к всем “парным” признакам.

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

Да, формально, мы снизили влияние признака “широта”. Но это было обусловлено его реальным физическим смыслом.

Правила безопасности

“Назначать” признаки в “парные” нужно очень осторожно и с четким пониманием исследуемой области.

Возьмем другой пример. Вы анализируете колебания некоего узла/датчика, закрепленного на вертикальном элементе в большом механизме. У Вас есть величины колебаний как “вправо-влево” (синие стрелки), так и “вперёд-назад” (оранжевые стрелки). Еще, из-за конструктивных особенностей механизма, колебания “вправо-влево” могут быть в несколько раз больше, чем “вперёд-назад”.

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

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

Но, допустим, оказывается (из-за тех же конструктивных особенностей), что сильные колебания “вперёд-назад”, пусть даже они по величине в разы меньше, чем “вправо-влево”, могут привести к поломке узла. Т.е. величина изменения у этого признака не равнозначна его “напарнику”.

В этом случае снижать влияние этого признака, как мы выше поступили с “широтой”, наоборот нельзя.

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

Источник

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

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