Использование Python и набора тестов для получения интервалов, не зависящих от распределения

Не менее важным, чем получение точечной оценки для приложений прогнозирования, является определение того, насколько вероятно фактическое значение будет отличаться от прогноза. Большинство прогнозов не являются точными на 100%, поэтому важно иметь хорошее представление о возможностях при реализации модели. Для моделей с лежащими в основе функциональными формами, такими как ARIMA, доверительные интервалы могут быть определены с использованием предполагаемого распределения остатков и стандартных ошибок оценки. Эти интервалы логичны в том смысле, что они расширяются по мере того, как прогноз уходит дальше от известного последнего значения — по мере накопления неопределенности это представляется математическим способом, который согласуется с нашей интуицией. И если допущения модели верны, 95% доверительный интервал гарантированно содержит 95% фактических значений.

Конформное предсказание

Однако при работе с моделью машинного обучения, которая не имеет формы, которую можно представить простым уравнением, и не предполагает распределения базовых данных, создание надежного доверительного интервала становится более сложной задачей. Популярным решением этой проблемы являются конформные предсказания. В репозитории GitHub Awesome Conformal Prediction есть множество замечательных ресурсов, которые помогут более подробно изучить эту идею.

Одним из таких ресурсов является библиотека, которая предлагает конформную оценку, которая может быть объединена с оценками scikit-learn: mapie. Один из лучших способов применения этого метода для временных рядов — это библиотека tspiral, описанная здесь. Тем не менее, конформное предсказание mapie может завести вас так далеко, только если рассматриваемый временной ряд был разным для достижения стационарности до применения оценки scikit-learn. Конформный подход можно применить к ряду на другом уровне, но что происходит, когда мы хотим вернуться на исходный уровень? Если мы просто аннулируем доверительные интервалы так же, как мы аннулируем точечные оценки, результирующие интервалы обычно будут слишком широкими.

Вот где может помочь масштабирование. Он использует тип наивного конформного прогнозирования, когда тестовый набор используется для нахождения диапазона процентилей для применения к прогнозам на неизвестном горизонте. Когда базовый ряд был разным, как фактические значения тестового набора, так и прогнозы не различаются, и к остаткам за пределами выборки применяется процентильная функция, чтобы найти вероятное покрытие прогнозов. Это не совсем научно — например, не предпринимается никаких усилий для исправления автокорреляции в результирующих остатках. Но я верю, что это работает, и, измерив его эффективность с помощью эмпирической метрики, возможно, я смогу убедить вас в том же.

МСИС

Средняя масштабированная интервальная оценка была введена Gneiting & Raftery в 2007 году для измерения эффективности доверительных интервалов. Чем ниже баллы, тем лучше. Макридакис и др. al (2020) использовал MSIS для оценки доверительных интервалов при подаче заявок на конкурс M4. Вот что об этом пишут:

Следующий алгоритм иллюстрирует, как на практике оценивается MSIS, и подчеркивает его логику, когда он используется для сравнения точности интервалов, сгенерированных двумя разными методами прогнозирования:

• Штраф рассчитывается для каждого метода в точках, в которых будущие значения выходят за указанные пределы. Это фиксирует степень охвата каждого метода.

• Ширина интервала прогнозирования добавляется к штрафу, если он есть, для получения оценки интервала (IS). В этом отношении методы с большими интервалами уступают методам с меньшими интервалами, независимо от достигнутой степени охвата.

• IS, оцененные в отдельных точках, усредняются для получения средней интервальной оценки (MIS).

• MIS масштабируется путем деления его значения на среднюю абсолютную сезонную разницу ряда, как это делается в случае MASE, используемого в M4, чтобы сделать измерение независимым от масштаба.

Мы можем использовать MSIS для измерения эффективности интервалов масштабирования в моделях машинного обучения и сравнивать эти модели с более традиционной и надежной моделью временных рядов с базовой функциональной формой — ARIMA. Чтобы сделать анализ более полным, мы попробуем три разных набора данных:

  • Ежедневные посетители: стационарные, большие, агрегированные на дневном уровне и довольно легко предсказуемые.
  • Запуски жилья: большие, ежемесячные, и будут первыми дифференцированными для достижения стационарности
  • Авокадо: маленькие, еженедельные, и будут как первыми, так и первыми сезонными.

Все наборы данных могут быть опубликованы. Полный блокнот с анализом вы можете увидеть здесь.

Синтаксис кода

Для запуска кода необходимы следующие установки:

pip install --upgrade scalecast
pip install tqdm

Чтобы быть немного кратким, я поделюсь только кодом блокнота, который использует набор данных Avocados. Во-первых, библиотека импортирует и загружает данные:

import pandas as pd
import numpy as np
from scalecast.Forecaster import Forecaster
from scalecast import GridGenerator
from scalecast.util import metrics, find_optimal_transformation
from scalecast.notebook import tune_test_forecast
from scalecast.SeriesTransformer import SeriesTransformer
import matplotlib.pyplot as plt
import seaborn as sns
import time
from tqdm.notebook import tqdm

avocados = pd.read_csv('avocado.csv',parse_dates = ['Date'])
volume = avocados.groupby('Date')['Total Volume'].sum()

Давайте разделим данные, чтобы убедиться, что все справедливо протестировано вне выборки:

val_len = 20
fcst_len = 20

volume_sep = volume.iloc[-fcst_len:]
volume = volume.iloc[:-fcst_len]

