В статье описаны основные алгоритмы кодирования категориальных данных для использования в моделях машинного обучения и продемонстрированы ситуации в которых их стоит применять.
Ключевые слова: машинное обучение, нейронные сети, кодирование.
В большинстве алгоритмов машинного обучения набор данных может содержать текстовые или категориальные значения (в основном не числовые значения). Например, цвет, который имеет такие значения, как красный, оранжевый, синий, белый и т. д. Несколько алгоритмов, таких как CatBoost [1], могут достаточно хорошо обрабатывать категориальные значения, но большинство алгоритмов работают лучше с числовыми данными. Следовательно, основная задача, стоящая перед аналитиком, заключается в том, чтобы преобразовать текстовые/категориальные данные в числовые и при этом создать алгоритм/модель, чтобы из них получить необходимый результат.
Есть много способов преобразовать категориальные значения в числовые значения. Каждый подход имеет свои тонкости и влияет на набор функций модели. При этом я бы остановился на двух основных методах: One-Hot-Encoding(одна горячая кодировка) и Label-Encoder(кодирование меткой). Оба эти кодировщика являются частью библиотеки Scikit-learn (одной из наиболее широко используемых библиотек Python) и используются для преобразования текстовых или категориальных данных в числовые данные.
LabelEncoder
Этот подход очень прост и включает преобразование каждого значения в столбце в число. Рассмотрим набор данных (таблица 1), в котором описываются категориальные признаки мостов:
Таблица 1
Тип моста |
Arch |
Beam |
Truss |
Cantilever |
Tied Arch |
Suspension |
Cable |
Теперь закодируем текстовые значения. Позиция текстового значения в наборе данных будет являться его числовым значением, что показано в таблице 2.
Таблица 2
Тип моста (Текст) |
Тип моста (Числовое значение) |
Arch |
0 |
Beam |
1 |
Truss |
2 |
Cantilever |
3 |
Tied Arch |
4 |
Suspension |
5 |
Cable |
6 |
На этом мы завершили кодирование метки переменной типа «Мост». Это все, что касается Label-Encoder. Но в зависимости от значений данных и типа данных кодирование меток создает новую проблему, так как использует последовательность чисел.
Проблема использования такого метода состоит в том, что они вводят сравнение между ними. Нет никакой связи между различными типами мостов, но, глядя на эти числа, можно подумать, что тип моста «Cable» имеет более высокий приоритет над типом моста «Arch». Алгоритм может неправильно понимать, что данные имеют какой-то порядок 0 <1 <2… <6 и могут придать «Cable» в 6 раз больший вес, чем типу моста «Arch».
Теперь рассмотрим таблицу 3, в которой содержится закодированная методом Label Encoder еще один набор данных, описывающей уровень безопасности мостов.
Таблица 3
Уровень безопасности (Текстовое значение) |
Уровень безопасности (Числовое значение) |
Никакой |
0 |
Низкий |
1 |
Средний |
2 |
Высокий |
3 |
Очень высокий |
4 |
Кодирование Label-Encoder в этом столбце также вызывает приоритет по числу, но правильным способом. Здесь числовой порядок не выглядит нестандартным, и будет иметь смысл, если алгоритм интерпретирует порядок безопасности 0 <1 <2 <3 <4, т. е. никакой <низкий <средний <высокий <очень высокий [2].
One-Hot Encoder
Хотя Label-Encoder является прямолинейным, но у него есть недостаток, заключающийся в том, что числовые значения могут быть неверно истолкованы алгоритмами как имеющие некоторый порядок. Эта проблема упорядочения решается с помощью другого распространенного альтернативного подхода, называемого «One-Hot-Encoding». В этом алгоритме каждое значение категории преобразуется в новый столбец, и столбцу присваивается значение 1 или 0 (обозначение true / false). Давайте рассмотрим предыдущий пример типов мостов и уровней безопасности с One-Hot-Encoding (таблицы 4 и 5).
Таблица 4
Тип моста (Текст) |
Тип моста (Arch) |
Тип моста (Beam) |
Тип моста (Truss) |
Тип моста (Cantilever) |
Тип моста (Tied Arch) |
Тип моста (Suspension) |
Тип моста (Cable) |
Arch |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
Beam |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
Truss |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
Cantilever |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
Tied Arch |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
Suspension |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
Cable |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Таблица 5
Уровень безопасности (Текстовое значение) |
Уровень безопасности (Никакой) |
Уровень безопасности (Низкий) |
Уровень безопасности (Средний) |
Уровень безопасности (Высокий) |
Уровень безопасности (Очень высокий) |
Никакой |
1 |
0 |
0 |
0 |
0 |
Низкий |
0 |
1 |
0 |
0 |
0 |
Средний |
0 |
0 |
1 |
0 |
0 |
Высокий |
0 |
0 |
0 |
1 |
0 |
Очень высокий |
0 |
0 |
0 |
0 |
1 |
Строки с первым значением столбца (Arch/Никакой) будут иметь значение «1» (указывает на истинное значение), а столбцы других значений будут иметь значение «0» (указывающее на ложное значение). Аналогично для других строк сопоставляется значение со значением столбца.
Хотя этот подход устраняет проблемы порядка, но имеет недостаток в добавлении большего количества столбцов в набор данных. Это может привести к значительному увеличению количества столбцов, если у вас есть много уникальных значений в столбце категории. В приведенном выше примере это было управляемо, но управлять им будет действительно сложно, когда кодирование дает много столбцов [3].
Применение Label-Encoder иOne-Hot-Encoding
Выбор между Label-Encoder иOne-Hot-Encoding от вашего набора данных и модели, которую вы хотите применить. Но все же, несколько моментов, которые следует отметить, прежде чем выбрать правильную технику кодирования для вашей модели:
One-Hot Encoding, когда:
1) Категориальная особенность не является порядковой (как типы мостов в примере)
2) Небольшое количество категорий.
Label-Encoder, когда:
1) Категориальная особенность является порядковой (например, низкий, средний, высокий)
2) Количество категорий довольно велико, и One-Hot-Encoding может привести к высокому потреблению памяти.
Литература:
- Введение в разработку CatBoost. Доклад Яндекса [Электронный ресурс] / 2019г. — Режим доступа: https://habr.com/ru/company/yandex/blog/458790/
- ML | Label Encoding of datasets in Python [Электронный ресурс] / 2019г. — Режим доступа: https://www.geeksforgeeks.org/ml-label-encoding-of-datasets-in-python/
- What is One Hot Encoding? Why And When do you have to use it? [Электронный ресурс] / 2019г. — Режим доступа: https://hackernoon.com/what-is-one-hot-encoding-why-and-when-do-you-have-to-use-it-e3c6186d008f