Конструирование признаков (Feature Engineering) - Лена Капаца
Конструирование признаков (Feature Engineering) by Лена Капаца May 6, 2025 Основы

Конструирование признаков (англ. Feature Engineering) — это преобразование необработанных данных в признаки (Feature), которые делают модель Машинного обучения (ML) более эффективной. Хорошо сконструированные признаки могут значительно повысить точность модели, а плохие — испортить результат даже у самого продвинутого алгоритма.

Признак — это измеримая характеристика объекта. В задаче предсказания цены квартиры это могут быть:

Цель Feature Engineering — извлечь полезную информацию из данных, чтобы помочь модели "понять", какие факторы действительно важны.

Основные техники Feature Engineering

  1. Обработка пропущенных значений: заполнение медианой, модой или предсказанием.

  2. Создание новых признаков: на основе существующих (например, цена / площадь → цена за м²).

  3. Разбиение на категории: биннинг (например, "молодой дом", "старый дом").

  4. Обработка категориальных признаков: One-Hot Encoding, Label Encoding.

  5. Масштабирование признаков: Стандартизация (Standartization) или Нормализация (Normalization).

  6. Дата и время: извлечение дня недели, месяца, сезонности.

  7. Текстовые признаки: количество слов, частота ключевых слов, TF-IDF и др.


Практический пример: Предсказание цены жилья

Воспользуемся набором данных Boston Housing из sklearn.

import pandas as pd
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LinearRegression
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

# Загрузка данных
boston = load_boston()
X = pd.DataFrame(boston.data, columns=boston.feature_names)
y = boston.target

# Добавим новый признак: количество комнат на человека
X['RM_per_CRIM'] = X['RM'] / (X['CRIM'] + 1)  # +1 для избежания деления на 0

# Добавим категориальный признак: дорогой ли район (по медианному значению налога)
X['IS_HIGH_TAX'] = (X['TAX'] > X['TAX'].median()).astype(int)

# Выделим числовые и категориальные признаки
numeric_features = ['RM', 'LSTAT', 'PTRATIO', 'RM_per_CRIM']
categorical_features = ['IS_HIGH_TAX']

# Построим pipeline
preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), numeric_features),
        ('cat', OneHotEncoder(), categorical_features)
    ])

model = Pipeline(steps=[
    ('preprocessing', preprocessor),
    ('regressor', LinearRegression())
])

# Разделение на train/test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Обучение модели
model.fit(X_train, y_train)

# Оценка
score = model.score(X_test, y_test)
print(f"R² на тестовой выборке: {score:.3f}")


Рекомендации

© Лена Капаца. Все права защищены.