Количественная оценка неопределенности

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

В стандартной конфигурации NeuralProphet предсказывается единственное значение для каждого отдельного случая. Результат предсказания представляет собой только точечную оценку, без учета неопределенностей. Вместо этого интервалы предсказаний обеспечивают более точную оценку, количественно оценивая неопределенность и возможный диапазон значений для каждого отдельного случая.

В этом сеансе мы познакомим вас с двумя статистическими методиками, доступными в NeuralProphet: (1) квантильной регрессией и (2) конформным прогнозированием. Эти две модули не являются взаимоисключающими, вы можете применять оба модуля поверх любых моделей.

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

Мы продемонстрируем и более подробно рассмотрим оба модуля количественной оценки, используя набор данных о потреблении электроэнергии больницей. В наборе данных записано потребление электроэнергии больницей в Сан-Франциско в 2015 году по часам.

# Установка neuralprophet из репозитория
if "google.colab" in str(get_ipython()):
    # удаление предустановленных пакетов из Colab, чтобы избежать конфликтов
    !pip uninstall -y torch notebook notebook_shim tensorflow tensorflow-datasets prophet torchaudio torchdata torchtext torchvision
    # установка neuralprophet из репозитория
    !pip install git+https://github.com/ourownstory/neural_prophet.git  # может занять некоторое время
import numpy as np
import pandas as pd
from neuralprophet import NeuralProphet, uncertainty_evaluate, set_log_level, set_random_seed

data_location = "http://raw.githubusercontent.com/ourownstory/neuralprophet-data/main/datasets/"
df = pd.read_csv(data_location + "energy/SF_hospital_load.csv")

Разделение данных

В NeuralProphet существует функция разделения данных, которая делит входной набор данных на два подмножества. Вы можете настроить эту функцию, указав частоты временных рядов и коэффициент разделения. Список псевдонимов частот можно найти здесь.

В нашем наборе данных о нагрузке на электросеть больницы мы разделим исходный набор данных на обучающую и тестовую выборки с соотношением обучения и тестирования 1/16.

# Создание объекта NeuralProphet
m = NeuralProphet()

# Функция разделения данных разбивает один временной ряд на два
# Настройте частоту почасовой выборки, назначив параметру freq значение 'H'
# Настройте коэффициент разделения с соотношением между 0 и 1 для параметра valid_p
train_df, test_df = m.split_df(df, freq="H", valid_p=1.0 / 16)
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.989% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column

После этого разделения мы получим 8213 и 547 экземпляров в качестве обучающего и тестового наборов соответственно.

train_df.shape, test_df.shape

1.Квантильная регрессия

По умолчанию прогнозирование с помощью NeuralProphet выдаёт только одно значение в качестве точечного прогноза для каждого случая. Это значение рассчитывается на основе регрессии 50-го процентиля. Чтобы сгенерировать интервал прогнозирования, объект NeuralProphet требует на вход список, содержащий как минимум пару нижнего и верхнего квантилей. Однако в модели NeuralProphet можно создать столько квантилей, сколько вы пожелаете.

На этот раз мы вернемся к прогнозированию нагрузки на электроснабжение нашей больницы. Предполагая, что мы хотим, чтобы истинное значение находилось в пределах интервала прогнозирования оценщика 90% времени (то есть уровень достоверности 90%), мы создаем модель квантильной регрессии, которая выводит значения 5-го, 50-го и 95-го процентилей соответственно.

# NeuralProphet принимает только значения квантилей от 0 до 1
# Параметр для квантильной регрессии
confidence_lv = 0.9
quantile_list = [round(((1 - confidence_lv) / 2), 2), round((confidence_lv + (1 - confidence_lv) / 2), 2)]

# Создание объекта NeuralProphet с указанием списка квантилей в качестве параметра
qr_model = NeuralProphet(quantiles=quantile_list)
qr_model.set_plotting_backend("plotly-static")

После добавления модуля квантильной регрессии в модель, NeuralProphet использует функцию потерь пинбола (квантильные потери) для оценки качества подгонки обученной модели. Это аналогично использованию функции потерь логарифмического правдоподобия для гауссовой линейной регрессии.

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

Давайте посмотрим, как отличается взвешивание между разными нижними квантилями (10-й против 25-го процентиля). Процентиль указывает вероятность того, что истинное значение окажется ниже оценочного значения. По сравнению с 25-м процентилем, у 10-го процентиля меньше ожидаемая вероятность того, что истинное значение окажется ниже линии. Когда фактическое значение оказывается вне интервала прогноза (т.е. фактическое значение меньше прогнозируемого), для 10-го процентиля такая ошибка более проблематична, поскольку он ожидает, что 90% истинных значений будут выше линии, в отличие от 75%, находящихся выше линии для 25-го процентиля.

