www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Использование пакета с открытым исходным кодом Prophet для создания будущих прогнозов в R

Дата публикации May 17, 2017

Почти каждая компания хочет ответить, где они будут через неделю / месяц / год.
Ответы на эти вопросы могут быть полезны при планировании инфраструктуры компании, ключевых показателей эффективности (ключевых показателей эффективности) и рабочих целей.
Следовательно, использование инструментов прогнозирования данных является одной из наиболее распространенных задач, которые задаются профессионалами в области данных.


Одним из инструментов, который недавно был выпущен в качестве открытого источника, является пакет прогнозирования временных рядов Facebookпророк, Доступная как для R, так и для Python, это относительно простая в реализации модель с некоторыми необходимыми опциями настройки.
В этом посте я рассмотрю Prophet и последую за ним простым примером кода R. Этот поток кода сильно вдохновленофициальное руководство пользователя пакета,

Мы будем использовать открытый набор данных, извлеченный из викишарка, содержащего ежедневные входы данных на страницу статьи LeBron James Wikipedia. Далее мы будем строить ежедневные прогнозы на основе исторических данных.
* Викишарк был закрыт после выхода статьи. Вы можете использовать другой полезный сайт дляполучить данные,


Этап 1 - Установка и импорт пророка

install.packages(‘prophet’)
library(prophet)
library(dplyr)

Этап 2 - загрузка набора данных

stats <- read.csv(“lebron.csv”, header=FALSE, sep=”,”)
colnames(stats) <- c(“ds”, “y”)
head(stats)
#daily data points starting from 2014–01–0
stats$y <- log10(stats$y)

Для нашего примера кода мы преобразуем данные и используем журнал входов. Это поможет нам понять визуализации прогноза.

Этап 3 - Изучение данных

View(summary(stats))
plot(y ~ ds, stats, type = "l")

Мы можем видеть, что данные за 2014–01–01 гг. И до 2016–12–31 гг. С некоторыми годовыми пиками сезонности с апреля по июнь.

Этап 4 - Основные прогнозы

m <- prophet(stats)
future <- make_future_dataframe(m, periods = 365)
forecast <- predict(m, future)

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

plot(m, forecast)

Стандартные визуализации пакета пророка довольно хороши с предопределенными отметками, точками данных и интервалами неопределенности. Это одно из преимуществ этого пакета с открытым исходным кодом, нет необходимости в дополнительной настройке, и первый результат является быстрым и достаточно хорошим для большинства потребностей.

прогнозирование одного года будущих точек данных

Используя этот график, мы более четко определяем годовой тренд и сезонность и то, как они используются для прогнозирования.

tail(forecast[c(‘ds’, ‘yhat’, ‘yhat_lower’, ‘yhat_upper’)])

Объект прогноза содержит необработанные данные с прогнозируемым значением по дням и интервалам неопределенности. Также возможно получить доступ к прогнозным тенденциям и компонентам сезонности с помощью:

tail(forecast)

Этап 5 - Проверка компонентов модели

prophet_plot_components(m, forecast)

не отставая от простоты, легко взглянуть на компоненты модели. Отображение общей тенденции, недельной и годовой сезонности.

Компоненты модели

Этап 6 - Настройка праздников и событий

Последний график компонентов показал растущий интерес к Леброну Джеймсу во время плей-офф НБА и во время финалов НБА. Модель в этом пункте признает ежегодную сезонность, которая возвращается каждый год. С другой стороны, Леброн Джеймс в настоящее время удерживает рекорд6 лет подряд в плей-офф НБАначиная с Майами и продолжая с кавалерами. Таким образом, мы должны ожидать одну и ту же сезонность год за годом.

Добавление праздников и событий является основным преимуществом пакета. Во-первых, делая прогнозы более точными и позволяя пользователю принимать во внимание известные будущие события. Разработчики сделали эту настройку намного проще, чем предыдущие пакеты временных рядов, в которых события и праздники должны были быть изменены вручную или проигнорированы, чтобы делать прогнозы. Подумайте о веб-сайте электронной коммерции, который может добавлять все повторяющиеся кампании и рекламные акции и устанавливать цели получения доходов на основе известных дат будущих кампаний.

Добавление событий и праздников осуществляется путем создания нового кадра данных, в котором мы передаем даты начала или окончания событий и продолжительность дней. В этом примере мы добавим плей-офф NBA и финалы NBA в качестве событий.

