Конструирование признаков (Feature Engineering)

Автор:

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

Конструирование признаков (англ. 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}")

  • Feature Engineering — это не магия, а систематическая работа с признаками.

  • Даже простое соотношение двух чисел (как RM_per_CRIM) может улучшить результат.

  • Хорошо продуманные признаки часто важнее, чем выбор модели.


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

  • Используйте знания предметной области: domain knowledge — ваш лучший друг.

  • Визуализируйте признаки (гистограммы, scatter plots).

  • Тестируйте новые признаки по одному.

  • Не бойтесь отбросить бесполезные фичи — меньше шума, лучше результат.