← Назад к вопросам

Можно ли использовать категориальные признаки в линейной модели?

1.0 Junior🔥 171 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Категориальные признаки в линейной модели

Краткий ответ

Да, можно использовать, но нужно их кодировать в числовые признаки.

Способ 1: One-Hot Encoding

Каждая категория становится бинарным признаком.

from sklearn.preprocessing import OneHotEncoder
from sklearn.linear_model import LinearRegression

X = [["red"], ["blue"], ["red"], ["green"]]
y = [10, 20, 15, 25]

enc = OneHotEncoder(drop="first")
X_enc = enc.fit_transform(X).toarray()
lr = LinearRegression()
lr.fit(X_enc, y)

Результат:

Исходные: [red, blue, red, green]
One-Hot:  [1 0; 0 1; 1 0; 0 0]

Плюсы:

  • Не вводит искусственный порядок
  • Интерпретируемо

Минусы:

  • Много новых признаков для высокой кардинальности
  • Нужна осторожность с dummy trap

Важно: используй drop="first" чтобы избежать мультиколлинеарности.

Способ 2: Label Encoding

Преобразует категории в числа 0, 1, 2, ...

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
X_enc = le.fit_transform(["red", "blue", "red", "green"])
# [2, 0, 2, 1]

Когда использовать:

  • Для ординальных категорий (S < M < L)
  • Для tree-based моделей

НЕ рекомендуется для линейных моделей, потому что вводит искусственный порядок.

Способ 3: Target Encoding

Ремещает категорию на среднее значение целевой переменной.

from category_encoders import TargetEncoder

enc = TargetEncoder()
X_enc = enc.fit_transform(X, y)

Плюсы:

  • Меньше новых признаков
  • Хорош для высокой кардинальности

Минусы:

  • Риск overfitting
  • Нужна осторожность при CV

Правильный Pipeline

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

preprocessor = ColumnTransformer([
    ("cat", OneHotEncoder(drop="first"), ["color"]),
    ("num", "passthrough", ["price"])
])

pipe = Pipeline([
    ("preprocessor", preprocessor),
    ("model", LinearRegression())
])

pipe.fit(X, y)

Сравнение методов

МетодКардинальностьИнтерпретация
One-HotНизкаяХорошо
LabelЛюбаяПлохо для линейных
TargetВысокаяХорошо

Правила

  1. Всегда кодируй категориальные признаки перед линейной моделью
  2. Используй drop="first" в One-Hot для избежания мультиколлинеарности
  3. Используй Pipeline для правильного разделения train/test
  4. Выбери метод в зависимости от кардинальности категорий

Заключение

Категориальные признаки можно использовать в линейных моделях. Оптимальный способ — One-Hot Encoding для низкой кардинальности и Target Encoding для высокой.