Прогноз модели h2o.automl в R - PullRequest
0 голосов
/ 04 января 2019

Я впервые пошел по уроку с h2o в R с здесь . То, что я хотел бы сделать, - это прогнозировать модель на основе данных, которых у меня нет, т.е. за пределами набора тестов, будущих дат.

Данные представляют собой временные ряды, и прогнозы на тестовом наборе выглядят так:

print(automl.error.tbl)
# A time tibble: 10 x 5
# Index: Time
   Time       actual  pred   error error.pct
   <date>      <dbl> <dbl>   <dbl>     <dbl>
 1 2018-01-31  11.4  11.4   0.0342   0.00300
 2 2018-02-28  14.6  10.4   4.24     0.290  
 3 2018-03-31  12.2  11.4   0.762    0.0625 
 4 2018-04-30  15.0  10.8   4.20     0.281  
 5 2018-05-31  12.8  11.1   1.75     0.137  
 6 2018-06-30   8.67 10.8  -2.15    -0.248  
 7 2018-07-31  12.3  10.3   2.03     0.165  
 8 2018-08-31  13.5  10.4   3.17     0.234  
 9 2018-09-30  10.8   9.72  1.05     0.0976 
10 2018-10-31  10.5  10.7  -0.165   -0.0156 

Что я не знаю, как сделать, и мне трудно найти, как предсказать будущие данные. Например, с fpp я могу сделать что-то вроде:

monthly.hw.fcast <- hw(
  monthly.rr.sub.xts
  , h = 12
  , alpha = monthly.fit.hw$alpha
)

И получите то, что я ищу, будущие прогнозы. Есть ли простой способ сделать это с моделью h20?

Мой код выглядит следующим образом:

# h2o ####
library(h2o)
tk.monthly %>% glimpse()
tk.monthly.aug <- tk.monthly %>%
  tk_augment_timeseries_signature()
tk.monthly.aug %>% glimpse()

tk.monthly.tbl.clean <- tk.monthly.aug %>%
  select_if(~ !is.Date(.)) %>%
  select_if(~ !any(is.na(.))) %>%
  mutate_if(is.ordered, ~ as.character(.) %>% as.factor)

tk.monthly.tbl.clean %>% glimpse()

train.tbl <- tk.monthly.tbl.clean %>% filter(year < 2017)
valid.tbl <- tk.monthly.tbl.clean %>% filter(year == 2017)
test.tbl  <- tk.monthly.tbl.clean %>% filter(year == 2018)

h2o.init()

train.h2o <- as.h2o(train.tbl)
valid.h2o <- as.h2o(valid.tbl)
test.h2o <- as.h2o(test.tbl)

y <- "readmit.rate"
x <- setdiff(names(train.h2o), y)

automl.models.h2o <- h2o.automl(
  x = x
  , y = y
  , training_frame = train.h2o
  , validation_frame = valid.h2o
  , leaderboard_frame = test.h2o
  , max_runtime_secs = 60
  , stopping_metric = "deviance"
)

automl.leader <- automl.models.h2o@leader

pred.h2o <- h2o.predict(
  automl.leader
  , newdata = test.h2o
)

h2o.performance(
  automl.leader
  , newdata = test.h2o
)

# get mape
automl.error.tbl <- tk.monthly %>%
  filter(lubridate::year(Time) == 2018) %>%
  add_column(
    pred = pred.h2o %>%
      as.tibble() %>%
      pull(predict)
    ) %>%
  rename(actual = readmit.rate) %>%
  mutate(
    error = actual - pred
    , error.pct = error / actual
  )
print(automl.error.tbl)

automl.error.tbl %>%
  summarize(
    me = mean(error)
    , rmse = mean(error^2)^0.5
    , mae = mean(abs(error))
    , mape = mean(abs(error))
    , mpe = mean(error.pct)
  ) %>%
  glimpse()

1 Ответ

0 голосов
/ 07 февраля 2019

Эти данные не подходят для стандартных контролируемых алгоритмов машинного обучения, таких как GBM, Random Forest, H2O AutoML и т. Д. Это проблема прогнозирования с использованием единой последовательности наблюдений, в которой «типичные» контролируемые алгоритмы машинного обучения предназначены для использоваться, когда у вас есть несколько (или много) столбцов предикторов, в дополнение к столбцу, который вы пытаетесь предсказать (ответ). Я хотел бы взглянуть на другие алгоритмы временных рядов / прогнозирования, такие как ARIMA, или использовать глубокую нейронную сеть, такую ​​как LSTM.

...