Обработка множества столбцов с LabelEncoder в scikit-learn
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для одновременного кодирования нескольких столбцов используйте OrdinalEncoder
из библиотеки scikit-learn:
from sklearn.preprocessing import OrdinalEncoder
encoder = OrdinalEncoder()
df[['col1', 'col2', 'col3']] = encoder.fit_transform(df[['col1', 'col2', 'col3']])
Таким образом, универсальное кодирование будет успешно применено ко всем категориальным столбцам в данных df
.
Настройка подхода
Обработка данных разного типа с помощью ColumnTransformer
Воспользуйтесь ColumnTransformer
, чтобы к выбранным столбцам применились разъяснённые ранее трансформации:
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(
[('oh_enc', OneHotEncoder(sparse=False), ['col1', 'col3']), # преобразовываем col1 и col3 в унитарные представления
('rest', 'passthrough', ['col2'])]) # col2 остаётся без изменений
transformed = ct.fit_transform(df)
Гибкость с пользовательскими кодировщиками
Реализуйте собственный кодировщик для конкретного контроля над числовыми атрибутами и структурой данных, реализовав методы fit
, transform
и fit_transform
:
from sklearn.base import BaseEstimator, TransformerMixin
class CustomLabelEncoder(BaseEstimator, TransformerMixin):
def __init__(self):
self.encoders = {} # Хранилище LabelEncoders...
def fit(self, X, y=None):
for column in X.columns:
le = LabelEncoder()
le.fit(X[column])
self.encoders[column] = le # ...чьи записи мы тут заводим
return self
def transform(self, X):
X = X.copy() # Первое правило: всегда создавай копию
for column in X.columns:
le = self.encoders[column]
X[column] = le.transform(X[column])
return X
def fit_transform(self, X, y=None):
return self.fit(X, y).transform(X) # fit и transform лучше работают вместе
# Пример использования:
custom_encoder = CustomLabelEncoder()
df_encoded = custom_encoder.fit_transform(df)
Эффективное прямое кодирование
Для работ с крупноблочными категориальными данными обратитесь к astype('category').cat.codes
из Pandas:
df['col1'] = df['col1'].astype('category').cat.codes # Привет, col1, будь добр получить свой код!
Продвинутые техники кодирования
Точное обратное преобразование
Чтобы правильно выполнить inverse_transform
, воспользуйтесь кодировщиком на основе словаря:
encoders = {col: LabelEncoder().fit(df[col]) for col in df.columns}
# Две вещи сразу!
encoded_df = df.apply(lambda col: encoders[col.name].transform(col))
# Жизнь как ряд столбцов, с которым мы применяем DF.apply
# Для обратного преобразования:
decoded_col = encoders['col1'].inverse_transform(encoded_df['col1'])
# Вот вы где, col1!
Обработка пропущенных значений: хитрости программиста
Пропущенные значения могут быть неприятной неожиданностью. Настройте кодировщики так, чтобы они менее болезненно встретились с этой проблемой, сохраняя целостность данных.
Визуализация
Представьте кодирование категорий в виде цветовой палитры, где каждый цвет соответствует определённой закодированной категории:
Исходная таблица:
| Имя | Специя | Класс |
| ---- | ------ | ----- |
| X | Сладкий| A |
| Y | Острый | B |
| Z | Умамисо | C |
Цветовые обозначения (кодирование):
| Специя🔖| Класс 🔖|
| ------ | ------- |
| Сладкий| A |
| Острый | B |
| Умамисо | C |
Цветные коды:
| Метка | Цвет кода |
| ----- | ----------|
| Сладкий | 🟣 |
| Острый | 🟡 |
| Умамисо | 🟢 |
| A | 🟤 |
| B | 🟥 |
| C | 🟩 |
Закодированная таблица:
| Имя | Специя 🔖| Класс 🔖|
| ---- | -------- | ------- |
| X | 🟣 | 🟤 |
| Y | 🟡 | 🟥 |
| Z | 🟢 | 🟩 |
Так каждая строчка получает уникальную цветовую маркировку, что упрощает восприятие и повышает наглядность данных.
Оптимизация решений по кодированию
Быстрое и лёгкое кодирование с pandas.get_dummies
Для занятий классификацией преобразовывайте категориальные переменные в фиктивные с помощью pandas.get_dummies
:
encoded_df = pd.get_dummies(df, columns=['col1', 'col3'])
# Col1 и col3, приветствуем вас в мире бинарных файлов!
Численная предобработка с использованием RobustScaler
RobustScaler из scikit-learn поможет изящно научиться справляться с выбросами при оцифровке числовых столбцов:
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
df['col2'] = scaler.fit_transform(df[['col2']])
# Refreshing col2 после очистки через RobustScaler.
Уникальное кодирование с определением соответствий
Избегайте повторного кодирования с помощью словаря соответствий:
mappings = {column: {value: idx for idx, value in enumerate(df[column].unique(), 1)} for column in df.columns}
# Повторение — скучно.
df = df.apply(lambda col: col.map(mappings[col.name]))
# Приём, столбы, начинайте преобразование!
Полезные материалы
- sklearn.preprocessing.OneHotEncoder — Ваше справочное руководство по OneHotEncoder.
- sklearn.compose.ColumnTransformer — Введение в ColumnTransformer.
- Как работать с категориальными данными — Познакомьтесь с этим руководством по категориальным данным.
- pandas.get_dummies — Узнайте, как использовать get_dummies.
- Column Transformer with Mixed Types — Работа с данными различных типов.
- sklearn.pipeline.Pipeline — Упростите процесс кодирования и моделирования данных.