July 30, 2021

Кодирование-декодирование категорий, когда чайник не работает

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

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

Как можно заметить, в представленном датафрейме 'AA' заменено на 10 (первая позиция отвечает за значение AA, а вторая - BB).

Функция get_dummies умеет работать и с несколькими категориями:

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

Рассмотрим похожий класс OneHotEncoder из библиотеки scikit-learn:

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

а также метод get_feature_names, который возвращает список имен столбцов аналогичных get_dummies, при этом в качестве входа ему можно задать имена категориальных столбцов (они будут суффиксами перед именами значений):

Объединим сказанное и вернем красивое представление результата:

С помощью inverse_transform можно выполнить обратное преобразование: