Кодирование категориальных переменных
Меточный, one-hot- и порядковый способы кодирования, pd.get_dummies() и sklearn OrdinalEncoder.
«Кодирование категориальных переменных» — бесплатный урок Learn AI with Python на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn AI with Python, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn AI with Python содержит 4 уроков всего.
Зачем кодировать категории?
Большинству моделей машинного обучения нужны NUMBERS, а не текстовые метки вроде «красный» или «маленький». Кодирование преобразует категориальные переменные в числовую форму, сохраняя их смысл.
Порядковые и номинальные категории
Порядковые категории имеют естественный порядок (маленький < средний < большой). Номинальные категории такого порядка не имеют (красный, зелёный, синий). Подходящий способ кодирования зависит от типа категорий.
Кодирование метками для порядковых категорий
LabelEncoder сопоставляет каждой категории целое число. Он подходит для данных типа ORDINAL, где порядок чисел имеет смысл.
from sklearn.preprocessing import LabelEncoder
sizes = ["small", "large", "medium", "small"]
le = LabelEncoder()
print(le.fit_transform(sizes)) # integers (alphabetical by default)Опасность для номинальных категорий
Применять кодирование метками к данным типа NOMINAL рискованно: модель может воспринять красный=0, зелёный=1, синий=2 так, будто зелёный находится «между» красным и синим, создав ложный порядок. Вместо этого используйте кодирование индикаторными столбцами.
Кодирование индикаторными столбцами с помощью get_dummies
pd.get_dummies создаёт по одному бинарному столбцу для каждой категории. В каждой строке единицей заполнен ровно один столбец, поэтому подразумеваемого порядка нет; это идеально подходит для номинальных переменных.
import pandas as pd
df = pd.DataFrame({"color": ["red", "green", "blue", "red"]})
print(pd.get_dummies(df, columns=["color"]))Ловушка фиктивных переменных
Когда k категорий порождают k столбцов, эти столбцы идеально коллинеарны: их сумма всегда равна 1. Эта ловушка фиктивных переменных нарушает работу линейных моделей. Удалите один столбец, чтобы исправить ситуацию.
Параметр drop_first
drop_first=True удаляет одну категорию, оставляя k-1 столбцов. Удалённая категория становится неявной базовой категорией (все значения равны нулю), что устраняет коллинеарность.
print(pd.get_dummies(df, columns=["color"], drop_first=True))
# one fewer column; the dropped color is the baselineOrdinalEncoder для порядковых категорий
Для конвейеров OrdinalEncoder — эквивалент кодирования метками для FEATURES в библиотеке машинного обучения; он позволяет явно задать порядок категорий.
from sklearn.preprocessing import OrdinalEncoder
enc = OrdinalEncoder(categories=[["small", "medium", "large"]])
print(enc.fit_transform([["medium"], ["large"], ["small"]]))OneHotEncoder для конвейеров
OneHotEncoder — удобный для конвейеров инструмент кодирования индикаторными столбцами. Он изучает категории по обучающим данным и применяет то же сопоставление к новым данным, что крайне важно для рабочей среды.
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(sparse_output=False)
print(ohe.fit_transform([["red"], ["green"], ["blue"]]))Обработка неизвестных категорий
Тестовые данные могут содержать категории, которые не встречались при обучении. Установите handle_unknown="ignore", чтобы OneHotEncoder вместо сбоя выдавал нули во всех столбцах.
ohe = OneHotEncoder(handle_unknown="ignore", sparse_output=False)
ohe.fit([["red"], ["green"]])
print(ohe.transform([["blue"]])) # all zeros, no errorСтолбцы с высокой кардинальностью
Кодирование индикаторными столбцами для столбца с тысячами уникальных значений резко увеличивает число признаков. Для высокой кардинальности рассмотрите кодирование по целевой переменной, хеширование или объединение редких категорий в категорию «другое».
Быстрая проверка
Проверьте свои знания о кодировании.
Итоги
Инструменты кодирования:
- Данные типа ORDINAL -> кодирование целыми числами (
LabelEncoder/OrdinalEncoder) - Номинальные данные -> кодирование индикаторными столбцами (
pd.get_dummies/OneHotEncoder) drop_first=Trueпозволяет избежать ловушки фиктивных переменныхhandle_unknown="ignore"для неизвестных тестовых категорий- Следите за резким ростом числа столбцов при высокой кардинальности
Часто задаваемые вопросы
Урок «Кодирование категориальных переменных» бесплатный?
Да — полный текст урока «Кодирование категориальных переменных» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn AI with Python, подпишись на CoddyKit PRO. Курс Learn AI with Python содержит 4 уроков всего.
Чему я научусь в уроке «Кодирование категориальных переменных»?
Меточный, one-hot- и порядковый способы кодирования, pd.get_dummies() и sklearn OrdinalEncoder. Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn AI with Python?
Предыдущий опыт не требуется. Learn AI with Python на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Кодирование категориальных переменных»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn AI with Python?
Да. Каждый урок Learn AI with Python включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Обнаружение и удаление выбросов
- Кодирование категориальных переменных
- Масштабирование признаков: нормализация и стандартизация
- Создание конвейеров предварительной обработки