#python #machine-learning
#python #машинное обучение
Вопрос:
Я попытался выполнить прогноз с помощью модели ARIMA (с python). Значения P, D, Q, p, d, q определяются с помощью теста ADF, plot_acf, plot_pacf и могут быть переданы при необходимости.
Код упоминается ниже.
import pandas as pd
from statsmodels.tsa.arima_model import ARIMA
import statsmodels.api as sm
df = pd.read_csv(r'https://github.com/sreerajva5/ML/raw/master/sample_data_ts.csv')
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
model = sm.tsa.statespace.SARIMAX(df['sample_data'], order=(0,1,0), seasonal_order=(1,1,12,30))
result = model.fit()
future_dt = pd.Series(pd.date_range('2012-06-01', periods=60, freq='D'))
future_dt_df = pd.DataFrame(index=future_dt, columns=df.columns)
future_df = pd.concat([df, future_dt_df])
future_df['forecast'] = result.predict()
Я создал модель и попытался предсказать числа в течение следующих 60 дней (2 месяцев). Но прогнозируются значения первых пяти дней первого месяца и первых 5 дней второго месяца. Промежуточные значения не прогнозируются.
Полученный результат приведен ниже.
"
2012-06-01 453.815056
2012-06-02 298.5604767
2012-06-03 270.5269854
2012-06-04 203.402702
2012-06-05 123.2703868
No values from predicted (its blank) against dates from 2012-06-06 to 2012-06-30
2012-07-01 475.5137062
2012-07-02 257.9273124
2012-07-03 272.8564157
2012-07-04 218.3305799
2012-07-05 123.9411595
Again no values from predicted (its blank) against dates from 2012-07-06 to 2012-07-30
"
В чем причина этого, и как я могу получить правильное предсказание?
Комментарии:
1. Выполнение вашего кода выдает мне
ValueWarning: A date index has been provided, but it has no associated frequency information and so will be ignored when e.g. forecasting.
Вы отключили предупреждения? Очевидно, вам нужно определить, что один индекс равен одному периоду.2. Я также получаю следующее предупреждение,
ValueWarning: A date index has been provided, but it is not monotonic and so will be ignored when e.g. forecasting.
3. не могли бы вы предоставить подрезультаты отдельных шагов? трудно следовать вашему коду
Ответ №1:
подгонка: метод подгонки оценивает параметры с использованием последовательности / заданных данных таким образом, чтобы ошибка была минимальной.
прогнозировать: После того, как параметры модели оценены, метод может быть использован для прогнозирования данных поезда, а также может быть использован для прогнозирования невидимых данных. Использование predict без параметров start и end data позволит делать прогнозы для данных поезда. Давайте протестируем это
assert len(result.predict()) == len(df)
ax = df.plot(figsize=(15,5))
result.predict().plot(ax=ax, label="predicted")
plt.legend()
Вывод:
Вы можете делать прогнозы для данных вне выборки / невидимых данных, указав начальный и конечный индексы. Мы будем делать прогнозы для полного набора дат, используя (0,len(future_df)-1)
в качестве начального и конечного индекса.
future_dt = pd.Series(pd.date_range('2012-06-01', periods=60, freq='D'))
future_dt_df = pd.DataFrame(index=future_dt, columns=df.columns)
future_df = pd.concat([df, future_dt_df])
future_df['forecast'] = result.predict(0,len(future_df)-1).values
# Lets plot it
ax = future_df['sample_data'][len(df)-10:].plot(figsize=(15,5))
future_df['forecast'][len(df)-10:].plot(ax=ax, label="predicted")
plt.legend()
прогноз: Этот метод представляет собой просто урезанную версию метода predict, который можно использовать для прогнозирования данных вне выборки / невидимых / будущих данных без необходимости в начальных и конечных значениях. Давайте сделаем прогноз на следующие 60 дней
future_dt = pd.Series(pd.date_range('2012-06-01', periods=60, freq='D'))
future_dt = pd.DataFrame(index=future_dt)
future_dt['forecast'] = result.forecast(60).values
ax = future_df['sample_data'][len(df)-10:].plot(figsize=(15,5))
future_dt['forecast'].plot(figsize=(15,5))
plt.legend()
Ответ №2:
Решение первое:
Просто измените вашу последнюю строку с
future_df['forecast'] = result.predict()
Для
future_df['forecast'] = result.forecast(60)
сотворил бы волшебство.
Что вы сделали неправильно (мое предположение)
predict()
Метод принимает start
и end
2 аргумента. Вы вызвали функцию, не сообщив ей, с чего начать прогнозирование и когда остановиться, поэтому это не сработало.
Тем не менее, вы получили прогнозы для первых 5 дней июня и июля, я предполагаю, что есть некоторые значения по умолчанию. Я попытался посмотреть это в документе, его там не было.
Имея эти знания о predict()
методе, если вы все еще хотите использовать его вместо forecast()
, что вы можете сделать, это:
future_df['forecast'] = result.predict(start='2012-06-01', end='2012-07-30')
который также должен работать.