Этот набор данных невелик, и после разности и использования авторегрессионных терминов для прогнозирования количество наблюдений, с которыми нужно работать, становится еще меньше. Поэтому мы используем 20 наблюдений в тестовом наборе и столько же в проверочном наборе для построения интервалов. Двадцать наблюдений — это минимум, необходимый для надежного формирования 95% доверительных интервалов, которые мы будем использовать. Теперь создадим объект Прогнозист:

f = Forecaster(
    y = volume,
    current_dates = volume.index,
    future_dates = fcst_len,
    test_length = val_len,
    validation_length = val_len,
    cis = True, # adjust the width using the cilevel attribute
)

Мы применяем первую разницу, а затем первую сезонную разницу к данным, предполагая 52-периодный цикл:

transformer = SeriesTransformer(f)
f = transformer.DiffTransform(1)
f = transformer.DiffTransform(52) # seasonal differencing

Теперь мы автоматически выбираем ковариаты для применения к прогнозам с помощью auto_Xvar_select():

f.auto_Xvar_select(
    estimator='elasticnet',
    alpha=.2,
    max_ar=26,
    monitor='ValidationMetricValue', # not test set
    decomp_trend=False,
)

f

Вызвав экземпляр объекта, мы видим, что было выбрано:

Forecaster(
    DateStartActuals=2016-01-10T00:00:00.000000000
    DateEndActuals=2017-11-05T00:00:00.000000000
    Freq=W-SUN
    N_actuals=96
    ForecastLength=20
    Xvars=['AR1', 'AR2', 'AR3', 'AR4', 'AR5', 'AR6', 'AR7', 'AR8', 'AR9']
    Differenced=0
    TestLength=20
    ValidationLength=20
    ValidationMetric=rmse
    ForecastsEvaluated=[]
    CILevel=0.95
    CurrentEstimator=None
    GridsFile=Grids
)

В этом случае он выбрал только 9 авторегрессионных терминов / задержек ряда. Он мог бы также выбрать трендовые и сезонные ковариаты, но алгоритм не думал, что это улучшит точность моделей. Ряд уже дифференцированный и сезонно скорректированный, так что это неудивительно. Теперь мы выбираем наши модели машинного обучения и оцениваем один прогноз с каждой из них:

models = (
    'mlr',
    'elasticnet',
    'ridge',
    'knn',
    'xgboost',
    'lightgbm',
    'gbt',
) # these are all scikit-learn models or APIs

tune_test_forecast(
    f,
    models,
    dynamic_testing = fcst_len,
)

Наконец, мы возвращаем прогнозы к исходному уровню ряда и отображаем результаты:

# revert differencing
f = transformer.DiffRevert(52)
f = transformer.DiffRevert(1)

fig, ax = plt.subplots(figsize=(12,6))
f.plot(ci=True,models='top_1',order_by='TestSetRMSE',ax=ax)
sns.lineplot(
    y = 'Total Volume',
    x = 'Date',
    data = volume_sep.reset_index(),
    ax = ax,
    label = 'held-out actuals',
    color = 'green',
    alpha = 0.7,
)
plt.show()

Как прогнозы, так и фактические данные наиболее эффективной модели KNN выглядят довольно хорошо. Однако одна модель в одной серии никогда не рассказывает всю историю. Давайте посмотрим на результаты всех примененных моделей для всех трех выбранных наборов данных.

Все результаты

Сравнение оценок MSIS по всем трем временным рядам показывает разброс оценок:

Что на самом деле означают эти цифры? Сложно сказать. MSIS — это не та метрика, которую многие привыкли использовать, поэтому эти оценки имеют смысл только при сравнении с более знакомыми подходами. Используя процесс автоматического ARIMA, мы теперь оцениваем более стандартные интервалы из пакета StatsModels — тип интервалов, которые имеют базовую функциональную форму и предполагаемое распределение. Мы также можем использовать те же модели ARIMA, но применить к ним конформный интервал, чтобы завершить наш тест. Окончательные результаты выглядят так:

Мы видим зеленым, где интервал масштабирования превзошел интервал StatsModel ARIMA, и красным в противном случае. Хорошая новость заключается в том, что мы видим много зеленого, что подтверждает наивный подход конформных интервалов. Однако не все так хорошо. Модели ARIMA, получившие конформный интервал, в целом показали себя не так хорошо, как тест. Кроме того, только три из семи моделей машинного обучения превзошли ARIMA в наборе данных «Запуски жилья». Все это заслуживает дальнейшего изучения, но, по крайней мере, мы можем быть довольны тем, что использование моделей машинного обучения в различных наборах данных с различиями и без них обычно работает лучше, чем более классический подход ARIMA.

Заключение

В этом посте рассматриваются конформные интервалы, применяемые с использованием пакета Scalecast. Интервальная оценка MSIS применялась к семи моделям машинного обучения в трех различных наборах данных, а затем сравнивалась с ARIMA. Мы увидели, что подход машинного обучения превзошел подход ARIMA в большинстве, но не во всех случаях. Благодарим за внимание и не забудьте поставить Scalecast звезду на GitHub!



Рекомендации

Тилманн Гнейтинг и Адриан Э. Рафтери (2007) Строго правильные правила подсчета очков, прогнозирование и оценка, Журнал Американской статистической ассоциации, 102:477, 359–378, DOI: 10.1198/016214506000001437

Makridakis, Spyros & Spiliotis, Evangelos & Assimakopoulos, Vassilios, 2020. «Конкурс M4: 100 000 временных рядов и 61 метод прогнозирования», International Journal of Forecasting, Elsevier, vol. 36(1), страницы 54–74.