April 22, 2022

Числовое кодирование категориальных переменных

Рассмотрим способ числового кодирования колонок датафрейма, имеющих небольшой набор значений. В частности, распространено порядковое кодирование, которое каждой категории ставит в соответствие целое число 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)