Как бороться с трендом в данных при использовании деревьев и случайного леса для прогноза
Что проверяют
Знаете ли вы главное ограничение деревьев: они не экстраполируют. Прогноз дерева это среднее по листу, то есть значение из диапазона обучающей выборки, и на растущем ряду модель упирается в потолок последних значений. Следом спрашивают, как вы валидировали такую модель.
Как отвечать
Начните с механизма. Случайный лес усредняет листья деревьев, градиентный бустинг их складывает, но и там прогноз не выходит за пределы того, что встречалось в обучении. Признак времени тоже не спасает: для будущих дат все деревья попадут в самый правый лист.
Дальше способы:
- предсказывать не уровень, а изменение: разность соседних значений, относительный прирост или логарифм отношения. Такие величины обычно стационарнее, а уровень восстанавливается накоплением прогнозов;
- вычесть тренд: оценить его линейной регрессией или декомпозицией STL, обучить лес на остатках и сложить прогнозы. Получается гибрид, где линейная модель ведёт тренд, а деревья ловят нелинейность;
- нормировать признаки: лаги и скользящие средние в тех же относительных единицах, а не в абсолютных значениях;
- линейные листья: в LightGBM есть параметр
linear_tree, в листьях строятся линейные модели, и прогноз может выходить за диапазон; - окно обучения: при смене режима учить на последнем периоде и переобучать по расписанию.
Валидация только по времени: TimeSeriesSplit в scikit-learn или бэктест с расширяющимся окном. Обычный k-fold перемешивает прошлое и будущее и даёт оптимистичную ошибку. Метрики смотрите на последних отрезках, где тренд уводит ряд дальше всего от обучающих данных.
Где спотыкаются
Предлагают L1 и L2 регуляризацию. В случайном лесе её нет, а в бустинге она штрафует веса листьев и с трендом никак не связана.
Используют случайный k-fold на временном ряду. Утечка из будущего маскирует проблему экстраполяции, и она всплывает только в проде.
Добавляют номер дня как признак и считают вопрос решённым. Для дат после конца обучения дерево выдаст одно и то же значение последнего листа.