playoff_brackets <- data_frame(
holiday = ‘playoffs’,
ds = as.Date(c(‘2017–04–16’ ,’2016–04–17', ‘2015–04–19’, ‘2014–04–19’)),
lower_window = 0,
upper_window = 45
)
playoff_finals <- data_frame(
holiday = ‘playoff_finals’,
ds = as.Date(c(‘2016–06–02’, ‘2015–06–04’, ‘2014–06–05’)),
lower_window = 0,
upper_window = 20
)

Используя параметры нижнего и верхнего окна, пользователь может установить продолжительность праздника. Эти сопоставления будут привязаны к одному объекту и переданы в параметре праздничных дней.

holidays <- bind_rows(playoff_brackets, playoff_finals)
m <- prophet(stats, holidays = playoff_brackets)
forecast <- predict(m, future)
plot(m, forecast)

Обратите внимание, что модель лучше предсказывает значения во время пиков. Повторная распечатка компонентов покажет добавленную строку влияния выходных дней на прогноз. Теоретически вы можете отобразить многие события, которые имеют решающее значение для бизнеса, и получить более точные прогнозы.

Этап 7 - Устранение выбросов

При построении прогнозов важно удалить выбросы из исторических данных. Точки данных используются моделью, которая добавляет их эффект к прогнозам, хотя они представляют собой единичные события времени или просто ложные журналы событий. В отличие от других пакетов, которые будут повреждены при передаче значения NA с историческими данными, Prophet будет игнорировать эти даты.

В этом примере мы удалим серию одиночных событий, в которых игрок НБА объявил, что покидает Майами в пользу Кливленда, что, вероятно, привлечет внимание к его странице в Википедии.

outliers <- (as.Date(stats$ds) > as.Date(‘2014–07–09’)
& as.Date(stats$ds) < as.Date(‘2014–07–12’))
stats$y[outliers] = NA

Этап 8 - Больше функциональности

На данный момент мы видим простоту и надежность, которые разработчики имели в виду при создании этого пакета. Некоторые дополнительные функции, которые я не показывал, но их следует использовать:

  • Изменение масштаба сезонности и эффекта праздников
  • Картирование критических точек изменения тренда
  • Редактирование интервалов неопределенности

Использование пророка для обнаружения аномалий

Следующим шагом, который, я надеюсь, разработчики сделают, будет использование этого пакета и его использование для обнаружения аномалий для данных временных рядов.Предыдущие пакетыпредлагают такую ​​функциональность, но сильно зависят от структуры данных и строгой сезонности.

Давайте используем существующую модель для отображения аномалий в данных. Мы сравним исходные значения (y) с предсказанными значениями модели (yhat) и создадим новый столбец с именемdiff_values.

combined_data <- cbind(head(forecast, nrow(stats)), stats[order(stats$ds),])
combined_data$diff_values <- (combined_data$y - combined_data$yhat)
summary(combined_data$diff_values)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.05269 0.07326 0.10780 0.13490 0.16520 0.29480

Чтобы лучше обобщить обнаружение аномалий, мы также добавим нормализованные значения diff, представляющие процентное отличие от фактических значений.

combined_data$diff_values_normalized <-
(combined_data$y - combined_data$yhat) / combined_data$y

Давайте продолжим и визуализируем нормализованные значения различий во времени.

plot(diff_values_normalized ~ ds, combined_data, type = “l”)
Нормализованный прогноз разницы к фактическим значениям

Большинство прогнозов довольно близки к фактическим значениям, поскольку график имеет тенденцию перемещаться вокруг значения 0. Мы также можем спросить, какой процент точек данных являются аномалиями, отфильтровав абсолютные значения столбца.diff_values_normalized.Установка порога, с которого точка данных считается аномалией, является одним из способов ее рассмотрения. В этом примере его 10%

nrow(combined_data[abs(combined_data$diff_values_normalized) > 0.1
& !is.na(combined_data$y),]) / nrow(combined_data)

Мы получаем 0,02, что указывает на то, что 2% точек данных являются аномалиями на основе данного порога.


Заключительные слова

Прогнозирование - важный навык для профессионалов в области данных. Спасибо за проекты с открытым исходным кодом, такие как Prophet, это не должно быть слишком сложным. Этот пакет обеспечивает баланс между простотой, скоростью вычислений и нужным количеством настроек, чтобы его могли использовать как начинающие, так и опытные пользователи.

Спасибо за чтение,
Харел Рехавия,
Аналитик данных в Viber

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map