… и «надежный» кодировщик меток scikit-learn

1. Введение

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

Зачем нам нужно кодирование категориальных значений?
Логистическая регрессия и нейронные сети — это простые или сложные вложенные числовые функции, случайные леса и GBM работают находя «лучшую» пару характеристика/значение для следующего разделения «жадным» способом на основе сканирования числовых диапазонов и т. д.

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

* Некоторые библиотеки, такие как LightGBM, используют встроенные методы разделения для работы с категориальными функциями, вы можете найти дополнительную информацию здесь: https://lightgbm.readthedocs. io/en/latest/Features.html#optimal-split-for-categorical-features

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

Хотя существует множество способов кодирования категориальных переменных, в этом посте мы рассмотрим некоторые из самых популярных: кодирование меток и кодирование One-Hot.

Кодировка меток
При кодировании меток мы сопоставляем каждое значение категориального признака с целым числом, начинающимся от 0 до кардинальности-1, где кардинальность — это количество различных ценности. Вы можете проверить реализацию scikit-learn здесь.

Горячее кодирование
В горячем кодировании мы сопоставляем каждое значение функции с отдельной двоичной фиктивной функцией, например, если у нас есть функция gender со значениями Мужской и Женский, затем мы заменяем одну функцию gender двумя новыми функциями is_Male и is_Female, который может принимать значения 0 или 1. Обратите внимание, что если количество элементов достаточно велико, нам придется заменить одну функцию гораздо большей, что может привести к взрывному потреблению памяти.
Кодировщик Scikit-learn One-Hot можно найти по этой ссылке.

3. Плюсы и минусы

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

4. Обработка будущих входных данных

Одним из наиболее важных аспектов моделей машинного обучения реального мира/предприятия является способность обрабатывать будущие входные данные как с точки зрения обобщения (т. е. сохранения того же качества прогнозов, что и в наборе обучающих данных), так и возможности выполнения. Особенно во втором случае представьте, что вы обучили и оценили вашу модель, поэтому вы готовы к развертыванию в рабочей среде.
Предположим, что в вашей модели есть категориальный признак под названием «почтовый_код», который имеет 150 различных значений (количество элементов) в вашем обучающем наборе данных, и вы применили один из двух описанных выше методов кодирования.

Что произойдет, если появится новый пример для прогнозирования со значением почтового_кода, отличным от 150 значений, которые существуют в вашем наборе обучающих данных?

  • Кодировщик меток scikit-learn завершится ошибкой, поскольку он не соответствует этому новому значению, что приведет к следующей ошибке:
    "ValueError: y содержит ранее невидимые метки: ['new_value']"
  • Кодировщик One-Hot — что еще хуже — должен будет создать новую «фиктивную» двоичную функцию «postal_code_new_value» и, таким образом, привести к другой размерности пространства признаков предиктора (увеличенной на единицу). Ваша модель машинного обучения не сможет обработать этот случай и создать прогноз, если только вы явно не определите функции предиктора как для этапов обучения, так и для этапов оценки.

В следующем разделе мы увидим, как решить эту проблему в случае кодировщика меток scikit-learn.

5. «Надежный» кодировщик меток, основанный на scikit.

Ниже вы можете найти модификации кода, необходимые для того, чтобы иметь версию кодировщика меток scikit-learn, которая может обрабатывать невидимые входные значения.

6. Ссылки

[1] Предварительная обработка Scikit-learn: https://scikit-learn.org/stable/modules/preprocessing.html