Зачем бустингу дентрендинг
Так сложилось, что бустинги не умеют экстраполировать, то есть их предсказание всегда ограничено средним значением в листе, а значит, модель физически не может выдать число за пределами обучающей выборки Все ок, пока данные стационарны, но если есть тренд, тестовые значения гарантированно вылезут за диапазон обучения Бустинг в такой ситуации делает единственное, что может — прогнозирует последнее известное значение
Решение: гибридная модель
Идея следующая: пусть каждая модель делает то, что умеет (👍). Линейная регрессия экстраполирует тренд, а бустинг ловит нелинейные паттерны в остатках Алгоритм: 1. Обучаем линейную регрессию: trend = LinearRegression().fit(time, y) 2. Вычитаем тренд: residuals = y - trend.predict(time) 3. Обучаем бустинг на остатках: gbm.fit(features, residuals) 4. Прогноз: y_pred = trend.predict(time_future)+gbm.predict(features_future)
Для мультипликативной сезонности (амплитуда растёт вместе с уровнем) вместо вычитания делим на тренд, а при восстановлении умножаем Еще вариант: LightGBM linear_tree Параметр linear_tree=True добавляет линейные функции в листья деревьев. Модель сама учится экстраполировать, без ручного детрендинга
Тренд как фича
Если детрендинг улучшил качество в вашей задаче, попробуйте также добавить сам тренд в качестве признака для бустинга. Это часто помогает докрутить решение
А ipynb с реализацией в моем канале