📌 Как в линейную модель поместить категориальные признаки ?



💬 Спрашивают в 14% собеседований



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



1️⃣ One-Hot Encoding (Одинарное кодирование)



Преобразует категориальные признаки в бинарные вектора. Для каждой категории создается отдельный бинарный признак, который принимает значение 1, если объект принадлежит этой категории, и 0 в противном случае.



Категориальный признак "Цвет" с возможными значениями "красный", "синий" и "зеленый" будет преобразован в три бинарных признака.

import pandas as pd

from sklearn.linear_model import LinearRegression

from sklearn.preprocessing import OneHotEncoder



# Пример данных

data = {'Цвет': ['красный', 'синий', 'зеленый', 'красный', 'синий'],

'Цена': [10, 15, 12, 10, 20]}

df = pd.DataFrame(data)



# Преобразование категориального признака с использованием OneHotEncoder

encoder = OneHotEncoder(sparse=False)

encoded_colors = encoder.fit_transform(df[['Цвет']])



# Создание DataFrame с закодированными признаками

encoded_df = pd.DataFrame(encoded_colors, columns=encoder.get_feature_names_out(['Цвет']))



# Объединение закодированных признаков с исходными данными

df = pd.concat([df.drop('Цвет', axis=1), encoded_df], axis=1)



# Обучение линейной модели

X = df.drop('Цена', axis=1)

y = df['Цена']

model = LinearRegression()

model.fit(X, y)



# Предсказание

predictions = model.predict(X)

print(predictions)




2️⃣ Label Encoding (Метка кодирования)



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

from sklearn.preprocessing import LabelEncoder



# Пример данных

data = {'Цвет': ['красный', 'синий', 'зеленый', 'красный', 'синий'],

'Цена': [10, 15, 12, 10, 20]}

df = pd.DataFrame(data)



# Преобразование категориального признака с использованием LabelEncoder

encoder = LabelEncoder()

df['Цвет_код'] = encoder.fit_transform(df['Цвет'])



# Обучение линейной модели

X = df[['Цвет_код']]

y = df['Цена']

model = LinearRegression()

model.fit(X, y)



# Предсказание

predictions = model.predict(X)

print(predictions)




3️⃣ Target Encoding (Целевая кодировка)



Заменяет категориальные признаки средним значением целевой переменной для каждой категории. Этот метод может улучшить качество модели, но требует осторожности, чтобы избежать переобучения.

import category_encoders as ce



# Пример данных

data = {'Цвет': ['красный', 'синий', 'зеленый', 'красный', 'синий'],

'Цена': [10, 15, 12, 10, 20]}

df = pd.DataFrame(data)



# Преобразование категориального признака с использованием TargetEncoder

encoder = ce.TargetEncoder(cols=['Цвет'])

df['Цвет_код'] = encoder.fit_transform(df['Цвет'], df['Цена'])



# Обучение линейной модели

X = df[['Цвет_код']]

y = df['Цена']

model = LinearRegression()

model.fit(X, y)



# Предсказание

predictions = model.predict(X)

print(predictions)




Чтобы включить категориальные признаки в линейную модель, их нужно преобразовать в числовую форму. Основные методы включают One-Hot Encoding, Label Encoding и Target Encoding. Каждый метод имеет свои преимущества и применяется в зависимости от конкретной задачи и данных.



🔥 ТОП ВОПРОСОВ С СОБЕСОВ



🔒 База собесов | 🔒 База тестовых