Академический Документы
Профессиональный Документы
Культура Документы
2
СОДЕРЖАНИЕ
Введение ................................................................................................................... 4
1 Постановка задачи................................................................................................ 5
2 Подготовка данных .............................................................................................. 6
3 Анализ моделей и библиотек для прогнозирования ........................................ 9
3.1 Метрики для оценки ................................................................................... 9
3.2 ARIMA ......................................................................................................... 9
3.3 LSTM .......................................................................................................... 11
3.4 Prophet ........................................................................................................ 14
3.5 Sktime ......................................................................................................... 15
4 Сравнение алгоритмов ....................................................................................... 18
Заключение ............................................................................................................ 23
Список использованных источников ................................................................. 24
Приложение А ....................................................................................................... 26
3
ВВЕДЕНИЕ
Данный отчет посвящен разбору методов машинного обучения для
прогнозирования основе временных рядов. Вспомним определение:
временной ряд — это последовательность упорядоченных во времени
числовых показателей, характеризующих уровень состояния и изменения
изучаемого явления. Временные ряды отлично подходят для предсказания
грядущего поведения исследуемой области на изменение своих атрибутов
(показателей).
В нашем случае требуется построить формализованный, то есть
основанный на построении модели прогнозирования, метод, который
применяется в случае невозможности применения человеком аналитического
подхода для определения влияния внешних факторов на объект изучения.
Сама реализация метода будет осуществляться на языке
программирования Python, но так как этот язык богат разными библиотеками,
направленных на решение самых различных задач, в том числе и на создание
нейронных сетей для предсказания чего-либо, нам не требуется искать именно
ту, которая работает конкретно с временными рядами, ведь логика работы у
всех похожая.
В данной работе будут рассмотрены наиболее подходящие алгоритмы
для прогнозирования временных рядов. А также будет рассмотрен краткий
процесс подготовки, разделения и оптимизации датасета для дальнейшей
работы с ним [1].
4
1 Постановка задачи
Изменяющиеся во времени объединение значений {𝑥1 , 𝑥2 , … , 𝑥𝑛 },
представляющие собой величины каких-либо атрибутов, принято называть
временным рядом. При этом, каждый отрезок времени относится к каждому
из множества значений атрибута. Целью прогнозирования является выявление
закономерности, с помощью которой можно будет определять значение 𝑥 в
момент времени 𝑡𝑛+1 , 𝑡𝑛+2 и т.д [2].
5
2 Подготовка данных
6
Визуальный пример среднего, медианы и моды относительно набора значений
можно увидеть на Рисунке 1.
Среднее значение полезно тем, что помогает устранить множество
ошибок. Бывают ситуации, когда некоторые параметры датасета явно сильно
отличаются от всевозможных значений. Например, цена в один день цена на
биткоин поднялась не на 1-5%, а на 105 %, а потом обратно снизилась до
нормальных значений. Такого же в принципе быть не может… Подобные
случаи называют выбросами, и они сильно влияют на работу алгоритма.
Чтобы избежать дальнейшей ошибки, выбросы выявляются и заменяются на
среднее. То же самое можно сделать с пробелами – атрибуты, хранящие
значение Null – пустое значение.
Это лишь несколько основных шажков, требуемых для получения
качественного датасета. Еще данные можно разбивать на отрезки,
комбинировать атрибуты, добавлять новые секции, классифицировать и т.д.
8
3 Анализ моделей и библиотек для прогнозирования
3.1 ARIMA
Модель ARIMA – интегрированная модель авторегрессии скользящим
средним – является моделью и методологией временных рядов. Это дочерняя
версия моделей ARMA, предназначенных для интегрированных или
разностностационарных рядов. Данная модель имеет следующий вид в виде
ряда:
𝑝 𝑞
Δ𝑑 𝑋𝑡 = 𝑐 + ∑ 𝑎𝑖 Δ𝑑 𝑋𝑡−𝑖 + ∑ 𝑏𝑗 εt−j + 𝜀𝑡 ,
𝑖=1 𝑗=1
9
Далее при запуске мы получаем сводную информацию о модели. Во-
первых, можно вывести график остаточных ошибок, с помощью которого
можно попробовать выявить информацию о тренде, ведь модель могла ее не
заметить. Далее, можно вывести еще один график плотности значений
остаточных ошибок, обычно центрированных на нуле.
Теперь с помощью метода arimaresoults() мы можем получить
прогнозируемые данные, указав индекс требуемого временного шага в качетве
аргумента. То есть, если последний временной шаг имеет индекс 100, то мы
можем получить значение при индексе временного шага, равного 101 или
102… Так же можно использовать упрощенную функцию predict() для
одношагового прогнозирования.
В результате мы можем получить набор прогнозов из k нужных шагов и
сравнить их с test data с помощью графического моделирования. Пример
такого сравнения представлен на Рисунке 3 [5].
10
3.2 LSTM
Иной способ, с помощью которого можно прогнозировать временные
ряды – модель LSTM (долгая краткосрочная память). Данная модель была
впервые представлена в 1997 году Зеппом Хохрайтер и Юргеном
Шмидхубером.
Модель LSTM имеет структуру цепочки и в каждом звене хранит по 4
слоя функции активации, как показано на Рисунке 4. Такая структура очень
схожа со структурой модели рекуррентной нейронной сети (RNN), но
последняя имеет всего один слой функции активации.
12
Теперь осталось только преобразовать состояние ячейи в новое значение
𝑓𝑡 [6]:
𝑜𝑡 = (𝑊𝑜 ∙ [ℎ𝑡−1 , 𝑥𝑡 ] + 𝑏𝑜 )
𝑓𝑡 = 𝑜𝑡 ∙ tanh(𝐶𝑡 )
Покажем, как модель LSTM должна быть реализована на языке Python.
Создадим класс, например, LSTM, наследуемый от класса “nn.Module”,
импортируемый из библиотеки PyTorch.
В классе LSTM нужно определить несколько параметров:
• input_size – длина массива входных данных;
• hidden_layer_size – хранит в себе количество скрытых слоев (hidden
layers) и количество нейронов для каждого слоя;
• output_size – количество элементов на выходе, то есть количество
предсказанных значений.
Алгоритм принимает на вход 3 параметра – предыдущее скрытое
состояние, предыдущее состояние ячейки и текущий вход. Реализация первого
шага продемонстрирована на Рисунке 6.
13
Рисунок 7 – функции потерь и оптимизатора
И в финале собираем блок для тренировки модели. Обязательно нужно
обозначить количество эпох, то есть, сколько раз мы хотим повторить процесс
обучения. Тут тоже надо подходить с умом: если взять достаточно мало эпох,
то модель не сможет обучиться достаточно хорошо и результаты будут
недостаточно точными. Если взять слишком много эпох – произойдет
переобучение. Ни один из этих двух исходов нам не подходит… Чтобы понять,
какое количество эпох следует взять, мы и объявили функцию потерь [7].
14
Данная модель оценивает параметры с помощью принципов
байесовской статистики (или путем нахождения апостериорного максимума),
применяя платформу вероятностного программирования Stan. Время
выступает в качестве регрессора и способствует модели связать между собой
линейные и нелинейные функции в качестве компонентов. По технике Холт-
Винтерса, пророк моделирует сезонность как аддитивную компоненту и
составляет задачу прогнозирования не явно “всматриваясь” в каждую
временную зависимость, в как таску по подгонке кривой.
Модель имеет слабость к оснащенности или к приспособленности по
работе с компонентом тренда, но это можно компенсировать увеличением
точек изменения, встроенных в нее.
Ее сезонные компоненты аппроксимируются следующим образом:
𝑁
2𝜋𝑛𝑡 2𝜋𝑛𝑡
𝑠(𝑡) = ∑(𝑎𝑛 𝑐𝑜𝑠 ( ) + 𝑏𝑛 𝑠𝑖𝑛 ( )),
𝑃 𝑃
𝑛=1
15
Специально для временных рядов у Scikit-learn есть расширение API –
Sktime, которая пользуется алгоритмами, прописанными в Scikit-learn и
тулами совместного использования моделей, основанных на строгой
таксономией задачах обучения. Sktime предоставляет метод fit для тренировки
модели и метода predict для составления будущих прогнозов. Метод transform
преобразовывает данные разными способами:
• изменение таблиц методом главных компонент,
функционирующие с вариациями случайных величин;
• переработка рядов в примитивы, то есть данный просто
переводятся в числовой формат;
• ряды к рядам, например, преобразование Фурье;
• детрендинг – возвращают временной ряд в том же домене, что и
входной ряд.
Перед началом работы с Sktime, следует импортировать несколько
функций, которые смогут быстро разделить датасет на тестовый и
тренировочный, а также построит наглядный график. Демонстрация и работа
кода представлены на Рисунках 9 и 10 соответственно.
16
Далее, чтобы произвести прогнозирование Sktime подключает свой
метод AutoARIMA – он проводит множество дифференциальных тестов для
определения порядка дифференцирования, а потом подбирает модель в
пределах фиксированных диапазонов. Для выбора наиболее подходящей
модели метод оптимизирует заданный информационный критерий (например,
информационный критерий Akaike, скорректированный информационный
критерий Akaike, Байесовский информационный критерий, информационный
критерий Ханнана-Куинна) и возвращает условие, минимизирующее
значение. Важно знать, что есть вероятность, что AutoARIMA может не найти
подходящую сходящуюся модель из-за проблем со стационарностью. В таком
случае, придется исправлять все вручную.
Запишем код и сравним прогнозы метода AutoARIMA с ранее
выведенным тестовым набором – Рисунки 11 и 12 [9].
17
4 Сравнение алгоритмов
Для того, чтобы понять, насколько хорошо работает ваша модель
принято использовать специальные оценки эффективности.
Часто бывает трудно определить, какие показатели наиболее подходят
для оценки алгоритмов из-за больших отклонений, которые часто возникают
между прогнозируемым и фактическим значением или иным образом. Оценка
производительности алгоритмов машинного обучения оценивается на основе
точности прогнозирования, которая часто неуместна в случае
несбалансированных данных, а затраты на ошибки значительно различаются.
Наиболее популярные метрики:
Средняя ошибка (ME) – показывает среднее значение разницы между
фактическими и прогнозируемыми значениями.
Средняя процентная ошибка (MPE) – показывает среднее значение
процентной разницы между фактическими и прогнозируемыми значениями. И
ME, и MPE помогут указать, являются ли прогнозы предвзятыми, чтобы быть
непропорционально положительными или отрицательными.
Среднеквадратичная ошибка (RMSE) – стандартное отклонение
выборки различий между прогнозируемыми значениями и наблюдаемыми
значениями. Это отличное измерение для сравнения моделей, поскольку оно
показывает, сколько отклонений от среднего прогнозируемые значения
падают.
Средняя абсолютная процентная ошибка (MAPE) –часто полезна для
целей отчетности, поскольку она выражается в общих процентах, это будет
иметь смысл даже для тех, кто понятия не имеет, что представляет собой
“большая” ошибка с точки зрения потраченных долларов или проданных
виджетов.
Accuracy – сравнивает, насколько близко новое тестовое значение к
предсказанному и вычисляется по следующей формуле:
18
𝑇𝑃 + 𝑇𝑁
𝐴𝑐𝑐𝑢𝑟𝑎𝑐𝑦 = ∙ 100%,
𝑇𝑃 + 𝑇𝑁 + 𝐹𝑃 + 𝐹𝑁
где 𝑇𝑃 – true positive, 𝑇𝑁– true negative, 𝐹𝑃– false positive, 𝐹𝑁 – false negative
error rates.
Recall– измеряет способность теста быть положительным, когда условие
действительно присутствует.
𝑇𝑃
𝑅𝑒𝑐𝑎𝑙𝑙 = ∙ 100%
𝑇𝑃 + 𝐹𝑁
Precision – измеряет способность теста быть отрицательным, когда
условие действительно присутствует.
𝑇𝑁
𝑃𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 = ∙ 100%
𝑇𝑁 + 𝐹𝑃
В разных статьях используют разные метрики, поэтому будем для
сравнения вышеупомянутых алгоритмов будем опираться на них [10].
В результате поиска мы обозначили 4 модели, которые имеют свои
преимущества и недостатки. Так как все эти модели имеют некую схожесть,
имея нужные метрики, давайте сравним их и выявим самую наиболее
подходящую нам и в следующем семестре будем строить программную
реализацию на ее основе.
Так как у нас еще нет готового датасета и кода, будем производить
сравнения из ранее написанных статей и блогов (GitHub, Kaggle, Habr).
В одной из работ сравниваются алгоритмы ARIMA и LSTM для
предсказания различных трендов. Ниже на Рисунке 13 приведен код
реализации модели ARIMA.
19
Для модели LSTM код тот же, за исключением последней строчки –
вместо arima_model сделали lstm_model. Для сравнения моделей посмотрим на
графики Рисунков 14 и 15, и на полученные метрики:
20
Модели Accuracy Precision Recall
LSTM 99.72 1 1
21
После прогноза модели получили следующие показатели,
продемонстрированные на Рисунке 17.
22
ЗАКЛЮЧЕНИЕ
В ходе данной работы мы познакомились с несколькими моделями и
библиотеками, нацеленных на прогнозирование временных рядов, разобрали
их основные методы и шаги реализации, провели несколько программных
реализаций для наглядных примеров, вывели наиболее оптимальную модель
из этого набора. Так же была частично затронута тема конфигурации и
обработки датасета. В следующей работе мы начнем программную
реализацию нашего алгоритма по следующему плану:
1. Первым делом – сбор данных. В случае прогнозирования
временных рядов за данными можно обратиться к платформе Kaggle, так как
она является одной из самых популярных платформ для проведения
соревнований на тему Machine Learning.
2. Далее, как было упомянуто в разделе 2 – наш датасет подвергнется
обработке дабы избежать проблем с обучением. В Приложении А хранится
упрощенный блок кода для оптимизации датасета.
3. Создание самой модели.
4. Обучение модели. Для этого следует подключит несколько
функций, например, функцию потерь, оптимизации. Так же передаем массив
с данными, количество эпох обучения, данные для валидационной метрики –
с ее помощью мы поймем насколько хорошо обучается наша модель.
5. Возможно придется подключить метод регуляризации – он
понадобится в случае переобучения модели.
6. Проведение анализа полученных прогнозов и составление
итогового вывода.
23
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
25
ПРИЛОЖЕНИЕ А
Подготовка датасета
import pandas as pd
path=" "
df = pd.read_csv(path)
df = pd.read_csv(path,header=None)
df.to_excel(path)
df.dropna()
mean=df["attribute name"].mean()
df["attribute name"].replace(np.nan,mean)
pandas.get_dummies(df["attribute-name"])
bin = np.linspace(min(df["attribute-name"]),max(df["attribute-name"]),4)
cat_names=["low-price","mid-price","high-price"]
df["bin_name"]=pd.cut(df["attribute-name"],bin,labels=cat_names)
df_g
pearson_coef,p_value=stats.pearsonr(df["attribute1"],df["attribute2"])
scipy.stats.chi2_contingency(cont_table, correction=True)
26