Борьба с переобучением CatBoost на малых наборах данных временных рядов: методы регуляризации и кросс-валидации

На малых выборках временных рядов (менее 500-1000 наблюдений) CatBoost демонстрирует склонность к переобучению, когда ошибка на трейне падает до 0.01, а на тесте замирает на уровне 0.15-0.20. В Yandex DataSphere Studio эта проблема усугубляется при использовании глубоких деревьев, которые буквально «запоминают» шум малого датасета вместо выявления сезонности.

Ловушка стандартной кросс-валидации во временных рядах

Использование стандартного K-Fold на временных рядах — критическая ошибка, ведущая к утечке данных (data leakage). В CatBoost это проявляется в искусственном занижении RMSE на 15-30%, так как модель видит будущее при предсказании прошлого. Единственно верный подход в DataSphere — TimeSeriesSplit, где окно обучения расширяется последовательно: [1], [1,2], [1,2,3].

Кейс: при анализе ежемесячных продаж за 3 года (36 точек) переход от K-Fold к TimeSeriesSplit увеличил ошибку MAE с 4.2% до 12.8%, но именно этот результат оказался реальным при выкатке в продакшн. Экспертный вывод: никогда не используйте случайное перемешивание (shuffle=True) для временных рядов, даже если метрики выглядят идеально.

Регуляризация через ограничение сложности дерева

Для малых наборов данных стандартный depth=6 часто оказывается избыточным. Снижение глубины до 3-4 и установка min_data_in_leaf в диапазоне 5-20 наблюдений позволяют избежать переобучения. Если в листе остается 1-2 точки, модель описывает выброс, а не тренд.

Пример: на датасете в 400 строк ограничение depth=3 и l2_leaf_reg=5.0 снизило разрыв между Train и Test RMSE с 0.12 до 0.04. Мой опыт показывает, что агрессивная L2-регуляризация (значения от 3.0 до 10.0) работает эффективнее, чем простое уменьшение количества итераций.

Борьба с шумом через раннюю остановку

Параметр early_stopping_rounds должен быть настроен жестко: для малых выборок оптимально 20-50 итераций. Без этого CatBoost может продолжить обучение еще 500 шагов, улучшая Train-метрику на 0.001, но полностью теряя обобщающую способность. В Yandex DataSphere Studio удобно отслеживать этот процесс через графики лоссов в реальном времени.

Важный нюанс: использование od_type='Iter' в сочетании с малым learning_rate (0.01–0.05) позволяет «мягко» подойти к минимуму ошибки. Вывод: высокая скорость обучения (lr > 0.1) на малых данных — прямой путь к переобучению, выбирайте медленный спуск с ранней остановкой.

Синтетическое расширение и Feature Engineering

Когда данных критически мало (менее 200 точек), регуляризации недостаточно. Здесь помогает генерация синтетических данных для временных рядов в Yandex DataSphere, например, через добавление небольшого гауссова шума к существующим лагам или использование SMOTE для регрессии. Это позволяет увеличить выборку на 20-40%, стабилизируя градиенты.

Практика показывает, что создание лагов (Lags) и скользящих средних (Rolling Means) с окном в 3, 7 и 14 точек дает больше профита, чем подбор гиперпараметров. Однако избыток фичей на малом датасете ведет к «проклятию размерности». Оптимальное соотношение: не более 5-7 признаков на каждые 100 наблюдений. Экспертный вывод: лучше иметь 3 сильных лага, чем 20 сомнительных индикаторов.

Вывод

Для борьбы с переобучением CatBoost на малых временных рядах я рекомендую связку: TimeSeriesSplit → depth=3 → l2_leaf_reg=5.0 → learning_rate=0.03. Избегайте K-Fold и глубоких деревьев. Если ошибка на тесте все еще выше тренировочной более чем на 15%, переходите к генерации синтетики и жесткому отсеву признаков. Начинать нужно с проверки на утечку данных, так как ложный успех на валидации — самая дорогая ошибка в ML-проекте.