Числовое кодирование категориальных переменных
Рассмотрим способ числового кодирования колонок датафрейма, имеющих небольшой набор значений. В частности, распространено порядковое кодирование, которое каждой категории ставит в соответствие целое число 0, 1, ...,число_категорий -1. Обратите внимание, что после такого кодирования признак приобретает упорядоченность (например, 5>3 и отличается на 2), и если будет интерпретироваться не как категориальный, а числовой может дезориентировать модель машинного обучения (в этом случае лучше использовать onehot кодирование).
Порядковое кодирование реализуется классом OrdinalEncoder модуля sklearn.preprocessing. Рассмотрим его работу на следующем датафрейме:
import pandas as pd from sklearn.preprocessing import OrdinalEncoder df = pd.DataFrame([['food', 'apple'], ['not_food', 'ball'], ['not_food', 'basket'], ['food', 'banana'], ['food', 'apple']], columns=['cat1', 'cat2']) df
С помощью OrdinalEncoder трансформации можно подвергать сразу несколько столбцов:
oe = OrdinalEncoder() oe.fit_transform(df)
В свойстве categories_ хранятся массивы с выделенными в ходе fit-а категориями:
oe.categories_
А так можно получить трансформированный датафрейм и дать ему осмысленные названия колонок:
df_new = pd.DataFrame(oe.transform(df), columns = df.columns) df_new
С методом inverse_transform можно обратно трансформировать числа в наименований категорий:
oe.inverse_transform(df_new)