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