Обработка множества столбцов с LabelEncoder в scikit-learn

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для одновременного кодирования нескольких столбцов используйте OrdinalEncoder из библиотеки scikit-learn:

Python
Скопировать код
from sklearn.preprocessing import OrdinalEncoder
encoder = OrdinalEncoder()
df[['col1', 'col2', 'col3']] = encoder.fit_transform(df[['col1', 'col2', 'col3']])

Таким образом, универсальное кодирование будет успешно применено ко всем категориальным столбцам в данных df.

Кинга Идем в IT: пошаговый план для смены профессии

Настройка подхода

Обработка данных разного типа с помощью ColumnTransformer

Воспользуйтесь ColumnTransformer, чтобы к выбранным столбцам применились разъяснённые ранее трансформации:

Python
Скопировать код
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:

Python
Скопировать код
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:

Python
Скопировать код
df['col1'] = df['col1'].astype('category').cat.codes  # Привет, col1, будь добр получить свой код!

Продвинутые техники кодирования

Точное обратное преобразование

Чтобы правильно выполнить inverse_transform, воспользуйтесь кодировщиком на основе словаря:

Python
Скопировать код
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!

Обработка пропущенных значений: хитрости программиста

Пропущенные значения могут быть неприятной неожиданностью. Настройте кодировщики так, чтобы они менее болезненно встретились с этой проблемой, сохраняя целостность данных.

Визуализация

Представьте кодирование категорий в виде цветовой палитры, где каждый цвет соответствует определённой закодированной категории:

Markdown
Скопировать код
Исходная таблица:
| Имя | Специя | Класс |
| ---- | ------ | ----- |
| X    | Сладкий| A     |
| Y    | Острый | B     |
| Z    | Умамисо  | C     |

Цветовые обозначения (кодирование):
| Специя🔖| Класс 🔖|
| ------ | ------- |
| Сладкий| A       |
| Острый | B       |
| Умамисо  | C       |

Цветные коды:
| Метка | Цвет кода |
| ----- | ----------|
| Сладкий | 🟣       |
| Острый  | 🟡       |
| Умамисо   | 🟢       |
| A       | 🟤       |
| B       | 🟥       |
| C       | 🟩       |

Закодированная таблица:
| Имя | Специя 🔖| Класс 🔖|
| ---- | -------- | ------- |
| X    | 🟣       | 🟤       |
| Y    | 🟡       | 🟥       |
| Z    | 🟢       | 🟩       |

Так каждая строчка получает уникальную цветовую маркировку, что упрощает восприятие и повышает наглядность данных.

Оптимизация решений по кодированию

Быстрое и лёгкое кодирование с pandas.get_dummies

Для занятий классификацией преобразовывайте категориальные переменные в фиктивные с помощью pandas.get_dummies:

Python
Скопировать код
encoded_df = pd.get_dummies(df, columns=['col1', 'col3'])
# Col1 и col3, приветствуем вас в мире бинарных файлов!

Численная предобработка с использованием RobustScaler

RobustScaler из scikit-learn поможет изящно научиться справляться с выбросами при оцифровке числовых столбцов:

Python
Скопировать код
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
df['col2'] = scaler.fit_transform(df[['col2']])
# Refreshing col2 после очистки через RobustScaler.

Уникальное кодирование с определением соответствий

Избегайте повторного кодирования с помощью словаря соответствий:

Python
Скопировать код
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]))
# Приём, столбы, начинайте преобразование!

Полезные материалы

  1. sklearn.preprocessing.OneHotEncoder — Ваше справочное руководство по OneHotEncoder.
  2. sklearn.compose.ColumnTransformer — Введение в ColumnTransformer.
  3. Как работать с категориальными данными — Познакомьтесь с этим руководством по категориальным данным.
  4. pandas.get_dummies — Узнайте, как использовать get_dummies.
  5. Column Transformer with Mixed Types — Работа с данными различных типов.
  6. sklearn.pipeline.Pipeline — Упростите процесс кодирования и моделирования данных.