Некоторые из пакетов временных рядов, которые вы могли бы добавить в свой арсенал
Прогнозирование временных рядов — это метод в области статистики для анализа исторических данных с временным компонентом и создания прогноза на его основе.
Некоторыми классическими примерами методов прогнозирования временных рядов являются скользящее среднее, ARIMA и экспоненциальное сглаживание. Эти методы использовались в течение длительного времени и до сих пор полезны из-за того, насколько легко пользователям объяснить результат, хотя и с менее точным предсказанием.
В свою очередь, многие прогнозы, основанные на машинном обучении, разрабатываются за счет потери некоторой объяснимости и повышения точности, таких как Prophet и Kats.
Нужен ли вам классический подход или модель, основанная на машинном обучении, многие разработали пакеты Python для доступа ко всем этим методам. Некоторые из известных пакетов — Statsmodel, pmdarima и sktime. Однако модель прогнозирования не ограничивается только теми, которые я перечислил выше, потому что многие отличные пакеты заслуживают внимания.
Вот почему в этой статье будут представлены три моих уникальных пакета Python для прогнозирования временных рядов. Давайте углубимся в это.
1. СтатистикаПрогноз
StatsForecast — это пакет Python, который предоставляет набор одномерных моделей прогнозирования временных рядов. Уникальность StatsForecast заключается в том, что модель обеспечивает быстрое обучение и оптимизирована для высокоточных моделей. Кроме того, пакет предлагает несколько тестов, которые мы могли бы использовать при обучении различных моделей.
Давайте попробуем пакет, чтобы почувствовать его. Во-первых, нам нужно установить пакет StatsForecast.
pip install statsforecast
В демонстрационных целях я буду использовать синтетические данные, сгенерированные из StatsForecast. Используя следующий код, я собирал синтетические данные, записываемые ежемесячно.
from statsforecast.utils import generate_series synthetic_panel = generate_series(n_series=1, freq = 'M') synthetic_panel.head()
Набор данных содержит функцию даты («ds») и числовые функции, которые мы хотим спрогнозировать («y»). Кроме того, индекс имеет индекс «unique_id», который улучшит скорость обучения в соответствии с StatsForecast.
Затем я бы разделил набор данных на обучающие и тестовые данные. Я бы взял последние 6 наблюдений за тестовые данные, а остальные были назначены в качестве обучающих данных.
Y_train_df = synthetic_panel[:-6] Y_test_df = synthetic_panel[-6:]
Когда набор данных будет готов, мы можем попытаться разработать нашу модель прогнозирования. Первым шагом является импорт модели, которую мы хотим использовать. В нашем примере мы будем использовать AutoARIMA (модель ARIMA с автоматическим обучением параметров) и экспоненциальное сглаживание (ETS).
from statsforecast import StatsForecast from statsforecast.models import AutoARIMA, ETS
Затем мы настроим модель и передадим ей несколько параметров. Параметр, который мы передаем, — это продолжительность сезона (используя 12 из-за 12 месяцев в году) и модель «ЗМЗ» для ETS для оптимальной настройки модели. Кроме того, я установил переменную горизонта как длину нашего прогноза.
season_length = 12 horizon = len(Y_test_df) models = [ AutoARIMA(season_length=season_length), ETS(season_length=season_length, model='ZMZ') ] model = StatsForecast( df=Y_train_df, models=models, freq='M', n_jobs=-1)
Отличительной особенностью StatsForecast является то, что различные модели можно тестировать непосредственно в одной строке. Нам нужно только решить, какую модель прогнозирования мы хотим использовать, и мы легко получим все прогнозы с помощью следующей строки.
%time Y_hat_df = model.forecast(horizon).reset_index() Y_hat_df.head()
StatsForecast может похвастаться быстрым временем обучения, и мы можем увидеть время прогноза на изображении выше. Потребовалось немного времени, чтобы получить наш прогноз. Итак, насколько точен наш прогноз? Давайте посмотрим на это, используя график времени.
fig, ax = plt.subplots(1, 1, figsize = (20, 7)) Y_hat_df = Y_test_df.merge(Y_hat_df, how='left', on=['unique_id', 'ds']) plot_df = pd.concat([Y_train_df, Y_hat_df]).set_index('ds') plot_df[['y', 'AutoARIMA', 'ETS']].plot(ax=ax, linewidth=2) ax.set_title('Forecast Synthetic Data', fontsize=22) ax.set_ylabel('Number', fontsize=20) ax.set_xlabel('Timestamp [t]', fontsize=20) ax.legend(prop={'size': 15}) ax.grid()
Как видно из изображения выше, шаблон данных прогноза достаточно близок к фактическим данным. Оба предсказания приводят к предсказаниям, которые пересекаются с основной истиной.
Есть так много моделей, которые вы можете примерить с помощью StatsForecast; Предлагаю вам зайти на эту страницу.
2. ПьяФ
PyAF или Python Automatic Forecasting — это пакет Python с открытым исходным кодом для автоматической разработки моделей прогнозирования временных рядов (одномерных или с экзогенными данными). Модель была построена на основе Scikit-Learn и Pandas, поэтому ожидайте знакомые API. Пакет также предлагает различные модели для максимально возможного использования в нескольких линиях.
Давайте попробуем пакет PyAF с нашим предыдущим набором данных. Во-первых, нам нужно установить пакет.
pip install pyaf
Затем мы могли бы использовать наши предыдущие данные для разработки нашей модели прогноза с помощью PyAF. Давайте попробуем автоматический механизм прогнозирования со следующим кодом.
horizon = len(Y_test_df) import pyaf.ForecastEngine as autof #set up the model engine lEngine = autof.cForecastEngine() # get the best time series model for test prediction lEngine.train(iInputDS = Y_train_df, iTime = 'ds', iSignal = 'y', iHorizon = horizon)
Давайте попробуем взглянуть на данные прогноза. Мы могли бы использовать следующий код для получения прогноза.
forecast_df= lEngine.forecast(Y_train_df, horizon)
Результатом прогноза будет датафрейм наших текущих и прогнозных данных. Кроме того, для каждого результата прогноза имеется так много информации, которую мы могли бы использовать для оценки нашей модели.
Давайте соберем только критическую информацию и сравним ее визуально.
forecast_df.plot.line('ds', ['y' , 'y_Forecast','y_Forecast_Lower_Bound', 'y_Forecast_Upper_Bound'], grid = True, figsize=(12, 8))
Прогноз довольно хороший, как показано на изображении выше, где данные прогноза и фактические данные перекрываются. Кроме того, верхняя и нижняя границы достаточно малы, чтобы показать уверенность модели. Мы можем улучшить модель, используя экзогенные данные, которые вы можете попробовать, используя следующий учебник для ноутбука.
3. Нейронный пророк
NeuralProphet — это пакет Python для разработки модели временных рядов на основе Facebook Prophet, но с архитектурой нейронной сети. Пакет основан на PyTorch и может быть легко использован с минимальным количеством строк.
Начнем с установки пакета.
pip install neuralprophet
Если вам нужна интерактивная визуализация в Jupyter Notebook, мы можем установить ее, используя следующий код.
pip install neuralprophet[live]
Начнем с запуска модели. Для примера мы используем тот же набор данных, что и предыдущий. Кроме того, чтобы упростить задачу, я бы удалил индекс данных.
train = Y_train_df.reset_index(drop = True) test = Y_test_df.reset_index(drop = True)
Затем мы инициируем модель Neural Prophet.
from neuralprophet import NeuralProphet m = NeuralProphet()
Затем мы будем обучать модель, используя следующий код.
metrics = m.fit(train, freq='M', validation_df=Y_test_df, progress='plot')
Модель будет автоматически рекурсивно обучать данные и останавливаться после эпохи по умолчанию (вы можете установить свою эпоху). Чтобы увидеть окончательную метрику, мы могли бы использовать следующий код.
metrics.tail(1)
Мы также могли бы попробовать модель для визуального прогнозирования и сравнения текущих данных обучения.
forecast = m.predict(train) fig = m.plot(forecast)
Из приведенного выше графика видно, что прогноз и фактическая точка данных близки. Попробуем сравнить его с тестовыми данными.
forecast = m.predict(test) m = m.highlight_nth_step_ahead_of_each_forecast(1) fig = m.plot(forecast)
На изображении выше мы видим, что прогноз довольно близок к фактическим данным. Есть еще некоторая ошибка, которая может быть исправлена дальнейшим развитием модели прогноза.
Как и в случае с Prophet, мы могли бы получить компонент NeuralProphet Forecast, используя следующий код.
fig_param = m.plot_parameters()
Разложение покажет тенденцию и сезонность наших тренировочных данных, что также имеет решающее значение для нашего понимания.
Пакет NeuralProphet на момент написания этой статьи все еще находился в стадии бета-тестирования, поэтому ожидайте много новых разработок в пакете, особенно для увеличения возможностей прогнозирования. Чтобы ознакомиться с их графиком разработки, вы можете посмотреть его здесь.
Заключение
Прогноз временных рядов — это метод прогнозирования будущих значений на основе исторических данных о времени, например погоды или численности персонала.
Многие пакеты Python были разработаны для прогнозов временных рядов, но я хотел показать некоторые из наиболее уникальных в этой статье. Они есть:
- СтатистикаПрогноз
- ПйАФ
- NeuralProphet
Я надеюсь, что это помогает!
Заходите ко мне в Социальные сети, чтобы обсудить более подробно или задать вопросы.
Если вы не подписаны как участник Medium, рассмотрите возможность подписки через моего реферала.