Инженерия и отбор признаков: как улучшать представление данных

Модель видит не реальный объект, а выбранное числовое представление. Инженерия признаков создаёт полезные величины из исходных данных, а отбор удаляет лишние столбцы. Оба процесса должны опираться на смысл задачи и проверяться без доступа к тестовым ответам.

Признак должен существовать в момент прогноза

Для заказа можно вычислить час создания, расстояние и число позиций. Нельзя использовать фактическое время доставки, если оно становится известно после нужного прогноза. Даже технически доступное в исторической таблице поле может быть утечкой будущего.

Полезный вопрос к каждому столбцу: «каким сервисом, из каких данных и в какой момент это значение будет получено?» Если ответа нет, offline-эксперимент не соответствует будущей системе.

Преобразования чисел и времени

Нелинейную связь иногда выражают логарифмом, отношением или агрегатом. Возраст аккаунта лучше вычислять относительно момента события, а не сегодняшней даты. Для циклического часа 23 и 0 являются соседями, хотя обычные числа ставят их далеко; синус и косинус помогают сохранить окружность.

import numpy as np
import pandas as pd

def add_time_features(frame: pd.DataFrame) -> pd.DataFrame:
    result = frame.copy()
    if result['items'].isna().any() or (result['items'] <= 0).any():
        raise ValueError('items должен содержать только положительные значения')
    hour = pd.to_datetime(result['created_at']).dt.hour
    result['hour_sin'] = np.sin(2 * np.pi * hour / 24)
    result['hour_cos'] = np.cos(2 * np.pi * hour / 24)
    result['price_per_item'] = result['total'] / result['items']
    return result.drop(columns=['created_at'])

example = pd.DataFrame({
    'created_at': ['2026-08-13T08:30:00+03:00', '2026-08-13T23:15:00+03:00'],
    'total': [1_500.0, 840.0],
    'items': [3, 2],
})
print(add_time_features(example))

Пользовательская функция в production должна явно проверять типы, временную зону, деление на ноль и состав колонок. Для воспроизводимости её включают в трансформер или версионируемый этап подготовки.

Три семейства отбора

Отбор по всей таблице до кросс-валидации является утечкой: целевые ответы validation уже повлияли на список столбцов. Поместите selector в Pipeline, чтобы он переобучался внутри каждого фолда.

Больше признаков не всегда лучше

Шумовые столбцы увеличивают пространство поиска, время и вероятность случайной подгонки. Дублирующие признаки могут усложнить интерпретацию. С другой стороны, удаление коррелирующего столбца только по высокому коэффициенту корреляции способно убрать полезный резервный сигнал.

Сравнивайте варианты по кросс-валидации и стабильности выбранного набора. Если при небольшом изменении данных список полностью меняется, объяснения отдельных признаков ненадёжны.

Интерпретация после отбора

То, что selector оставил столбец, не доказывает причинность и справедливость его использования. Почтовый индекс может быть сильным прокси социально-экономического статуса. Для чувствительных решений нужны отдельные правила допустимости, анализ срезов и предметная экспертиза.

Инженерия признаков также создаёт контракт между обучением и сервисом. Любое расхождение формулы, временной зоны или справочника категорий приводит к training-serving skew.

Практика: проведите ревизию признаков

Составьте таблицу из десяти признаков для прогноза отмены заказа. Для каждого укажите момент доступности, источник, возможный пропуск и риск утечки. Придумайте два новых признака, которые можно вычислить заранее, и один правдоподобный, но запрещённый признак из будущего.

Что важно запомнить

Источники