Анализ временных рядов включает методы анализа данных временных рядов для извлечения значимой статистики и других характеристик данных. Прогнозирование временных рядов – это использование модели для прогнозирования будущих значений .
В этой статье мы собираемся обсудить результаты и теорию, лежащую в их основе, на основе набора данных «Предсказать будущие продажи».
Примечание: чтобы узнать все детали и подробную теорию, пожалуйста, ознакомьтесь с этим руководством.
«Введение в анализ и прогнозирование временных рядов — I
Анализ временных рядов включает в себя методы анализа данных временных рядов для извлечения значимой статистики и…mathematicacity.co. в"
Набор данных Описание:
у нас есть:
- date — каждая дата продажи товара
- date_block_num — это число, присваиваемое каждому месяцу
- shop_id — уникальный номер каждого магазина
- item_id — уникальный номер каждого товара
- item_price — цена каждого товара
- 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)
мы берем общее количество товаров, проданных в конкретном месяце (мы можем взять среднее значение вместо суммы. Я пробовал оба, но среднее не может дать хороший результат).
Примечание. При построении данных появляются некоторые различимые закономерности. Временной ряд имеет сезонный характер. Также, кажется, есть тенденция: кажется, что она идет немного вверх, а затем вниз. Другими словами, во временном ряду есть тренды и сезонные компоненты.
Удаление тренда:
Один из способов подумать о сезонных компонентах временного ряда ваших данных — удалить тренд из временного ряда. Так что вы можете легко исследовать сезонность.
Метод удаления тренда:
- Чтобы удалить тренд, вы можете вычесть скользящее среднее из исходного сигнала. Однако это будет зависеть от того, сколько точек данных вы усреднили.
- Еще один способ удалить тренд — это метод разности, когда вы смотрите на разницу между последовательными точками данных.
Прогнозирование временных рядов с помощью 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
- Забыть ворота
- Входные ворота
- Выходные ворота
наш подход:
Нашими функциями будет количество товаров, проданных в магазине за месяц, за исключением данных за последний месяц, потому что это будут наши метки, которые мы помогаем нашей модели научиться предсказывать следующую последовательность. И для тестирования будет использоваться количество товаров, проданных в магазине за месяц, за исключением первого месяца, так как этот параметр наших данных остается прежним. Наша модель будет предсказывать следующую последовательность, и это будут наши результаты.
подготовка набора данных:
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 и подготовке данных, а также обо всех теориях, стоящих за этим, перейдите по следующей ссылке.
Спасибо!!!