0

Нейронные сети для прогнозирования

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

Обратите внимание, что это образовательное руководство предназначено для практики построения модели LSTM с использованием PyTorch и не предназначено для предоставления экспертного мнения о прогнозировании подтвержденных случаев.

Обзор учебника:

Используемый набор данных:

  • Набор данных JHU CSSE COVID-19 (Источник: Github)
  • Набор данных Novel Corona Virus 2019 (Источник: Kaggle)

Среда разработки и тестирования : Google Colaboratory

Структуры моделей нейронной сети: LSTM, CNN-LSTM

Оглавление:

  1. о временных рядах
  2. исследование данных
  3. предварительная обработка данных
  4. ЛСТМ
  5. CNN-LSTM
  6. использованная литература

Обратная связь всегда приветствуется, и вы можете оставить комментарий на каждой странице.

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

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

В этом руководстве мы построим модель, которая прогнозирует будущие подтвержденные случаи на основе данных о прошлых случаях, используя данные о случаях коронавируса, предоставленные Центром системных наук и инженерии Университета Джона Хопкинса. В главе 1 мы рассмотрим структуры нейронных сетей, которые можно использовать при построении модели прогнозирования временных рядов, и проверим индикаторы оценки, которые можно использовать при оценке производительности модели. В главе 2 мы углубим наше понимание данных о вирусе короны с помощью исследовательского анализа данных, а в главе 3 мы увидим, как преобразовать данные временных рядов в формат данных для контролируемого обучения. В главах 4 и 5 мы будем использовать модель глубокого обучения для прогнозирования будущих подтвержденных случаев соответственно.

1.1 Доступные структуры глубокого обучения

1.1.1 CNN

Пример приложения CNN

Рисунок 1-1 Пример приложения CNN (Источник: Lim et al. 2020. Прогнозирование временных рядов с помощью глубокого обучения: опрос)

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

1.1.2 RNN

Пример применения RNN

Рисунок 1-2 Пример применения RNN (Источник: Lim et al. 2020. Прогнозирование временных рядов с помощью глубокого обучения: опрос)

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

1.1.3 Механизм внимания

Пример применения механизма внимания

Рисунок 1-3 Пример применения механизма внимания (Источник: Lim et al. 2020. Прогнозирование временных рядов с помощью глубокого обучения: опрос)

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

1.2 Индикатор оценки

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

yi: фактическое значение, которое будет предсказано
y^i: значение, предсказанное моделью
n: размер тестового набора данных

В разделах с 1.2.1 по 1.2.4 используются приведенные выше символы, а в разделе 1.2.5 определения символов отличаются, так что имейте это в виду.

1.2.1 MAE (средняя абсолютная ошибка)

MAE, также называемый потерей L1, можно получить, взяв абсолютное значение разницы между прогнозируемым значением и фактическим значением, сложив их все вместе и разделив на рассчитанное количество выборок (n). Сложение и деление на количество выборок означает нахождение среднего, поэтому мы будем использовать выражение «усреднение» для индексов оценки, которые выйдут в дальнейшем. Поскольку масштаб MAE совпадает с масштабом прогнозируемой целевой переменной, полезно интуитивно понимать значение значения. Если реализовать в коде, это выглядит так:

import numpy as np #넘파이 패키지 불러오기

def MAE(true, pred):
    '''
    true: np.array 
    pred: np.array
    '''
    return np.mean(np.abs(true-pred))

TRUE = np.array([10, 20, 30, 40, 50])
PRED = np.array([30, 40, 50, 60, 70])

MAE(TRUE, PRED)
20.0

1.2.2 MSE (Mean Squared Error)

MSE, также называемая потерями L2, рассчитывается путем возведения в квадрат разницы между прогнозируемым значением и фактическим значением, а затем усредняется. По мере дальнейшего отклонения прогнозируемого значения от фактического значения значение MSE имеет тенденцию к экспоненциальному увеличению. Поскольку вычисленное значение возводится в квадрат, масштабы целевой переменной и значения различаются. Чтобы масштаб соответствовал целевой переменной, можно поставить корень на значение MSE, и это значение называется RMSE. Если реализовать в коде, это выглядит так:

