Валидация прогнозов с помощью TimeSeriesSplit и анализа ошибок по горизонтам
Используйте TimeSeriesSplit для оценки хронологически упорядоченных прогнозов без утечки данных, вычисляйте ошибки для каждого горизонта прогнозирования и выбирайте строго согласованную метрику, соответствующую стоимости принятия решений.
В этом материале
Основная мысль
Используйте TimeSeriesSplit для создания хронологически упорядоченных обучающих и тестовых выборок, чтобы каждая оценка основывалась только на прошлых данных, затем вычисляйте регрессионную метрику отдельно для каждого горизонта прогнозирования и сравнивайте эти ошибки. Итоговая метрика не является одним глобальным средним значением; это релевантное для принятия решений резюме того, как меняется ошибка по мере роста горизонта. Выберите строго согласованную функцию оценки, такую как mean_absolute_error для целевого медианного значения или mean_squared_error для целевого среднего значения, и используйте ее как для функции потерь при обучении, так и для оценки. Такое соответствие гарантирует, что метрика правдиво отражает стоимость выбранного точечного прогноза. Например, при наличии 12 ежемесячных выборок TimeSeriesSplit(n_splits=3, test_size=2) создает три фолда, где каждый тестовый набор охватывает два месяца, а обучающий набор содержит только более ранние месяцы. Если MAE по горизонтам растет с 1.2 на первом горизонте до 2.8 на третьем, то бизнес-затраты при принятии решения на три месяца вперед существенно выше, чем при решении на один месяц. После этого вы можете решить, стоит ли принимать такую деградацию, добавлять новые признаки или ограничить горизонт прогнозирования. Данный подход предполагает наличие равноотстоящих выборок и точечный прогноз, а не полное вероятностное распределение.
Валидация прогнозов с помощью TimeSeriesSplit
TimeSeriesSplit - это кросс-валидатор, разработанный для данных, упорядоченных во времени. Он предотвращает утечку данных, гарантируя, что модель обучается только на прошлых наблюдениях и оценивается на последующих хронологических фолдах. Стандартные методы кросс-валидации неприменимы для временных рядов, так как они могут использовать будущие данные для обучения и прошлые - для оценки. TimeSeriesSplit возвращает индексы обучения и тестирования таким образом, что каждый тестовый набор охватывает более поздний временной интервал, чем соответствующий ему обучающий набор. Обучающая выборка накапливает данные из предыдущих сплитов, и последующие обучающие наборы являются надмножествами предыдущих. Эта структура соответствует временному порядку прогнозирования, где будущие значения никогда не должны использоваться для предсказания прошлого.
Чтобы обеспечить сопоставимость метрик между фолдами, выборки должны быть равноотстоящими. При соблюдении этого условия каждый тестовый набор охватывает один и тот же временной интервал, в то время как обучающий набор растет. Класс принимает такие параметры, как n_splits, max_train_size, test_size и gap. Размер тестовой выборки по умолчанию составляет n_samples // (n_splits + 1), а параметр gap исключает образцы из конца каждого обучающего набора перед тестовым набором. Метод split возвращает массивы индексов, которые можно использовать для среза данных. Это упрощает итерацию по фолдам, обучение модели и ее оценку на каждом тестовом окне.
При фиксированном значении test_size фолды создают тестовые наборы равной длины. Каждый фолд оценивает модель на определенном горизонте, и ошибка по каждому фолду может записываться отдельно. Это основа для анализа ошибок по горизонтам прогнозирования. Тот же цикл оценки можно расширить для сохранения прогнозов для каждого горизонта, чтобы метрики вычислялись по горизонтам, а не только по фолдам. Ключевым требованием является сохранение хронологического порядка данных и отсутствие утечки будущей информации в этап обучения.
import numpy as np
from sklearn.model_selection import TimeSeriesSplit
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error
X = np.arange(12).reshape(-1, 1)
y = np.array([1.0, 1.8, 3.2, 4.1, 5.0, 5.9, 6.8, 7.7, 8.6, 9.5, 10.4, 11.3])
tscv = TimeSeriesSplit(n_splits=3, test_size=2)
for fold, (train_idx, test_idx) in enumerate(tscv.split(X), start=1):
X_train, X_test = X[train_idx], X[test_idx]
y_train, y_test = y[train_idx], y[test_idx]
model = LinearRegression()
model.fit(X_train, y_train)
pred = model.predict(X_test)
print(f"Fold {fold}: test indices {test_idx}, MAE {mean_absolute_error(y_test, pred):.3f}")
Анализ ошибок по горизонтам прогнозирования
После получения прогнозов из каждого фолда следующим шагом является сравнение метрик на каждом горизонте прогнозирования. Одна глобальная метрика скрывает то, как качество прогноза ухудшается по мере увеличения временного разрыва с обучающим набором. Группируя ошибки по горизонтам, вы можете увидеть, являются ли краткосрочные прогнозы точными и ухудшаются ли долгосрочные, или же паттерн ошибок носит нерегулярный характер. Это сравнение имеет решающее значение для определения того, насколько далеко вперед можно доверять прогнозу для конкретного бизнес-действия.
Ошибка по горизонту вычисляется путем выбора всех прогнозов, чей горизонт соответствует заданному значению, и применения выбранной регрессионной метрики к соответствующим истинным значениям. Это требует сохранения индекса горизонта для каждого прогноза, что естественно при многошаговом прогнозировании одной моделью или при оценке каждого фолда на конкретном горизонте. Полученная таблица или график показывает траекторию ошибки по горизонтам. Это дает прямой ответ на вопрос о том, насколько хуже становится прогноз по мере удлинения окна предсказания.
Такой анализ также помогает отделить структурную ошибку от шума. Если ошибка стабильно растет с увеличением горизонта, модели может не хватать информации для долгосрочных прогнозов. Если ошибка резко возрастает на определенном горизонте, это может указывать на структурный сдвиг, сезонность или недостаточность обучающих данных для этого диапазона. Вид по горизонтам более информативен, чем один агрегированный показатель, поскольку он выявляет, где прогноз теряет ценность. Это также поддерживает следующий шаг - связь метрики со стоимостью принятия решений, так как каждый горизонт может быть сопоставлен с конкретным действием или риском.
from sklearn.metrics import mean_absolute_error
# y_true and y_pred are aligned per horizon
horizon_errors = {}
for horizon in range(1, max_horizon + 1):
mask = (horizon_index == horizon)
horizon_errors[horizon] = mean_absolute_error(y_true[mask], y_pred[mask])
Связь метрик со стоимостью принятия решений
Выбор функции оценки должен начинаться с конечной цели и применения прогноза, а не из соображений удобства. Полезно различать два этапа: прогнозирование и принятие решения. Прогнозирование включает выбор свойства или функционала распределения отклика, такого как среднее, медиана или квантиль. Принятие решения включает действия на основе этого прогноза. Метрика, используемая для оценки, должна быть строго согласована с целевым функционалом, выбранным при прогнозировании. Строго согласованная функция оценки гарантирует, что стратегия «говорить правду» является оптимальной в ожидании, что означает, что метрика точно отражает расстояние между прогнозами и истинными целями.
Для регрессоров типичными целевыми функционалами являются среднее и медиана. Среднеквадратическая ошибка (MSE) согласована со средним, в то время как средняя абсолютная ошибка (MAE) согласована с медианой. Использование метрики, не согласованной с целевым функционалом, может привести к вводящим в заблуждение сравнениям. Например, если модель обучена предсказывать медиану, но оценивается с помощью квадратичной ошибки, оценка может не отражать реальную стоимость выбранного точечного прогноза. Документация scikit-learn рекомендует использовать строго согласованную функцию оценки для выбранного функционала и применять ее как в качестве функции потерь при обучении, так и в качестве метрики для оценки и сравнения моделей.
После выбора метрики ее следует связать с бизнес-затратами при принятии решения. Итоговая метрика - это не просто число, а прокси-показатель стоимости ошибок прогноза. Если MAE по горизонтам составляет 1.2 на первом горизонте и 2.8 на третьем, то стоимость решения на три месяца вперед более чем в два раза превышает стоимость решения на один месяц. Это сравнение может оправдать ограничение горизонта прогнозирования, добавление новых признаков или принятие деградации. Метрику необходимо интерпретировать в контексте применения, так как одно и то же значение ошибки может иметь разные последствия в разных областях.
from sklearn.metrics import mean_absolute_error, mean_squared_error
# Strictly consistent scoring functions for point forecasts
mae = mean_absolute_error(y_true, y_pred) # aligns with median target
mse = mean_squared_error(y_true, y_pred) # aligns with mean target
Выбор согласованных функций оценки
Строго согласованная функция оценки должна быть выбрана так, чтобы она соответствовала целевому функционалу точечного прогноза. Для среднего значения стандартным выбором является среднеквадратическая ошибка. Для медианы стандартным выбором является средняя абсолютная ошибка. Эти функции гарантируют, что ожидаемый счет минимизируется, когда прогноз равен целевому функционалу, что делает метрику правдивым измерением качества прогноза. Документация scikit-learn подчеркивает, что после выбора строго согласованной функции оценки ее лучше всего использовать и как функцию потерь для обучения модели, и как метрику для оценки и сравнения моделей.
Таблица доступных скореров в документации по оценке моделей scikit-learn включает такие регрессионные метрики, как mean_absolute_error, mean_squared_error, root_mean_squared_error и median_absolute_error. Каждая из них имеет определенную связь с целевым функционалом. Выбор должен определяться бизнес-целью и статистическим свойством прогноза, которое имеет значение. Если цель - минимизировать среднее абсолютное отклонение, подходит MAE. Если цель - минимизировать среднее квадратичное отклонение, подходит MSE. Метрика должна быть согласована с целью прогноза, чтобы избежать смещенной оценки.
Использование одной и той же метрики для обучения и оценки гарантирует, что модель оптимизирует именно то количество, которое будет измеряться. Это предотвращает ситуации, когда модель показывает хорошие результаты по несогласованной метрике, но плохо работает с точки зрения фактически значимой величины. Анализ по горизонтам тогда становится осмысленным, поскольку метрика отражает реальную стоимость прогноза на каждом горизонте. Окончательное решение может основываться на траектории ошибки и бизнес-эффекте ошибок на разных горизонтах, а не на одном агрегированном показателе, который может скрыть важные закономерности.
from sklearn.metrics import mean_absolute_error
# Example: 12 monthly samples, 3 folds, test_size=2
# Fold 1 test indices: 6,7; Fold 2 test indices: 8,9; Fold 3 test indices: 10,11
# Per-horizon MAE: horizon 1 = 1.2, horizon 2 = 1.9, horizon 3 = 2.8
# Decision: restrict forecast to horizon 2 or improve long-horizon features
Условия применения
- Являются ли выборки равноотстоящими, чтобы каждый тестовый набор охватывал один и тот же временной интервал?
- Следит ли каждый тестовый набор строго за своим обучающим набором, чтобы данные из будущего не использовались для обучения?
- Является ли выбранная метрика строго согласованной с целевым функционалом, таким как среднее или медиана?
- Вычисляются ли ошибки по горизонтам отдельно, вместо того чтобы объединять все в одно глобальное число?
- Связана ли итоговая метрика с реальными бизнес-затратами при принятии решения?
- Является ли прогноз точечным, а не полным вероятностным распределением?
- Являются ли обучающие и тестовые наборы разрозненными во времени для каждого фолда?
- Используется ли метрика последовательно как для обучения модели, так и для ее оценки?
Границы применения
TimeSeriesSplit требует, чтобы выборки были равноотстоящими для обеспечения сопоставимости метрик между фолдами. Подход предполагает точечный прогноз, а не полное вероятностное распределение. Он не учитывает автоматически асимметричные бизнес-затраты или нестационарность в структуре ошибок. Сравнения ошибок по горизонтам могут быть зашумленными при малом количестве фолдов, и итоговая сводная метрика должна интерпретироваться с учетом конкретного контекста принятия решений.