Кодирование-декодирование категорий, когда чайник не работает
Для моделей машинного обучения важность представляют как признаки, имеющие числовой вид, так и текстовое представление. С последними работать немного тяжелее, но затраты окупаются дополнительной информацией, которая может повысить качество модели.
В этой статье рассмотрим хороший способ кодирования/декодирования категориальных переменных, который каждому значению ставит в соответствие вектор с одной единицей и всеми нулями размерности равной количеству уникальных значений в категории и с единицей в позиции соответствующей конкретному из множества всех значений. В библиотеке Pandas имеется функция get_dummies, которая и производит данное преобразование:
Как можно заметить, в представленном датафрейме 'AA' заменено на 10 (первая позиция отвечает за значение AA, а вторая - BB).
Функция get_dummies умеет работать и с несколькими категориями:
Данный метод хорош, но есть ограничения - мы не сможем впоследствии гарантировать его аналогичное применение (позиция конкретных слов сохраняется) к новым данным, так как он не сохраняет внутреннее состояние.
Рассмотрим похожий класс OneHotEncoder из библиотеки scikit-learn:
Как можно заметить, он возвращает массив. Допустим, мы хотим преобразовать его к виду аналогичному get_dummies. Для этого нам пригодится свойство categories_, содержащее значения категориальных столбцов:
а также метод get_feature_names, который возвращает список имен столбцов аналогичных get_dummies, при этом в качестве входа ему можно задать имена категориальных столбцов (они будут суффиксами перед именами значений):
Объединим сказанное и вернем красивое представление результата:
С помощью inverse_transform можно выполнить обратное преобразование: