Прогнозування часових рядів за допомогою 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з колонками:
- ds— час, формат поля повинен бути datetime;
- y— цільова змінна в числовому форматі.
Для отримання прогнозу потрібно передати на новий 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з великою кількістю стовпців. Найбільш цікаві:
- ds— тимчасова мітка для прогнозованого значення;
- yhat— прогнозоване значення;
- yhat_lower— нижня межа прогнозу;
- yhat_upper— вища межа прогнозу.
Візуалізація
Бібліотека з коробки надає зручні методи візуалізації. Перший метод Prophet.plotвідображає графік прогнозу:
Модель непогано апроксимує історичні дані.
Другий метод Prophet.plot_componentsдозволяє візуалізувати окремі компоненти: тренд, свята, річну і тижневу сезонність:
Найбільш цікавим виявився річний графік сезонності. Максимальні піки потрапляють на лютий і березень — найбільш «депресивні» місяці. Наступний пік аж у вересні — школярі та студенти повертаються з канікул. Наступний пік на початку жовтня — початок опалювального сезону.
Подивимося на прогноз більш докладно:
До початку осені очікується сезонне подорожчання долара. Довірчий інтервал виглядає теж цілком правдоподібно. Ще раз зазначу, що даний прогноз заснований на сезонному коливанні валют і не враховує ні зовнішні, ні внутрішні фактори.
Висновки
- Бібліотека Prophet — зручний інструмент для прогнозування часових рядів. Модель працює досить добре з коробки, при цьому є набір гиперпараметров, які дозволяють поліпшити прогноз.
- Окремо варто відзначити вбудовані можливості візуалізації.
- З мінусів — проект молодий, можливі якісь неточності в роботі. Неповна документація.
- Завдання прогнозувати коливання валюти — складна. Особливо для української валюти в даний період часу.
- Prophet добре апроксимує навчальну вибірку. Варто відзначити і розумно виділену річну сезонність.
- Отримані передбачення можна використовувати як нову ознаку для інших алгоритмів машинного навчання.
Посилання на повний код .
Пишіть можливі ідеї поліпшення прогнозу. Було б цікаво послухати відгуки про Prophet тих, хто намагався застосувати в реальних проектах.
Опубліковано: 02/06/17 @ 10:00
Розділ Різне
Рекомендуємо:
10 плюсів роботи в ніші ЕСЕЙ баксовыми виплатами
Інфо-сайти: підсумки травня 2017 рекорд по трафіку і кількості опублікованих статей
Як програміст з Дніпра вступив в MIT, продав свій стартап Google і став техлидом в Pinterest
Швидкий генератор псевдовипадкових чисел на Go
Ставки Aliexpress чи готові ви до диверсифікації?