Целевое кодирование и расширенная обработка категорий
Целевое, частотное и двоичное кодирование, а также эмбеддинги для столбцов с высокой кардинальностью.
«Целевое кодирование и расширенная обработка категорий» — бесплатный урок Learn AI with Python на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn AI with Python, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn AI with Python содержит 4 уроков всего.
Проблема кодирования категорий
Моделям нужны числа, а категории представлены текстом. Унитарное кодирование подходит для небольшого числа категорий, но признаки с большим числом уникальных значений (тысячи городов или товаров) создают слишком много столбцов.
Ограничения унитарного и меточного кодирования
Унитарное кодирование резко увеличивает размерность. Обычное кодирование метками создаёт ложный порядок: город 5 не больше города 2. Для данных с большим числом уникальных значений нужны более умные способы кодирования.
Что такое кодирование по целевой переменной
Кодирование по целевой переменной заменяет каждую категорию на среднее значение целевой переменной для этой категории. Город заменяется средним уровнем оттока клиентов в этом городе — одним информативным числом.
import pandas as pd
means = df.groupby("city")["target"].mean()
df["city_encoded"] = df["city"].map(means)Опасность переобучения
Редкие категории с небольшим числом строк получают экстремальные средние значения, которые раскрывают целевую переменную и приводят к переобучению. Категория, встречающаяся один раз, в точности скопировала бы единственную метку. Это исправляется с помощью сглаживания.
Сглаживание оценки
Сглаживание объединяет среднее по категории с глобальным средним, учитывая количество образцов в категории. Для редких категорий результат приближается к глобальному среднему, что уменьшает дисперсию.
import pandas as pd
global_mean = df["target"].mean()
agg = df.groupby("city")["target"].agg(["mean", "count"])
smoothing = 10
agg["enc"] = (agg["count"] * agg["mean"] + smoothing * global_mean) / (agg["count"] + smoothing)
df["city_enc"] = df["city"].map(agg["enc"])Библиотека кодировщиков категорий
Пакет category_encoders реализует эти кодировщики с API в стиле scikit-learn, поэтому их можно включать в конвейеры и единообразно применять к обучающим и тестовым наборам.
import category_encoders as ce
encoder = ce.TargetEncoder(cols=["city", "product"], smoothing=10)
X_enc = encoder.fit_transform(X_train, y_train)
X_test_enc = encoder.transform(X_test)Как избежать утечки на практике
Всегда обучайте кодировщик только на обучающих данных, а затем преобразуйте проверочные и тестовые данные. Ещё лучше использовать перекрёстную проверку или кодирование вне обучающей части, чтобы каждая строка кодировалась по данным, не содержащим её.
import category_encoders as ce
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LogisticRegression
pipe = make_pipeline(
ce.TargetEncoder(cols=["city"]),
LogisticRegression(),
)
# fit inside CV to encode without leakageДвоичное кодирование
BinaryEncoder преобразует категории в двоичные цифры, используя всего log2(N) столбцов вместо N. Это компактный компромисс между кодированием one-hot и целевым кодированием.
import category_encoders as ce
encoder = ce.BinaryEncoder(cols=["product_id"])
X_enc = encoder.fit_transform(X_train)
# 256 categories -> 8 binary columnsДругие полезные кодировщики
category_encoders также предлагает CountEncoder (частота каждой категории), LeaveOneOutEncoder (среднее целевой переменной без учёта текущей строки) и CatBoostEncoder (упорядоченные статистики целевой переменной).
import category_encoders as ce
count_enc = ce.CountEncoder(cols=["city"])
loo_enc = ce.LeaveOneOutEncoder(cols=["city"])Обработка высокой кардинальности
При очень высокой кардинальности целевое кодирование или кодирование по количеству сжимает данные до одного столбца, двоичное кодирование остаётся компактным, а объединение редких категорий в группу «прочее» уменьшает шум. Выбирайте метод с учётом кардинальности и риска утечки.
import pandas as pd
freq = df["product"].value_counts()
rare = freq[freq < 20].index
df["product"] = df["product"].replace(rare, "other")Выбор кодировщика
Небольшое количество категорий: one-hot. Древовидные модели с большим количеством категорий: целевое кодирование или кодирование CatBoost. Нужна компактность: двоичное кодирование. Всегда предотвращайте утечку, обучая кодировщик только на обучающих данных и используя сглаживание или схемы кодирования вне обучающей части.
Быстрая проверка
Проверьте свои знания о кодировании категориальных признаков.
Итоги
Итоги: целевое кодирование заменяет категорию средним значением целевой переменной, используя сглаживание для снижения влияния редких категорий. Используйте category_encoders (TargetEncoder, BinaryEncoder, CatBoost/LeaveOneOut) и обучайте кодировщик только на обучающих данных либо вне обучающей части, чтобы избежать утечки. Компактные кодировщики позволяют обрабатывать признаки с высокой кардинальностью, для которых one-hot не подходит.
Часто задаваемые вопросы
Урок «Целевое кодирование и расширенная обработка категорий» бесплатный?
Да — полный текст урока «Целевое кодирование и расширенная обработка категорий» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn AI with Python, подпишись на CoddyKit PRO. Курс Learn AI with Python содержит 4 уроков всего.
Чему я научусь в уроке «Целевое кодирование и расширенная обработка категорий»?
Целевое, частотное и двоичное кодирование, а также эмбеддинги для столбцов с высокой кардинальностью. Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn AI with Python?
Предыдущий опыт не требуется. Learn AI with Python на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Целевое кодирование и расширенная обработка категорий»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn AI with Python?
Да. Каждый урок Learn AI with Python включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Методы отбора признаков
- Создание взаимодействий и полиномиальных признаков
- Целевое кодирование и расширенная обработка категорий
- Автоматизированное конструирование признаков с Featuretools