# Обучение модели на наблюдениях
metrics = qr_model.fit(df, freq="H")

# Создание нового фрейма данных для результатов
# Включая 100 исторических значений и 30 точек значений для будущего
future = qr_model.make_future_dataframe(df, periods=30, n_historic_predictions=100)

# Прогнозирование с помощью обученных моделей
forecast = qr_model.predict(df=future)
WARNING - (NP.forecaster.fit) - When Global modeling with local normalization, metrics are displayed in normalized scale.
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.989% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.config.init_data_params) - Setting normalization to global as only one dataframe provided for training.
INFO - (NP.utils.set_auto_seasonalities) - Disabling yearly seasonality. Run NeuralProphet with yearly_seasonality=True to override this.
INFO - (NP.config.set_auto_batch_epoch) - Auto-set batch_size to 32
INFO - (NP.config.set_auto_batch_epoch) - Auto-set epochs to 106
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.989% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.231% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.231% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column

Прогноз потребления электроэнергии в больнице визуализирован ниже. yhat1 показывает прогноз, сделанный на 50-м процентиле, в то время как доверительный интервал обозначен светло-синим цветом. Нижняя граница - это результат прогноза на 10-м квантиле, в то время как верхняя граница - на 90

qr_model.plot(forecast)

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

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

Вы можете выбрать Наивный (или абсолютный остаток) или Конформационную Квантильную Регрессию (или CQR) для конформного прогнозирования в NeuralProphet. В следующем подразделе мы подробно обсудим эти два варианта.

Комплект для калибровки и проверки

Для использования функции конформного предсказания в NeuralProphet необходимо как минимум три подмножества (тестирование, калибровка и тестирование). Вы можете добавить подмножество для валидации в эту модель. Если вы решите добавить подмножество для валидации для обучения базовой модели, убедитесь, что период подмножества для валидации находится между подмножествами для обучения и калибровки. Здесь мы не будем подробно останавливаться на процедуре валидации, однако вы можете обратиться к учебному пособию Процедура обучения, валидации и тестирования, чтобы узнать, как построить модель NeuralProphet, используя набор данных для валидации.

В данном случае мы дополнительно разделяем калибровочный набор от обучающего набора с соотношением обучение-калибровка 1/11.

# Добавление калибровочного набора данных с использованием функции разделения данных
train_df, cal_df = m.split_df(train_df, freq="H", valid_p=1.0 / 11)
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.988% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column

После этого разделения мы получим 7467, 746 и 547 случаев соответственно для обучающего, калибровочного и тестового наборов.

train_df.shape, cal_df.shape, test_df.shape
((7467, 2), (746, 2), (547, 2))

Обучение базовой модели

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

Мы заинтересованы в изучении того, как конформный прогноз влияет на различные модели. Возвращаясь к нашему примеру, мы сравним результаты конформного прогнозирования между простой квантильной регрессией и сложной 4-слойной авторегрессионной моделью на нашем примере здесь. Вы можете обратиться к сессии квантильной регрессии выше и к материалам самостоятельного учебника по Авторегрессии для понимания логики и применения функций.

# Параметр для авторегрессии
# Прогнозирование значения в следующие часы на основе последних трех дней с шагом в один час
n_lags = 3 * 24
# Создание простой модели квантильной регрессии
cp_model1 = NeuralProphet(quantiles=quantile_list)
cp_model1.set_plotting_backend("plotly-static")

# Создание базовой модели авторегрессии с 4 слоями
cp_model2 = NeuralProphet(
    yearly_seasonality=False,
    weekly_seasonality=False,
    daily_seasonality=False,
    n_lags=n_lags,
    ar_layers=[32, 32, 32, 32],
    learning_rate=0.003,
    quantiles=quantile_list,
)
cp_model2.set_plotting_backend("plotly-static")

После завершения настройки модели, мы обучаем модель на тренировочном наборе данных. Если вы дополнительно разделили тренировочный набор данных на обучающий и валидационный, вы можете либо (i) объединить эти два набора в один для обучения, либо (ii) задать обучающий и валидационный наборы как два отдельных параметра.

