Назад к статьям

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

Елена Капаца
9 мин

Преобразование необработанных данных в признаки (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).

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

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