Прогнозирование временных рядов Prophet на наборе данных Hold-Out

Введение

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

Одним из популярных алгоритмов прогнозирования временных рядов является Prophet, разработанный командой Facebook Core Data Science. Prophet предоставляет аддитивную регрессионную модель, которая фиксирует сезонность, тенденции и другие потенциальные компоненты, присутствующие в данных. В этой статье мы рассмотрим фрагмент кода, который демонстрирует, как оценивать модель прогнозирования временных рядов Prophet на заблокированном наборе данных. Разбивая каждую часть кода, объясняя ее назначение и предоставляя примеры, мы стремимся вооружить читателей знаниями, позволяющими эффективно использовать Prophet для решения собственных задач прогнозирования временных рядов.

Импорт необходимых библиотек и загрузка набора данных

Чтобы начать наше исследование, мы импортируем необходимые библиотеки и загружаем набор данных. В этой главе мы импортируем Pandas для обработки данных, Prophet для прогнозирования временных рядов, scikit-learn для оценки метрик и seaborn для визуализации. Эти библиотеки составляют основу нашего анализа, позволяя нам обрабатывать данные, обучать модели, оценивать производительность и визуализировать результаты. Затем мы загружаем набор данных с помощью функции Pandas read_csv, извлекая ежемесячные данные о продажах автомобилей, хранящиеся в формате CSV, из удаленного места. Используя Pandas, мы получаем данные в удобной структуре DataFrame для дальнейшей обработки.

import pandas as pd
from prophet import Prophet
from sklearn.metrics import mean_absolute_error
import seaborn as sns
# Load data
path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/monthly-car-sales.csv'
df = pd.read_csv(path, header=0)

Подготовка набора данных

Как только мы загрузили набор данных, нам нужно подготовить его для обучения и оценки. Это включает в себя манипулирование именами столбцов и обеспечение соответствующих типов данных. В этой главе мы переименуем столбцы DataFrame в «ds» и «y», чтобы представить дату и целевую переменную соответственно. «Соблюдая это соглашение об именах, мы устанавливаем совместимость с Prophet. Кроме того, мы преобразуем столбец даты («ds») в формат даты и времени, используя функцию Pandas to_datetime. ͏Эти приготовления закладывают основу для точного прогнозирования временных рядов с помощью ͏Prophet.

# Prepare expected column names
df.columns = ['ds', 'y']
df['ds'] = pd.to_datetime(df['ds'])

Создание обучающего набора данных

Прежде чем подгонять модель Пророка, мы «создаем обучающий набор данных», удаляя последние 12 месяцев из исходного набора данных. Этот процесс гарантирует, что у нас есть резервный набор данных для оценки производительности модели. В этой главе фрагмента кода мы показываем, как удалить последние 12 строк DataFrame, в результате чего получится обучающий набор данных. Изучив хвост обучающего набора данных, мы можем убедиться, что он исключает последние 12 месяцев, сохраняя их для целей оценки.

# Create test dataset, remove last 12 months
train = df.drop(df.index[-12:])
print(train.tail())
           ds      y
91 1967-08-01  13434
92 1967-09-01  13598
93 1967-10-01  17187
94 1967-11-01  16119
95 1967-12-01  13713

Определение и подгонка модели

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

# Define the model
model = Prophet()
# Fit the model
model.fit(train)

Создание прогнозов на будущее

Обучив модель Пророка, мы стремимся «создавать прогнозы на будущие периоды». В этой главе мы сосредоточимся на создании списка будущих дат и использовании их для прогнозирования. ͏Указав желаемый период времени для прогноза, мы создаем список будущих дат и преобразовываем их в структуру DataFrame. Этот DataFrame со столбцом «ds», представляющим даты, служит входными данными для метода прогнозирования модели. Вызывая метод прогнозирования на обученной модели с будущими датами в качестве входных данных, мы получаем прогноз, который показывает ожидаемые значения для указанного периода времени.

# Define the period for which we want a prediction
future = list()
for i in range(1, 13):
    date = '1968-%02d' % i
    future.append([date])
future = DataFrame(future)
future.columns = ['ds']
future['ds'] = to_datetime(future['ds'])
# Use the model to make a forecast
forecast = model.predict(future)

Оценка модели

Чтобы оценить точность прогнозов нашей модели, мы используем среднюю абсолютную ошибку (MAE) в качестве метрики оценки. В этой главе мы сравниваем прогнозируемые значения, сгенерированные нашей моделью, с фактическими значениями исходного набора данных за последние 12 месяцев. Извлекая эти значения, мы вычисляем ͏MAE, используя функцию mean_absolute_error͏ из scikit-learn. ͏MAE обеспечивает меру средней величины ошибок между прогнозируемыми и фактическими значениями, что дает нам ценную информацию о производительности модели. Печать MAE позволяет нам оценить эффективность нашей модели прогнозирования временных рядов.

# Calculate MAE between expected and predicted values for December
y_true = df['y'][-12:].values
y_pred = forecast['yhat'].values
mae = mean_absolute_error(y_true, y_pred)
print('MAE: %.3f' % mae)
MAE: 1336.813

Визуализация результатов

В последней главе мы визуализируем ожидаемые и фактические значения за последние 12 месяцев, чтобы получить более четкое представление о производительности нашей модели. Используя функцию линейного графика Seaborn, мы создаем линейный график, который демонстрирует как фактические значения, так и прогнозируемые значения на одном и том же рисунке. Это визуальное представление позволяет нам оценить, насколько близко предсказанные значения соответствуют действительности. С добавлением условных обозначений и меток график становится интуитивно понятным инструментом для оценки точности и эффективности нашей модели прогнозирования временных рядов.

# Plot expected vs actual using seaborn
sns.lineplot(data=df, x='ds', y='y', label='Actual')
sns.lineplot(data=forecast, x='ds', y='yhat', label='Predicted')

plt.xlabel('Date')
plt.ylabel('Sales')
plt.title('Actual vs. Predicted Monthly Car Sales')
plt.legend()
plt.show()

Заключение

В этой статье мы рассмотрели фрагмент кода, который демонстрирует оценку модели прогнозирования временных рядов Prophet на наборе данных с задержкой. Каждая глава дает представление о различных аспектах кода, от импорта библиотек и загрузки набора данных до определения модели, создания прогнозов на будущее, оценки ее производительности и визуализации результатов. Используя возможности Prophet, такие как учет сезонности и тенденций, мы можем получать точные прогнозы для данных временных рядов.

Анализ временных рядов и прогнозирование — это мощные методы, позволяющие принимать обоснованные решения и осуществлять упреждающее планирование. Благодаря разбивке фрагмента кода читатели получили полное представление о том, как использовать Prophet для своих собственных временных рядов и задач прогнозирования.

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

Если вы дочитали до этого момента, спасибо, что прочитали мою историю!

Подпишитесь бесплатно, чтобы получать уведомления, когда я публикую новую историю!

Хотите неограниченный доступ к моим историям и остальной части Medium? Стань участником!

… и я буду рад вашим отзывам!