Прогнозування часових рядів за допомогою Prophet від Facebook

Прогнозування часових рядів — це дуже популярна аналітична задача. Для прогнозування часових рядів в Python використовують такі підходи, як ARIMA , ARCH і т. д. Але підбір параметрів ARIMA — складний і трудомісткий процес. Однак 23-го лютого 2017 року команда Core Data Science з Facebook випустила нову бібліотеку для роботи з часовими рядами — Prophet . Спробуємо застосувати нову бібліотеку і подивимося на зручність у використанні і якість передбачення.

Будемо прогнозувати коливання котирування валюти для пари UAH/USD. Prophet надає API для Python і R, я використовую Python. Установку необхідних бібліотек зробимо з допомогою пакетного менеджера Сonda . Для аналізу будемо використовувати дані за період 01.02.2012/05.09.2017.

Цільової змінної візьмемо ціну закриття (Adj Close). Подивимося, як виглядають вихідні дані:

Підготовка вихідних даних

На графіку є ряд піків, які не відносяться до сезонних коливань. У контексті поточної задачі — це викиди. Згідно з документацією , найкраще рішення — видалити викиди. Бібліотека автоматично опрацює пропущені значення.

Свята

Prophet дозволяє вказати окремо дати, на які випадають свята. Модель врахує це в пророкуванні. Також можна регулювати ступінь впливу свят — holidays_prior_scale, що дуже зручно, якщо модель переобучилась.

Побудова прогнозу

Інтерфейс бібліотеки повністю відповідає популярній бібліотеці машинного навчання scikit-learn : створюємо модель, навчаємо її за допомогою методу .fit(), будуємо передбачення .predict(). Для навчання потрібно передати DataFrameз колонками:

Для отримання прогнозу потрібно передати на новий DataFrame, що містить стовпець ds. Для цього в бібліотеці є функція make_future_dataframe, яка приймає параметр periods— період, для якого ми хочемо отримати прогноз і freq— частота тимчасового ряду (значення за замовчуванням — день).

Оцінка якості моделі

Для оцінки якості прогнозів відокремимо період в останні 60 днів. Побудуємо модель, навчимо і зробимо прогноз:

m = Prophet(changepoint_prior_scale=0.1, holidays=holidays, holidays_prior_scale=18)
m.fit(train_df);

future = m.make_future_dataframe(periods=60)
forecast_test = m.predict(future)

Оцінювати будемо середньоквадратичну і середню абсолютну помилки:

Mean squared error: 1.0407109491747677
Mean absolute error: 0.9977340371358951

Схоже, що модель працює досить непогано. Навчимо модель на повній вибірці і побудуємо прогноз на наступні 4 місяці.

m = Prophet(changepoint_prior_scale=0.1, holidays=holidays, holidays_prior_scale=18)
m.fit(predict_df);

future = m.make_future_dataframe(periods=120)
forecast = m.predict(future)

Прогноз

У вигляді прогнозу Prophet поверне DataFrameз великою кількістю стовпців. Найбільш цікаві:

Візуалізація

Бібліотека з коробки надає зручні методи візуалізації. Перший метод Prophet.plotвідображає графік прогнозу:

Модель непогано апроксимує історичні дані.

Другий метод Prophet.plot_componentsдозволяє візуалізувати окремі компоненти: тренд, свята, річну і тижневу сезонність:

Найбільш цікавим виявився річний графік сезонності. Максимальні піки потрапляють на лютий і березень — найбільш «депресивні» місяці. Наступний пік аж у вересні — школярі та студенти повертаються з канікул. Наступний пік на початку жовтня — початок опалювального сезону.

Подивимося на прогноз більш докладно:

До початку осені очікується сезонне подорожчання долара. Довірчий інтервал виглядає теж цілком правдоподібно. Ще раз зазначу, що даний прогноз заснований на сезонному коливанні валют і не враховує ні зовнішні, ні внутрішні фактори.

Висновки

Посилання на повний код .

Пишіть можливі ідеї поліпшення прогнозу. Було б цікаво послухати відгуки про Prophet тих, хто намагався застосувати в реальних проектах.

Опубліковано: 02/06/17 @ 10:00
Розділ Різне

Рекомендуємо:

10 плюсів роботи в ніші ЕСЕЙ баксовыми виплатами
Інфо-сайти: підсумки травня 2017 рекорд по трафіку і кількості опублікованих статей
Як програміст з Дніпра вступив в MIT, продав свій стартап Google і став техлидом в Pinterest
Швидкий генератор псевдовипадкових чисел на Go
Ставки Aliexpress чи готові ви до диверсифікації?