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

В этой статье мы собираемся обсудить результаты и теорию, лежащую в их основе, на основе набора данных «Предсказать будущие продажи».

Примечание: чтобы узнать все детали и подробную теорию, пожалуйста, ознакомьтесь с этим руководством.



«Введение в анализ и прогнозирование временных рядов — I
Анализ временных рядов включает в себя методы анализа данных временных рядов для извлечения значимой статистики и…mathematicacity.co. в"



Набор данных Описание:

у нас есть:

  1. date — каждая дата продажи товара
  2. date_block_num — это число, присваиваемое каждому месяцу
  3. shop_id — уникальный номер каждого магазина
  4. item_id — уникальный номер каждого товара
  5. item_price — цена каждого товара
  6. item_cnt_day — количество товаров, проданных в определенный день

Пакеты, которые нам нужны:

import warnings
import itertools
import numpy as np
import matplotlib.pyplot as plt
warnings.filterwarnings("ignore")
plt.style.use('fivethirtyeight')
import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.arima_model import ARIMA
from pandas.plotting import autocorrelation_plot
from statsmodels.tsa.stattools import adfuller, acf, pacf,arma_order_select_ic
import matplotlibmatplotlib.rcParams['axes.labelsize'] = 14
matplotlib.rcParams['xtick.labelsize'] = 12
matplotlib.rcParams['ytick.labelsize'] = 12
matplotlib.rcParams['text.color'] = 'k'

прочитать данные:

df=pd.read_csv('sales_train.csv')
df.head()

Типы данных:

date               object
date_block_num      int64
shop_id             int64
item_id             int64
item_price        float64
item_cnt_day      float64
dtype: object

Теперь нам нужно преобразовать объект «дата» в строку (ГГГГ-ММ-ДД)

import datetime
df['date']=pd.to_datetime(df.date)

Визуализация данных временного ряда:

ts=df.groupby(["date_block_num"])["item_cnt_day"].sum()
ts.astype('float')
plt.figure(figsize=(16,8))
plt.title('Total Sales of the company')
plt.xlabel('Time')
plt.ylabel('Sales')
plt.plot(ts)

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

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

Удаление тренда:

Один из способов подумать о сезонных компонентах временного ряда ваших данных — удалить тренд из временного ряда. Так что вы можете легко исследовать сезонность.

Метод удаления тренда:

  1. Чтобы удалить тренд, вы можете вычесть скользящее среднее из исходного сигнала. Однако это будет зависеть от того, сколько точек данных вы усреднили.
  2. Еще один способ удалить тренд — это метод разности, когда вы смотрите на разницу между последовательными точками данных.

Прогнозирование временных рядов с помощью ARIMA

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

Модели ARIMA обозначаются обозначением ARIMA(p, d, q). Эти три параметра учитывают сезонность, тенденцию и шум в данных.

model = ARIMA(ts['count'].values, order=(1, 1, 1))
fit_model = model.fit(trend='c', full_output=True, disp=True)
fit_model.summary()

АИК: 743,512

давайте построим это:

Я доволен этими результатами.

Прогнозирование временных рядов с PROPHET

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

результаты с использованием пророка:

Здесь мы видим, что количество продаж колеблется.

Результаты с LSTM:

Архитектура LSTM

  1. Забыть ворота
  2. Входные ворота
  3. Выходные ворота

наш подход:

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

подготовка набора данных:

X_train = np.expand_dims(dataset.values[:,:-1],axis = 2)
# the last column is our label
y_train = dataset.values[:,-1:]
# for test we keep all the columns execpt the first one
X_test = np.expand_dims(dataset.values[:,1:],axis = 2)
# lets have a look on the shape 
print(X_train.shape,y_train.shape,X_test.shape)
>(424124, 33, 1) (424124, 1) (424124, 33, 1)
y_test=dataset.values[:,:1]
print(y_test.shape)

затем давайте перейдем к разделу построения модели:

from keras.models import Sequential
from keras.layers import LSTM,Dense,Dropout
my_model = Sequential()
my_model.add(LSTM(units = 64,input_shape = (33,1)))
my_model.add(Dropout(0.4))
my_model.add(Dense(1))
my_model.compile(loss = 'mse',optimizer = 'adam', metrics = ['mean_squared_error'])
my_model.summary()

затем подгоните модель:

history=my_model.fit(X_train,y_train,batch_size = 4096,epochs = 10)

Теперь давайте рассчитаем значение RMSE:

from sklearn.metrics import mean_squared_error
from numpy import sqrt
rmse = sqrt(mean_squared_error(y_test,y_pred))
print('Val RMSE: %.3f' % rmse)

Вал Среднеквадратичное отклонение: 1,595

Примечание: RMSE представляет собой квадратный корень из дисперсии остатков. Он указывает на абсолютное соответствие модели данным — насколько близки наблюдаемые точки данных к прогнозируемым значениям модели.

то есть более низкие значения RMSE указывают на лучшее соответствие.

Это хороший результат. Правильно!!!!!

пожалуйста, дайте нам свои мысли и ваши результаты в разделе комментариев.

Если вы хотите узнать о PROPHET, LSTM и подготовке данных, а также обо всех теориях, стоящих за этим, перейдите по следующей ссылке.



Спасибо!!!