# Подаем обучающий поднабор данных в настроенные модели NeuralProphet
# Настройте часовую частоту, назначив параметру freq значение 'H'
set_random_seed(0)
metrics1 = cp_model1.fit(train_df, freq="H")
set_random_seed(0)
metrics2 = cp_model2.fit(train_df, freq="H")
WARNING - (NP.forecaster.fit) - When Global modeling with local normalization, metrics are displayed in normalized scale.
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.987% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.config.init_data_params) - Setting normalization to global as only one dataframe provided for training.
INFO - (NP.utils.set_auto_seasonalities) - Disabling yearly seasonality. Run NeuralProphet with yearly_seasonality=True to override this.
INFO - (NP.config.set_auto_batch_epoch) - Auto-set batch_size to 32
INFO - (NP.config.set_auto_batch_epoch) - Auto-set epochs to 111
WARNING - (NP.config.set_lr_finder_args) - Learning rate finder: The number of batches (234) is too small than the required number                     for the learning rate finder (246). The results might not be optimal.
WARNING - (NP.forecaster.fit) - When Global modeling with local normalization, metrics are displayed in normalized scale.
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.987% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.config.init_data_params) - Setting normalization to global as only one dataframe provided for training.
INFO - (NP.config.set_auto_batch_epoch) - Auto-set batch_size to 32
INFO - (NP.config.set_auto_batch_epoch) - Auto-set epochs to 111

Мы используем подготовленную базовую модель для прогнозирования как точечного прогноза, так и интервалов прогнозирования регрессии квантилей для тестового набора данных.

# Выполните оценку для тестовых данных с обученной моделью
forecast1 = cp_model1.predict(test_df)[n_lags:]
forecast2 = cp_model2.predict(test_df)[n_lags:]
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.817% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.817% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.817% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.818% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column

Вариант 1: Наивное конформное предсказание

После обучения базовой модели мы затем проводим процесс калибровки с использованием модуля naive. Этапы описаны следующим образом:

i. предсказать выходное значение экземпляров в калибровочном наборе; ii. вычислить абсолютное отклонение, сравнив фактическое и предсказанное значение для каждого наблюдения в калибровочном наборе; iii. отсортировать все абсолютные отклонения по возрастающей; iv. найти квантифицированную неопределенность q с желаемым уровнем достоверности; v. использовать квантифицированную неопределенность q для создания итоговых интервалов прогнозирования.

Возвращаясь к нашему примеру, необходимо указать значение параметра для набора калибровки, уровень значимости (альфа) для конформной предсказательной модели на основе предварительно обученных моделей, упомянутых выше.

# Параметры для наивного конформального прогноза
method = "наивный"
alpha = 1 - confidence_lv

# Включить конформальный прогноз для предварительно обученных моделей
# Оценочный параметр необязателен, см. раздел "Оценка производительности" ниже
naive_forecast1 = cp_model1.conformal_predict(
    test_df,
    calibration_df=cal_df,
    alpha=alpha,
    method=method,
    plotting_backend="plotly-static",
    show_all_PI=True,
)
naive_forecast2 = cp_model2.conformal_predict(
    test_df,
    calibration_df=cal_df,
    alpha=alpha,
    method=method,
    plotting_backend="plotly-static",
    show_all_PI=True,
)
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.866% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.866% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.817% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.817% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column

Тип данных не может быть отображен: application/vnd.plotly.v1+json

INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.866% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.866% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.817% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.818% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column

Тип данных не может быть отображен: application/vnd.plotly.v1+json

На представленных выше графиках показано, как меняется количественно определенная неопределенность q при различных уровнях доверия

Ниже приведены значения q для каждой модели. Поскольку все они положительные, вы увидите, что наивный интервал превышает интервал простого QR. У более слабой модели большой разрыв между этими двумя интервалами, так как у нее большее значение q, в то время как границы для более сложной модели смещены гораздо меньше.

dsyyhat1yhat1 - qhat1yhat1 + qhat1trendseason_weeklyseason_dailyyhat1 5.0%yhat1 95.0%

0

2015-12-09 06:00:00

803.410865

988.585815

827.912791

1149.258840

1031.427246

-35.461987

-7.379447

909.404419

1087.498291

1

2015-12-09 07:00:00

868.264194

1089.076294

928.403269

1249.749319

1031.444336

-43.485428

101.117432

994.053711

1189.946045

2

2015-12-09 08:00:00

975.752982

1146.444092

985.771067

1307.117117

1031.461304

-51.675148

166.657928

1057.043823

1236.407227

3

2015-12-09 09:00:00

983.268943

1155.003296

994.330271

1315.676321

1031.478271

-59.986122

183.511185

1078.018799

1243.008301

4

2015-12-09 10:00:00

1095.825986

1145.466553

