Конструирование признаков (англ. Feature Engineering) — это преобразование необработанных данных в признаки (Feature), которые делают модель Машинного обучения (ML) более эффективной. Хорошо сконструированные признаки могут значительно повысить точность модели, а плохие — испортить результат даже у самого продвинутого алгоритма.
Признак — это измеримая характеристика объекта. В задаче предсказания цены квартиры это могут быть:
-
Площадь (в м²)
-
Количество комнат
-
Расстояние до центра
-
Год постройки
-
Обработка пропущенных значений: заполнение медианой, модой или предсказанием.
-
Создание новых признаков: на основе существующих (например,
цена / площадь
→ цена за м²). -
Разбиение на категории: биннинг (например, "молодой дом", "старый дом").
-
Обработка категориальных признаков: One-Hot Encoding, Label Encoding.
-
Масштабирование признаков: Стандартизация (Standartization) или Нормализация (Normalization).
-
Дата и время: извлечение дня недели, месяца, сезонности.
-
Текстовые признаки: количество слов, частота ключевых слов, TF-IDF и др.
Цель Feature Engineering — извлечь полезную информацию из данных, чтобы помочь модели "понять", какие факторы действительно важны.
Основные техники Feature Engineering
Практический пример: Предсказание цены жилья
Воспользуемся набором данных 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).
-
Тестируйте новые признаки по одному.
-
Не бойтесь отбросить бесполезные фичи — меньше шума, лучше результат.