В этой статье мы продолжим с части 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)}')
ЗАКЛЮЧЕНИЕ
- Одномерный временной ряд — это набор данных, состоящий из одной переменной, наблюдаемой в течение определенного периода времени. Это может быть дневная температура для определенного места в течение года, ежедневные продажи определенного продукта или дневные цены на акции компании.
- Многомерные временные ряды – это тип данных временных рядов, включающий множество переменных, каждая из которых имеет связанный набор наблюдений за определенный период времени. Этот тип данныхчасто используется в исследованиях сложных систем, когда несколько переменных взаимодействуют для получения одного результата.
- Разделение данных здесь во временных рядах немного отличается от типичного разделения набора данных алгоритмов машинного обучения. Поскольку существует последовательность, и мы не хотим, чтобы модель изучала пустые промежутки (из-за случайного разделения), мы разделим данные по годам.
- Независимые признаки в терминах временных рядов называются экзогеннымипризнаками, и мы сопоставляем данные в обучающем наборе данных. В аргументе endog мы предоставляем зависимую переменную, а в аргументе exog мы предоставляем экзогенные/независимые функции.
Заключительные мысли и заключительные комментарии
Есть некоторые жизненно важные моменты, которые люди не понимают, занимаясь наукой о данных или путешествием в области искусственного интеллекта. Если вы один из них и ищете способ уравновесить эти минусы, ознакомьтесь с программами сертификации, предоставляемыми INSAID на их веб-сайте. .
Если вам понравилась эта статья, я рекомендую вам пройти Global Certificate in Data Science & AI, потому что этот сертификат будет охватывать ваши основы, алгоритмы машинного обучения и глубокие нейронные сети (базовые для продвижения).