def MSE(true, pred):
    '''
    true: np.array 
    pred: np.array
    '''
    return np.mean(np.square(true-pred))

TRUE = np.array([10, 20, 30, 40, 50])
PRED = np.array([30, 40, 50, 60, 70])

MSE(TRUE, PRED)
400.0

1.2.3 MAPE (Mean Absolute Percentage Error)

(Источник: https://en.wikipedia.org/wiki/Mean_absolute_percentage_error)

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

Однако если в фактическом значении существует 0, возникает проблема, связанная с тем, что MAPE не определен. Кроме того, даже если абсолютное значение имеет ту же ошибку, существует проблема, заключающаяся в том, что завышенное прогнозируемое значение наказывается в соответствии с отношением величины между фактическим значением и прогнозируемым значением (Макридакис, 1993). Давайте проверим это с помощью кода ниже.

def MAPE(true, pred):
    '''
    true: np.array 
    pred: np.array
    '''
    return np.mean(np.abs((true-pred)/true))

TRUE_UNDER = np.array([10, 20, 30, 40, 50])
PRED_OVER = np.array([30, 40, 50, 60, 70])
TRUE_OVER = np.array([30, 40, 50, 60, 70])
PRED_UNDER = np.array([10, 20, 30, 40, 50])


print('Сравнение MAE и MAPE по соотношению между фактическим значением и прогнозируемым значением при средней ошибке 20 \n')

print('Когда фактическое значение меньше прогнозируемого (прогнозируемое значение завышено)')
print('MAE:', MAE(TRUE_UNDER, PRED_OVER))
print('MAPE:', MAPE(TRUE_UNDER, PRED_OVER))


print('\nКогда фактическое значение больше прогнозируемого (прогнозируемое значение занижено)')
print('MAE:', MAE(TRUE_OVER, PRED_UNDER))
print('MAPE:', MAPE(TRUE_OVER, PRED_UNDER))
Сравнение MAE и MAPE по соотношению между фактическим значением и прогнозируемым значением при средней ошибке 20

Когда фактическое значение меньше прогнозируемого (прогнозируемое значение завышено)
MAE: 20.0
MAPE: 0.9133333333333333

Когда фактическое значение больше прогнозируемого (прогнозируемое значение занижено)
MAE: 20.0
MAPE: 0.4371428571428571

MAPE использует метод деления на фактическое значение y, чтобы преобразовать его в проценты из-за характера арифметики. Следовательно, производное значение имеет характеристику, зависящую от y. Даже если числители одинаковы, чем меньше знаменатель, тем больше ошибка.

В приведенном выше коде это подтверждалось тем, что фактические значения были меньше прогнозируемых значений на 20 (TRUE_UNDER, PRED_OVER) и на 20 больше прогнозируемых значений (TRUE_OVER, PRED_UNDER). Значение MAE равно 20 как для TRUE_UNDER, так и для PRED_OVER, а также для TRUE_OVER и PRED_UNDER. Однако MAPE дает 0,913, когда фактическое значение равно TRUE_UNDER, и 0,437, когда фактическое значение равно TRUE_OVER.

1.2.4 SMAPE (Symmetric Mean Absolute Percentage Error)

(Источник: https://en.wikipedia.org/wiki/Symmetric_mean_absolute_percentage_error)

SMAPE был разработан, чтобы компенсировать ограничения MAPE в вышеупомянутых примерах (Макридакис, 1993). Давайте проверим это с помощью кода ниже.

def SMAPE(true, pred):
    '''
    true: np.array 
    pred: np.array
    '''
    return np.mean((np.abs(true-pred))/(np.abs(true) + np.abs(pred))) #100 — константа, поэтому она исключена из этого кода.

print('Сравнение MAE и SMAPE по соотношению между фактическим значением и прогнозируемым значением при средней ошибке 20 \n')

print('Когда фактическое значение меньше прогнозируемого (прогнозируемое значение завышено)')
print('MAE:', MAE(TRUE_UNDER, PRED_OVER))
print('SMAPE:', SMAPE(TRUE_UNDER, PRED_OVER))


print('\nКогда фактическое значение больше прогнозируемого (прогнозируемое значение занижено)')
print('MAE:', MAE(TRUE_OVER, PRED_UNDER))
print('SMAPE:', SMAPE(TRUE_OVER, PRED_UNDER))
Сравнение MAE и SMAPE по соотношению между фактическим значением и прогнозируемым значением при средней ошибке 20

Когда фактическое значение меньше прогнозируемого (прогнозируемое значение завышено)
MAE: 20.0
SMAPE: 0.29

Когда фактическое значение больше прогнозируемого (прогнозируемое значение занижено)
MAE: 20.0
SMAPE: 0.29

Видно, что MAPE дал разные значения 0,91 и 0,43, а SMAPE дал одинаковое значение 0,29. Однако у SMAPE есть характеристика, зависящая от y^i, поскольку прогнозируемое значение y^i включено в знаменатель. Когда прогноз занижен, знаменатель становится меньше, что приводит к большей ошибке в расчетах. Давайте проверим это с помощью кода ниже.

TRUE2 = np.array([40, 50, 60, 70, 80])
PRED2_UNDER = np.array([20, 30, 40, 50, 60])
PRED2_OVER = np.array([60, 70, 80, 90, 100])

print('Сравнение MAE и SMAPE по занижению и завышению при средней ошибке 20 \n')

print('переоценка')
print('MAE:', MAE(TRUE2, PRED2_OVER))
print('SMAPE:', SMAPE(TRUE2, PRED2_OVER))

print('\n과소추정 시')
print('MAE:', MAE(TRUE2, PRED2_UNDER))
print('SMAPE:', SMAPE(TRUE2, PRED2_UNDER))

Copy to clipboard

Сравнение MAE и SMAPE по занижению и завышению при средней ошибке 20

переоценка
MAE: 20.0
SMAPE: 0.14912698412698414

недооценка
MAE: 20.0
SMAPE: 0.21857142857142856

Хотя и PRED2_UNDER, и PRED2_OVER имеют ошибку TRUE2 и среднее значение 20, SMAPE вычисляет значение 0,218 для заниженного PRED2_UNDER, тогда как значение 0,149 для завышенного PRED2_OVER.

1.2.5 RMSSE (Root Mean Squared Scaled Error)

Начнем с определения символа формулы RMSSE. Каждый символ имеет следующее значение.

yi: фактическое значение, которое будет предсказано
y^i: значение, предсказанное моделью
n: размер обучающего набора данных
h: размер тестового набора данных

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

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

y^i=yi−1

Этот метод предсказывает прогнозируемое значение в момент времени i как фактическое значение в момент времени i-1. Поскольку оно делится на значение MSE метода наивного прогноза, значение RMSSE больше 1 означает, что прогноз хуже, чем метод наивного прогноза, а значение меньше 1 означает, что прогноз лучше, чем метод наивного прогноза. Давайте реализуем RMSSE с помощью приведенного ниже кода.

def RMSSE(true, pred, train): 
    '''
    true: np.array 
    pred: np.array
    train: np.array
    '''
    
    n = len(train)

    numerator = np.mean(np.sum(np.square(true - pred)))
    
    denominator = 1/(n-1)*np.sum(np.square((train[1:] - train[:-1])))
    
    msse = numerator/denominator
    
    return msse ** 0.5
TRAIN = np.array([10, 20, 30, 40, 50]) #RMSSE 계산을 위한 임의의 훈련 데이터셋 생성
print(RMSSE(TRUE_UNDER, PRED_OVER, TRAIN))
print(RMSSE(TRUE_OVER, PRED_UNDER, TRAIN))
print(RMSSE(TRUE2, PRED2_OVER, TRAIN))
print(RMSSE(TRUE2, PRED2_UNDER, TRAIN))
4.47213595499958
4.47213595499958
4.47213595499958
4.47213595499958

Видно, что штрафы одинаково применялись к четырем примерам, в которых абсолютное значение ошибки было одинаковым, но MAPE и SMAPE давали штраф неравномерно, а также выполнялось масштабирование.

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

Platon

Добавить комментарий