984.793528

1306.139578

1031.495239

-68.370621

182.341919

1073.590576

1236.537354

...

...

...

...

...

...

...

...

...

...

...

542

2015-12-31 20:00:00

845.563081

833.224609

672.551584

993.897634

1040.634766

-103.066475

-104.343666

757.201721

912.330200

543

2015-12-31 21:00:00

827.530521

795.515076

634.842051

956.188101

1040.651733

-94.571983

-150.564713

711.605408

872.624634

544

2015-12-31 22:00:00

829.256300

771.299255

610.626230

931.972280

1040.668701

-85.883865

-183.485596

677.626831

873.617920

545

2015-12-31 23:00:00

813.937205

762.211975

601.538950

922.885000

1040.685791

-77.059326

-201.414413

669.592285

869.896973

546

2016-01-01 00:00:00

815.588584

765.104858

604.431834

925.777883

1040.702759

-68.155449

-207.442413

675.509155

861.297852

547 rows × 10 columns

naive_qhat1 = naive_forecast1.iloc[-1]["yhat1"] - naive_forecast1.iloc[-1]["yhat1 - qhat1"]  # cp_model1
naive_qhat2 = naive_forecast2.iloc[-1]["yhat1"] - naive_forecast2.iloc[-1]["yhat1 - qhat1"]  # cp_model2
naive_qhat1, naive_qhat2
(160.67302487812503, 20.35876320312491)

Мы можем затем построить прогнозируемые интервалы (значения 5-го, 50-го и 95-го процентилей), чтобы сравнить производительность моделей. Интервалы прогнозирования квантильной регрессии обозначены синим цветом, в то время как интервалы конформного прогнозирования с включенной количественно определенной неопределенностью обозначены красным цветом.

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

# Диапазон дат, отображаемых на графиках (необязательно)
cutoff = 7 * 24

fig1 = cp_model1.highlight_nth_step_ahead_of_each_forecast(1).plot(
    naive_forecast1[-cutoff:], plotting_backend="plotly-static"
)
fig2 = cp_model2.highlight_nth_step_ahead_of_each_forecast(1).plot(
    naive_forecast2[-cutoff:], plotting_backend="plotly-static"
)
WARNING - (NP.forecaster.plot) - highlight_forecast_step_n is ignored since auto-regression not enabled.

Вариант 2: Конформализованная квантильная регрессия

В методе Конформационной Квантильной Регрессии, или модуле cqr, процесс следующий: i. рассчитать баллы несоответствия как разности между точками данных из калибровочного набора данных и их ближайшим прогнозным квантилем, что дает меру того, насколько хорошо данные соответствуют текущей модели квантильной регрессии. Баллы несоответствия отрицательные для точек данных внутри интервала квантильной регрессии и положительные, если они находятся за пределами интервала; ii. сортировать список баллов несоответствия; iii. найти значение q так, чтобы доля баллов в списке, превышающих q, была равна указанной ошибке; и iv. отрегулировать квантили из модели регрессии на величину q.

Есть два сценария того, что означает модель CQR, в зависимости от значения q. Если корректировка ширины одностороннего интервала прогнозирования положительная, то CQR выходит за пределы интервалов QR, поскольку считает интервал QR слишком уверенным. В противоположность этому, если корректировка ширины одностороннего интервала прогнозирования отрицательная, то CQR сокращает интервалы QR, поскольку считает интервал QR слишком

# Параметры для квантильной регрессии с конформализацией
method = "cqr"

# Включение конформального предсказания для предварительно обученных моделей
# Параметр evaluate необязателен, см. раздел "Оценка производительности" ниже
cqr_forecast1 = cp_model1.conformal_predict(
    test_df, calibration_df=cal_df, alpha=alpha, method=method, plotting_backend="plotly-static"
)
cqr_forecast2 = cp_model2.conformal_predict(
    test_df, calibration_df=cal_df, alpha=alpha, method=method, plotting_backend="plotly-static"
)
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.866% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.866% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.817% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.817% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column

Тип данных не может быть отображен: application/vnd.plotly.v1+json

INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.866% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.866% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.817% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.818% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils.return_df_in_original_format) - Returning df with no ID column

Тип данных не может быть отображен: application/vnd.plotly.v1+json

Ниже приведены значения q для каждой модели. Поскольку все они положительные, вы увидите, что интервал CQR расширяется за пределы простого QR. У cp_model1 большой разрыв между этими двумя интервалами, поскольку у неё большее значение q, в то время как границы сдвигаются гораздо меньше для cp_model2.

