Prophet — это простая в использовании библиотека для прогнозирования данных временных рядов.
Обзор:
Prophet — это библиотека Python, разработанная Facebook для упрощения прогнозирования одномерных данных временных рядов. Он был создан для внутреннего использования в компании для прогнозирования продаж, вычислений и т. д., а затем стал открытым исходным кодом.
Он был разработан для полной автоматизации задачи прогнозирования данных временных рядов с учетом таких параметров, как сезонность, тенденции и праздники. Для подробного понимания, пожалуйста, обратитесь к официальной документации и здесь.
Изучение набора данных:
В этой статье мы проанализируем набор данных Air Passengers и спрогнозируем будущие данные с помощью пророка. Сначала загрузите набор данных здесь. Набор данных содержит ежемесячные данные о пассажирах самолетов в США с 1949 по 1960 год.
Установите необходимые пакеты и загрузите CSV-файл с вашего пути.
from pandas import read_csv from matplotlib import pyplot path = '/content/drive/My Drive/Facebook Prop/AirPassengers.csv' df = read_csv(path) df.head()
Выполните следующую функцию, чтобы получить сведения о CSV-файле. Мы видим, что в нем 144 строки и два столбца — Месяц и #Пассажиры.
df.info()
Давайте построим данные, чтобы понять это.
df.plot() pyplot.show()
Наблюдайте за тенденциями на графике с течением времени, и то же самое следует предсказывать в будущем, используя пророка.
Подгонка модели:
Наша модель будет определена как экземпляр Prophet() и будет соответствовать набору данных с помощьюфункцииfit().
Prophet() принимает аргументы для учета типа роста, типа сезонности и т. д., но даже если аргументы не заданы, в основном все вычисляется автоматически.
Функция fit() принимает кадр данных как объект, но в определенном формате. Первый столбец должен называться «ds» и содержать дату и время. Второй столбец должен называться «y» и содержать значения.
Поэтому мы соответствующим образом переименовываем столбцы и преобразуем значения первого столбца в объекты даты и времени.
from pandas import to_datetime df.columns = ['ds', 'y'] df['ds']= to_datetime(df['ds'])
Подгонка нашей модели к набору данных:
from fbprophet import Prophet model = Prophet() model.fit(df)
Еженедельная и дневная сезонность отключена, поскольку наши данные имеют месячную периодичность. Но мы можем получить представление о месячной тенденции и общей тенденции в целом, используя следующий код.
model.plot_components(model.predict(df))
Приведенные выше цифры показывают, что количество перевезенных пассажиров в целом увеличивается и достигает своего пика примерно в июле каждого года.
Прогноз по данным в выборке:
Прогноз в выборке дает хорошее представление о том, как модель работала на обучающих данных. Это достигается путем подгонки функции predict() к нашим данным за последние 12 месяцев (используя срезы фрейма данных).
forecast = model.predict(df[132:]) print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].head())
Теперь мы построим наш прогноз вместе с данными обучения, чтобы увидеть, близки ли наши прогнозы к фактическим значениям.
model.plot(forecast) pyplot.show()
На приведенном выше графике черные точки относятся к данным обучения, а синяя линия — к нашему прогнозу за последние 12 месяцев. Синяя заштрихованная область — верхняя и нижняя границы. Можно сделать вывод, что наши прогнозы за последние 12 месяцев близки к фактическим значениям в наборе данных.
Прогноз по данным вне выборки:
В этом разделе мы спрогнозируем авиаперевозки на следующие пять лет.
future = model.make_future_dataframe(periods=12 * 5, freq='M') forecast = model.predict(future) forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper', 'trend', 'trend_lower', 'trend_upper']].tail()
Рисуем то же самое:
model.plot(forecast) pyplot.show()
Из графика мы можем сделать вывод, что прогноз соответствует тенденциям, наблюдаемым для прошлых данных. Так что наша модель хорошо поработала.
Средняя абсолютная ошибка:
Мы оцениваем нашу модель вручную, вычисляя среднюю абсолютную ошибку (MAE). Это можно сделать, удерживая данные за последние несколько месяцев во время обучения и прогнозируя на ту же продолжительность, используя нашу модель. Поскольку значения за последние 12 месяцев нам уже известны, мы можем рассчитать ошибку между прогнозами и фактическими значениями.
model = Prophet() model.fit(df[:132]) #excluding last 12 rows forecast = model.predict(df[132:]) y_true = df['y'][132:].values y_pred = forecast['yhat'].values from sklearn.metrics import mean_absolute_error mae = mean_absolute_error(y_true, y_pred) print('MAE: %.2f' % mae) pyplot.plot(y_true, label='Actual') pyplot.plot(y_pred, label='Predicted') pyplot.legend() pyplot.show()
Очевидно, что наша модель достаточно хороша, чтобы уловить тенденцию в наборе данных. МАЭ также находится в допустимых пределах.
Мы можем заключить, что Prophet — хороший инструмент для легкого прогнозирования одномерных данных временных рядов.
Блокнот Colab можно найти здесь.