Как создать признаки для модели на основе тренда и кульминации в метриках
Что проверяют
Умеете ли вы превратить форму временного ряда в числа, которые поймёт модель, и не заглянуть при этом в будущее. Следом почти всегда спрашивают, как вы проверили, что признак не протекает, и как валидировали модель.
Как отвечать
Сначала уточните постановку: что прогнозируем, на какой горизонт и в какой момент признак должен быть известен. Потом разложите признаки на две группы.
Тренд:
- приросты:
diff(k)иpct_change(k)за несколько окон, например 1, 7 и 28 точек; - наклон: коэффициент линейной регрессии по скользящему окну через
np.polyfitвнутриrolling().apply(). Делите его на средний уровень ряда, иначе наклоны разных объектов несравнимы; - сглаживание:
rolling().mean(),ewm(span=...)и отношение короткого среднего к длинному как сигнал разворота.
Кульминация, то есть пики и спады:
- поиск пиков:
scipy.signal.find_peaksс параметрамиprominenceиdistance, чтобы шум не превращался в сотню ложных вершин; - положение относительно экстремума: отношение текущего значения к скользящему максимуму, просадка от максимума, число шагов с последнего пика;
- характеристики пика: высота, ширина, скорость роста до вершины.
Все признаки считаются только по прошлому: окна без центрирования, результат сдвинут через shift(1), если текущая точка ещё неизвестна в момент прогноза. Валидация через TimeSeriesSplit или разбиение по дате, а пользу признака показывает прирост метрики на отложенном периоде и permutation importance.
Где спотыкаются
Строят признак «сколько шагов до следующего пика». Это утечка в чистом виде: в проде будущего пика ещё нет, и модель, блестящая на валидации, проваливается.
Запускают find_peaks по всему ряду сразу. Пик подтверждается только после того, как значения пошли вниз, поэтому в точке вершины алгоритм уже знает будущее. Считайте пики по расширяющемуся окну или с задержкой подтверждения.
Проверяют всё на KFold с перемешиванием. Соседние точки ряда попадают и в обучение, и в тест, и оценка получается завышенной.