Ошибка преобразования колонок при кодировании
При кодировании строковых и категориальных колонок в зависимости от способа определение области применения происходит либо автоматически, либо вручную.
Таким образом, при не достаточно аккуратном подходе существует риск неконтролируемого изменения всего массива данных. Рассмотрим на примере преобразования следующего датафрейма:
import pandas as pd df = pd.DataFrame([['food', 'apple', 20], ['not_food', 'ball', 10], ['not_food', 'basket', 10],['food', 'banana', 12], ['food', 'apple', 23]], columns=['cat1', 'cat2', 'num'], index=['one', 'two', 'three', 'four', 'five']) df
df.dtypes
Распространенным способом преобразования категориальных колонок является вызов функции get_dummies, хотя формально это не самый лучший выбор, так как она не способна хранить внутреннее состояние, чтобы применяться к последующим наборам (читай здесь):
pd.get_dummies(df)
Как можно заметить, функция самостоятельно определяет колонки для преобразования (строчные или категориальные). Однако их можно было задать в аргументе columns. Другим более корректным способом преобразования является использование энкодеров (из sklearn или других библиотек, например, category_encoders). Их поведение отличается от get_dummies, так как при вызове на всем датафрейме они применяются ко всем колонкам:
from sklearn.preprocessing import OrdinalEncoder, OneHotEncoder oe = OrdinalEncoder() oe.fit_transform(df)
oh = OneHotEncoder(sparse=False, handle_unknown='ignore') pd.DataFrame(oh.fit_transform(df), columns= oh.get_feature_names_out(df.columns), index=df.index)
Видим, что в обоих случаях преобразована и наша численная колонка 'num'. Соответственно, данным энкодерам требуется передавать только часть датафрейма для преобразований:
df_oe = df.copy() cat_cols = ['cat1', 'cat2'] df_oe[cat_cols] = oe.fit_transform(df[cat_cols]) df_oe
ar = oh.fit_transform(df[cat_cols]) df_part = pd.DataFrame(ar, columns=oh.get_feature_names_out(cat_cols), index=df.index) df_oh = pd.concat([df[['num']], df_part], axis= 1) df_oh
Хочу обратить внимание, что здесь в демонстрационных целях происходит работа с одной выборкой. В проекте машинного обучения их, как правило, три, тогда все преобразования должны происходить для каждой из выборок, однако обучение преобразователя (fit) происходит на train выборке (дополнительно читай здесь).
- Создание пользовательских преобразователей данных
- Порядок обучения и запуска преобразователей данных
- Бинарное кодирование
- One-hot кодирование
- Порядковое (Ordinal) кодирование
- Частотное кодирование
- Применение преобразование к выборкам
Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях: