Большие неопределенности для праздников в модели Пророка - PullRequest
1 голос
/ 24 октября 2019

Я строю модель временного ряда с Пророком и получаю странное поведение с неопределенностью в праздничные дни, которую я не понимаю.

Данные взяты из Google Trends и связаны с поиском по термину "flowers ".

library(dplyr)
library(gtrendsR)
library(prophet)

flowers <- gtrends("flowers")$interest_over_time

flowers <- flowers %>% select(ds = date, y = hits)

Как и следовало ожидать, этот временной ряд имеет пики вокруг двух важных дней: Дня святого Валентина и Дня матери.

Чтобы учесть эти дни в моей модели Iсоздал фрейм данных с соответствующими датами для интересующего периода.

holidays <- rbind(
  data.frame(
    holiday = "mothers_day",
    ds = as.Date(c(
      # Second Sunday of May.
      '2014-05-11',
      '2015-05-10',
      '2016-05-08',
      '2017-05-14',
      '2018-05-13',
      '2019-05-12',
      '2020-05-10'
    )),
    lower_window = -7,       # Extend holiday to 7 days before nominal date
    upper_window = +7,       # Extend holiday to 7 days after nominal date
    prior_scale = 1
  ),
  data.frame(
    holiday = "valentines_day",
    ds = as.Date(c(
      '2014-02-14',
      '2015-02-14',
      '2016-02-14',
      '2017-02-14',
      '2018-02-14',
      '2019-02-14',
      '2020-02-14'
    )),
    lower_window = -7,       # Extend holiday to 7 days before nominal date
    upper_window = +7,       # Extend holiday to 7 days after nominal date
    prior_scale = 1
  )
)

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

Теперь подгоняем момент, используя эти праздники.

flowers_prophet <- prophet(
  holidays = holidays,
  mcmc.samples = 300
)

flowers_prophet <- fit.prophet(
  flowers_prophet,
  flowers
)

Имея модель в руках, мы можем делать прогнозы.

flowers_future <- make_future_dataframe(flowers_prophet,
                                        periods = 52,
                                        freq = 'week')

flowers_forecast <- predict(flowers_prophet, flowers_future)

prophet_plot_components(flowers_prophet, flowers_forecast)

Ивот где все становится странным.

Components of time series predictions

Тенденция и годовой разброс выглядят совершенно разумно. Вариации, связанные с историческими праздниками, тоже выглядят хорошо. День матери 2020 выглядит хорошо. Тем не менее, День святого Валентина 2020 года имеет небольшую прогнозируемую стоимость (относительно исторических значений) и чрезвычайно большую неопределенность.

Фактический временной ряд выглядит хорошо: исторические ценности хорошо сочетаются, и прогноз на День матери 2020 выглядит в высшей степени разумным. Но ценность и неопределенность для Дня святого Валентина 2020 года просто не выглядят правильно.

Time series prediction

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

1 Ответ

1 голос
/ 25 октября 2019

Поскольку день святого Валентина всегда 14-й, а данные о тенденциях в Google каждые 7 дней, в исторических данных есть несоответствие. В 2016 году пик приходился на неделю под названием «2016-02-07», за одну целую неделю до праздника, а в следующем году пик недели назывался «2017-02-12», всего за 2 дня до этого.

library(lubridate)
flowers %>%  
  filter(month(date) == 2) %>%
  group_by(yr = year(date)) %>%
  arrange(-hits) %>%
  slice(1)

# A tibble: 5 x 7
# Groups:   yr [5]
  date                 hits keyword geo   gprop category    yr
  <dttm>              <int> <chr>   <chr> <chr>    <int> <dbl>
1 2015-02-08 00:00:00    87 flowers world web          0  2015
2 2016-02-07 00:00:00    79 flowers world web          0  2016
3 2017-02-12 00:00:00    88 flowers world web          0  2017
4 2018-02-11 00:00:00    91 flowers world web          0  2018
5 2019-02-10 00:00:00    89 flowers world web          0  2019

Я подозреваю, что проблема в том, что пророк в некоторых случаях интерпретирует 14-е как близкое к пику, а иногда целую неделю после пика. Он видит всплеск, но его время не соответствует согласованной дате праздника, которую вы указали. Я не совсем уверен, как обойти это, не удаляя вручную временную несогласованность.

Если мы сместим выходные дни, чтобы выровнять их по датам, которым они соответствуют в данных, мы получим лучшее соответствие:

...  # using this list for valentines day dates, corresponding to peaks in data
holiday = "valentines_day",
    ds = as.Date(c(
      '2015-02-08',
      '2016-02-07',
      '2017-02-12',
      '2018-02-11',
      '2019-02-10',
      '2020-02-09'  # Corresponds to the Sunday beforehand, like prior spikes here
    ))
...

В результате:

trend chart

...