Прогнозирование временных рядов 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? Стань участником!
… и я буду рад вашим отзывам!