Инженерия и отбор признаков: как улучшать представление данных
Модель видит не реальный объект, а выбранное числовое представление. Инженерия признаков создаёт полезные величины из исходных данных, а отбор удаляет лишние столбцы. Оба процесса должны опираться на смысл задачи и проверяться без доступа к тестовым ответам.
Признак должен существовать в момент прогноза
Для заказа можно вычислить час создания, расстояние и число позиций. Нельзя использовать фактическое время доставки, если оно становится известно после нужного прогноза. Даже технически доступное в исторической таблице поле может быть утечкой будущего.
Полезный вопрос к каждому столбцу: «каким сервисом, из каких данных и в какой момент это значение будет получено?» Если ответа нет, 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 должна явно проверять типы, временную зону, деление на ноль и состав колонок. Для воспроизводимости её включают в трансформер или версионируемый этап подготовки.
Три семейства отбора
- Фильтры оценивают столбцы отдельно от конечной модели, например по статистической связи с целью.
- Wrapper-методы многократно обучают модель на разных подмножествах, как recursive feature elimination.
- Embedded-методы используют саму модель: L1-регуляризацию или важности деревьев.
Отбор по всей таблице до кросс-валидации является утечкой: целевые ответы validation уже повлияли на список столбцов. Поместите selector в Pipeline, чтобы он переобучался внутри каждого фолда.
Больше признаков не всегда лучше
Шумовые столбцы увеличивают пространство поиска, время и вероятность случайной подгонки. Дублирующие признаки могут усложнить интерпретацию. С другой стороны, удаление коррелирующего столбца только по высокому коэффициенту корреляции способно убрать полезный резервный сигнал.
Сравнивайте варианты по кросс-валидации и стабильности выбранного набора. Если при небольшом изменении данных список полностью меняется, объяснения отдельных признаков ненадёжны.
Интерпретация после отбора
То, что selector оставил столбец, не доказывает причинность и справедливость его использования. Почтовый индекс может быть сильным прокси социально-экономического статуса. Для чувствительных решений нужны отдельные правила допустимости, анализ срезов и предметная экспертиза.
Инженерия признаков также создаёт контракт между обучением и сервисом. Любое расхождение формулы, временной зоны или справочника категорий приводит к training-serving skew.
Практика: проведите ревизию признаков
Составьте таблицу из десяти признаков для прогноза отмены заказа. Для каждого укажите момент доступности, источник, возможный пропуск и риск утечки. Придумайте два новых признака, которые можно вычислить заранее, и один правдоподобный, но запрещённый признак из будущего.
Что важно запомнить
- Представление данных определяет, какие закономерности доступно увидеть модели.
- Все признаки должны вычисляться к моменту реального прогноза.
- Отбор с использованием target выполняется внутри кросс-валидации.
- Полезность признака не делает его причинным или допустимым.