如何使用h2o.predict预测时间序列的未来值

时间:2019-06-19 11:41:18

标签: r machine-learning h2o

我正在阅读“使用R进行动手时间序列分析”这本书,并且使用机器学习h2o程序包停留在示例上。我不知道如何使用h2o.predict函数。在示例中,它需要newdata参数,在这种情况下,它是测试数据。但是,如果您实际上不知道时间值的未来值,该如何预测呢?

如果我只是忽略newdata参数,则会得到:尚未实现缺少newdata参数的预测。

library(h2o)

h2o.init(max_mem_size = "16G")


train_h <- as.h2o(train_df)
test_h <- as.h2o(test_df)
forecast_h <- as.h2o(forecast_df)


x <- c("month", "lag12", "trend", "trend_sqr")
y <- "y"

rf_md <- h2o.randomForest(training_frame = train_h,
                          nfolds = 5,
                          x = x,
                          y = y,
                          ntrees = 500,
                          stopping_rounds = 10,
                          stopping_metric = "RMSE",
                          score_each_iteration = TRUE,
                          stopping_tolerance = 0.0001,
                          seed = 1234)

h2o.varimp_plot(rf_md)

rf_md@model$model_summary

library(plotly)

tree_score <- rf_md@model$scoring_history$training_rmse
plot_ly(x = seq_along(tree_score), y = tree_score,
        type = "scatter", mode = "line") %>%
  layout(title = "Random Forest Model - Trained Score History",
         yaxis = list(title = "RMSE"),
         xaxis = list(title = "Num. of Trees"))

test_h$pred_rf <- h2o.predict(rf_md, test_h)

test_1 <- as.data.frame(test_h)

mape_rf <- mean(abs(test_1$y - test_1$pred_rf) / test_1$y)
mape_rf

2 个答案:

答案 0 :(得分:2)

H2O-3不支持传统的时间序列算法(例如ARIMA)。相反,建议将时间序列用例视为监督学习问题,并执行时间序列特定的预处理。

例如,如果您的目标是预测明天商店的销售量,则可以将其视为回归问题,而目标是销售量。但是,如果您尝试在原始数据上训练监督学习模型,则您的表现很可能会很差。因此,诀窍是添加诸如滞后之类的历史属性作为预处理步骤。

如果我们在未更改的数据集上训练模型,则平均绝对误差约为35%。

enter image description here

如果我们开始添加历史特征,例如该商店前一天的销售额,则可以将平均绝对误差降低到15%左右。

enter image description here

虽然H2O-3不支持滞后,但是您可以利用气泡水来执行此预处理。您可以使用Spark生成每个组的滞后,然后使用H2O-3训练回归模型。这是此过程的示例:https://github.com/h2oai/h2o-tutorials/tree/master/best-practices/forecasting

答案 1 :(得分:0)

训练数据train_df必须在xc("month", "lag12", "trend", "trend_sqr"))和y"y")中列出所有列,而数据您给h2o.predict()提供的内容只需要在x中包含这些列即可; y列将作为预测返回。

由于(在x中具有诸如滞后,趋势等特征,因此这是一个时间序列并不重要。 (但是在准备这些功能时,您必须非常小心,以确保您不会使用当时不知道的任何信息-但我想这本书已经在强调这一点了。)

通常使用时间序列,对于训练数据中的给定行,您的x数据是时间t已知的数据,而y列中的值是感兴趣的值时间t + 1。因此,在进行预测时,您将x值指定为当前值 ,然后返回的预测就是接下来将要发生的情况。