В этой статье мы продолжим с части 1 и будем обучать и оценивать модель.

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



ОДНОМЕРНЫЙ ВРЕМЕННОЙ РЯД

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

Это последовательность наблюдений одной переменной, записанных в последовательные моменты времени. Давайте продолжим и обучим модель сейчас.

#Define the model          Variable       (p, d, q)
model = sm.tsa.arima.ARIMA(df.High, order=(1, 1, 1))          
#fitting the model
model_fit = model.fit()
#printing the summary of the model
model_fit.summary()

Резюме модели будет выглядеть так

Мы пойдем дальше и сделаем прогнозы

# making the predictions and storing them 
predictions = model_fit.predict().values
#Assigning the predictions to a new column in the data frame
df['Predictions'] = predictions

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

df[-300:].plot(linestyle='--')
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
plt.title('MSFT High Predictions, ARIMA Model', fontsize=20)
plt.show()

Как видно, модель хорошо справляется с предсказаниями и точно следует линии, что здорово. Мы также можем оценить прогнозы с помощью RMSE, чтобы количественно определить ошибку, которую делает модель.

rmse = np.sqrt(mean_squared_error(highdf.High,highdf.Predictions))
print(f'The Root Mean Squared Error between the Actuals and the Predictions is {round(rmse,4)}')

Мы можем сделать прогноз на будущее, используя метод прогноза

#forecasting for the future
forecast = model_fit.forecast(steps=10)
#creating a date range
dates = pd.date_range(start='2023-01-12', periods=10)
#creating the forecast dataframe
forecast_df=pd.DataFrame({'Date': dates, 'Predictions': forecast})
forecast_df.index=forecast_df['Date']
forecast_df.drop('Date', axis=1, inplace=True)
#Plotting the forecast dataframe
forecast_df.plot(marker='o', color='orange')
plt.title('Forecast for the next 10 Days')
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
plt.show()

МНОГОМЕРНЫЕ ВРЕМЕННЫЕ РЯДЫ

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

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

В этой версии временного ряда мы рассматриваем множество признаков для прогнозирования целевых значений. Для наших целей мы продолжим и будем использовать первые 3 столбца, чтобы предсказать 4-й столбец фрейма данных, который выглядит примерно так.

Мы должны выполнить шаги для проверки стационарности других столбцов, а также построить графики ACF и PACF и найти разницу 1-го и 2-го порядка серии, которая позволит нам найти значения p, d и q. Мы будем использовать 1 для p и d и 2 для q.

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

Мы выбрали данные до 2017 года для обучения, а остальные данные — для тестирования.

#Splitting the data based on the year value
train = stock_df[stock_df.index.year<2017]
test = stock_df[stock_df.index.year>=2017]

Развод выглядит примерно так

Независимые признаки в терминах временных рядов называются экзогеннымипризнаками, и теперь мы подгоним данные к обучающему набору данных. В аргументе endog мы предоставляем зависимую переменную, а в аргументе exog мы предоставляем экзогенные/независимые функции.

#defining the model
model = sm.tsa.arima.ARIMA(endog=train['Close'], 
          exog=train[exogenous_features], order=(1, 1, 2))       #(p,d,q)
#fitting the model
model_fit = model.fit(
#making predictions on the training set
train['Predictions'] = model_fit.predict()
#Plotting the actual values and the predictions
train[['Close', 'Predictions']][-50:].plot()
plt.title('Predictions on Training Set')
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
plt.show()

Похоже, прогнозы довольно близки к реальным значениям. Давайте продолжим и сделаем прогнозы на тестовом наборе

#List comprehension to forecast the values for the length of the test set
forecast = [model_fit.forecast(exog=test[exogenous_features].iloc[i]).values[0] for i in range(len(test))]
#assigning the values to a new column in the dataframe
test['Forecast'] = forecast

#Plotting the actuals and the forecast 
test[['Close','Forecast']][-50:].plot()
plt.title('Predictions on Test Set')
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
plt.show()

Когда мы узнаем RMSE фактических значений и прогнозов, оказывается, что

#Calculating the root mean squared error
rmse = np.sqrt(mean_squared_error(test['Close'],test['Forecast']))
print(f'The RMSE for Multivariate ARIMAX is {round(rmse,4)}')

ЗАКЛЮЧЕНИЕ

  1. Одномерный временной ряд — это набор данных, состоящий из одной переменной, наблюдаемой в течение определенного периода времени. Это может быть дневная температура для определенного места в течение года, ежедневные продажи определенного продукта или дневные цены на акции компании.
  2. Многомерные временные ряды – это тип данных временных рядов, включающий множество переменных, каждая из которых имеет связанный набор наблюдений за определенный период времени. Этот тип данныхчасто используется в исследованиях сложных систем, когда несколько переменных взаимодействуют для получения одного результата.
  3. Разделение данных здесь во временных рядах немного отличается от типичного разделения набора данных алгоритмов машинного обучения. Поскольку существует последовательность, и мы не хотим, чтобы модель изучала пустые промежутки (из-за случайного разделения), мы разделим данные по годам.
  4. Независимые признаки в терминах временных рядов называются экзогеннымипризнаками, и мы сопоставляем данные в обучающем наборе данных. В аргументе endog мы предоставляем зависимую переменную, а в аргументе exog мы предоставляем экзогенные/независимые функции.

Заключительные мысли и заключительные комментарии

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

Если вам понравилась эта статья, я рекомендую вам пройти Global Certificate in Data Science & AI, потому что этот сертификат будет охватывать ваши основы, алгоритмы машинного обучения и глубокие нейронные сети (базовые для продвижения).