Мы снова строим интервалы прогнозирования, чтобы изучить, как метод CQR влияет на результат.

fig1 = cp_model1.highlight_nth_step_ahead_of_each_forecast(1).plot(
    cqr_forecast1[-cutoff:], plotting_backend="plotly-static"
)
fig2 = cp_model2.highlight_nth_step_ahead_of_each_forecast(1).plot(
    cqr_forecast2[-cutoff:], plotting_backend="plotly-static"
)
WARNING - (NP.forecaster.plot) - highlight_forecast_step_n is ignored since auto-regression not enabled.

Оцените производительность

Мы используем ширину интервала и коэффициент недопокрытия в качестве показателей эффективности:

  • interval_width: Средняя ширина прогнозируемого интервала, или q_hat, умноженная на 2, поскольку она статична или неадаптивна, также известна как показатель эффективности.

  • miscoverage_rate: Фактический коэффициент ошибки недопокрытия на тестовом наборе OOS, также известен как показатель

Чем меньше показатели, тем лучше работают модели.

Давайте протестируем с моделями, которые мы обучили выше. Сначала мы создадим датафрейм с двумя строками для двух моделей, которые мы обучили, а затем мы объединим показатели эффективности Naive и CQR в датафрейме для оценки.

# Создайте каркас датафрейма оценки с двумя моделями (обозначенными как m1 и m2)
models = ["m1", "m2"]
eval_df = pd.DataFrame(models, columns=pd.MultiIndex.from_tuples([("model", "", "")]))

В этой сессии мы агрегируем показатели эффективности для наивного алгоритма и помещаем их в структуру таблицы оценок. Расчет показателей производительности осуществляется при активации параметра evaluate в функции конформных предсказаний.

# Извлеките метрики производительности наивной модели из соответствующих наборов прогнозов
naive_eval1 = uncertainty_evaluate(naive_forecast1)
naive_eval2 = uncertainty_evaluate(naive_forecast2)

# Сагрегируйте метрики производительности наивной модели для m1 и m2
naive_evals = [naive_eval1, naive_eval2]
naive_eval_df = pd.concat(naive_evals).reset_index(drop=True)
# Извлеките метрики производительности модели CQR из соответствующих наборов прогнозов
cqr_eval1 = uncertainty_evaluate(cqr_forecast1)
cqr_eval2 = uncertainty_evaluate(cqr_forecast2)

# Сагрегируйте метрики производительности модели CQR для m1 и m2
cqr_evals = [cqr_eval1, cqr_eval2]
cqr_eval_df = pd.concat(cqr_evals).reset_index(drop=True)

В заключение мы объединяем датафреймы оценки наивного и cqr подходов, а затем сравниваем, как модели работают с наивными прогнозами и прогнозами cqr.

# Объедините фреймы данных оценки для методов Naive и CQR
eval_df = pd.concat([naive_eval_df, cqr_eval_df], axis=1, keys=["naive", "cqr"])
eval_df
naivecqr

yhat1

yhat1

interval_width

miscoverage_rate

interval_width

miscoverage_rate

0

321.346050

0.107861

309.400519

0.107861

1

40.717526

0.065263

41.712111

0.063158

Производительность обученной модели выше:

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

  • По всем трем методам предсказания неопределенности, более сложная модель авторегрессии (m2) имеет меньшую ширину интервала и процент непокрытия по сравнению с более простой моделью (m1). Таким образом, мы можем сделать вывод, что чем сложнее модель, тем лучше она адаптируется к данным и тем точнее делает предсказания

  • Методы конформных предсказаний Наивный и CQR значительно превосходят метод QR по показателю miscoverage_rate, что свидетельствует о том, что метод QR излишне уверен в своем диапазоне квантилей. Ширина интервала должна быть увеличена для того, чтобы фактический показатель miscoverage_rate (на тестовой выборке вне выборки) совпал со специфицированным значением alpha равным 0.1.

  • interval_width удваивает количественно определенные неопределенности (qhat1) для Наивных конформных предсказаний, таким образом, вы увидите симметричные интервалы предсказаний.

  • При рассмотрении только простой модели квантильной регрессии (m1), CQR предпочтительнее. Хотя miscoverage_rate у неё такой же, как и у Naive, она всё же имеет более узкий interval_width прогнозируемого интервала.

  • Для сложной модели (m2), Наивный метод показывает немного лучшую ширину интервала, но CQR обеспечивает немного лучший процент непокрытия. Возможно, будет полезно подать модели больше данных, чтобы определить, какой метод предпочтительнее.

Last updated