← Назад к вопросам
Можно ли использовать категориальные признаки в линейной модели?
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 | Высокая | Хорошо |
Правила
- Всегда кодируй категориальные признаки перед линейной моделью
- Используй drop="first" в One-Hot для избежания мультиколлинеарности
- Используй Pipeline для правильного разделения train/test
- Выбери метод в зависимости от кардинальности категорий
Заключение
Категориальные признаки можно использовать в линейных моделях. Оптимальный способ — One-Hot Encoding для низкой кардинальности и Target Encoding для высокой.