Python / Pandas - путаница в прогнозировании ARIMA для получения простых прогнозов - PullRequest
0 голосов
/ 28 ноября 2018

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

date           bookings
2017-01-01     438
2017-01-02     167
...
2017-12-31     45
2018-01-01     748
...
2018-11-29     223
2018-11-30     98
...
2018-12-30     73
2018-12-31     100

Где прогнозируется что-то большее, чем сегодня (28/11/18).

Что я пытался сделать:

Это дает мне мой набор данных, который в основном состоит из двух столбцов, данных за день за весь 2017 год и заказов:

import pandas as pd
import statsmodels.api as sm
# from statsmodels.tsa.arima_model import ARIMA
# from sklearn.metrics import mean_squared_error

import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
import matplotlib
matplotlib.rcParams['axes.labelsize'] = 14
matplotlib.rcParams['xtick.labelsize'] = 12
matplotlib.rcParams['ytick.labelsize'] = 12
matplotlib.rcParams['text.color'] = 'k'

df = pd.read_csv('data.csv',names = ["date","bookings"],index_col=0)
df.index = pd.to_datetime(df.index)

Это бит "моделирования":

X = df.values
size = int(len(X) * 0.66)
train, test = X[0:size], X[size:len(X)]
history = [x for x in train]
predictions = list()
for t in range(len(test)): 
    model = ARIMA(history, order=(1,1,0))
    model_fit = model.fit(disp=0)
    output = model_fit.forecast()

    yhat = output[0]
    predictions.append(yhat) 

    obs = test[t]
    history.append(obs)

    #   print('predicted=%f, expected=%f' % (yhat, obs))
#error = mean_squared_error(test, predictions)
#print(error)
#print('Test MSE: %.3f' % error)
# plot
plt.figure(num=None, figsize=(15, 8))
plt.plot(test)
plt.plot(predictions, color='red')
plt.show()

Экспорт результатов в csv:

df_forecast = pd.DataFrame(predictions)
df_test = pd.DataFrame(test)
result = pd.merge(df_test, df_forecast, left_index=True, right_index=True)
result.rename(columns = {'0_x': 'Test', '0_y': 'Forecast'}, inplace=True)

Проблема, с которой я столкнулся:

  • Понимание подмножеств поезда / теста.Поправьте меня, если я ошибаюсь, но набор Train используется для обучения модели и получения данных «прогнозов», а затем есть тест, чтобы сравнить прогнозы с тестом?
  • 2017 данные выглядели хорошо, нокак мне реализовать это на данных 2018 года?Как я могу получить Поезд / Тестовые наборы?Нужно ли мне это вообще?

Что я думаю, что мне нужно сделать:

  • Получить данные о моих бронированиях за 2017 и 2018 годы из моей базы данных
  • Разделить его на 2017 и 2018 годы
  • Подготовить некоторые прогнозы на 2018 год
  • Добавить эти данные прогноза на 2018 год + к 2017 году и экспортировать их в формате csv

Как и почему проблема у меня.Любая помощь будет высоко ценится

1 Ответ

0 голосов
/ 28 ноября 2018

Вот некоторые мысли:

  • Понимание подмножеств поезда / теста.Поправьте меня, если я ошибаюсь, но набор Train используется для обучения модели и получения данных «прогнозов», а затем есть тест для сравнения прогнозов с тестом?

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

  • 2017 данные выглядели хорошо, но как мне их реализовать в 2018 годуданные?Как я могу получить Поезд / Тестовые наборы?Мне это вообще нужно?

У вас есть CSV с данными 2018 года?Все, что вам нужно сделать, чтобы разделить поезд / тест, то же самое, что вы делаете для данных за 2017 год, то есть не превышайте размер поезда и оставьте конец, чтобы проверить свои прогнозы train, test = X[0:size], X[size:len(X)].Однако, если вы хотите получить прогноз текущей даты и далее, почему бы не использовать все исторические данные в качестве входных данных для модели и использовать их для прогноза?

Что, по моему мнению, мне нужно сделать

  • Разделить его на 2017 и 2018 гг.

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

...