如何将所有训练集的预测误差提取到R中的单个数据帧中?
我所说的预测误差是指预测值和实际值之间的差异 我正在用一种叫做长短时记忆(LSTM)的深度学习模型进行时间序列分析,该模型基于这一伟大的理论。作者将数据集分为11个样本来训练模型,然后进行未来的预测<运行此模型需要代码>keras程序包。它使用的是TensorFlow后端 我想做的是得到任何预测值的置信水平。例如,假设模型预测周五将有56个太阳黑子。我想找出太阳黑子数量超过平均值50的概率(这只是一个任意数字) 对于这个问题,我能想到的一个可能的解决方案(请告诉我是否有更好的解决方法)是获得误差的分布(预测值和实际值之间的差异),然后计算Z分数并查找概率,假设为正态分布。在我的例子中,错误是6(56-50) 在上面提到的文章中,11个样本预测(如何将所有训练集的预测误差提取到R中的单个数据帧中?,r,tensorflow,keras,lstm,tibble,R,Tensorflow,Keras,Lstm,Tibble,我所说的预测误差是指预测值和实际值之间的差异 我正在用一种叫做长短时记忆(LSTM)的深度学习模型进行时间序列分析,该模型基于这一伟大的理论。作者将数据集分为11个样本来训练模型,然后进行未来的预测keras程序包。它使用的是TensorFlow后端 我想做的是得到任何预测值的置信水平。例如,假设模型预测周五将有56个太阳黑子。我想找出太阳黑子数量超过平均值50的概率(这只是一个任意数字) 对于这个问题,我能想到的一个可能的解决方案(请告诉我是否有更好的解决方法)是获得误差的分布(预测值和实际值
sample\u predictions\u tbl
)位于一个tible
中,类为“rolling\u origin”“rset”“tbl\u df”“tbl”“data.frame”
。我想知道是否有办法从所有样本中提取误差(预测值-实际值),并将其转换为单个数据帧,以便绘制误差直方图
# Core Tidyverse
library(tidyverse)
library(glue)
library(forcats)
# Time Series
library(timetk)
library(tidyquant)
library(tibbletime)
# Visualization
library(cowplot)
# Preprocessing
library(recipes)
# Sampling / Accuracy
library(rsample)
library(yardstick)
# Modeling
library(keras)
# Install Keras if you have not installed before
install_keras()
sun_spots <- datasets::sunspot.month %>%
tk_tbl() %>%
mutate(index = as_date(index)) %>%
as_tbl_time(index = index)
# Distribute the samples into 11 sets
periods_train <- 12 * 50
periods_test <- 12 * 10
skip_span <- 12 * 20
rolling_origin_resamples <- rolling_origin(
sun_spots,
initial = periods_train,
assess = periods_test,
cumulative = FALSE,
skip = skip_span
)
split <- rolling_origin_resamples$splits
# Backtesting on all samples
predict_keras_lstm <- function(split, epochs = 300, ...) {
lstm_prediction <- function(split, epochs, ...) {
# 5.1.2 Data Setup
df_trn <- training(split)
df_tst <- testing(split)
df <- bind_rows(
df_trn %>% add_column(key = "training"),
df_tst %>% add_column(key = "testing")
) %>%
as_tbl_time(index = index)
# 5.1.3 Preprocessing
rec_obj <- recipe(value ~ ., df) %>%
step_sqrt(value) %>%
step_center(value) %>%
step_scale(value) %>%
prep()
df_processed_tbl <- bake(rec_obj, df)
center_history <- rec_obj$steps[[2]]$means["value"]
scale_history <- rec_obj$steps[[3]]$sds["value"]
# 5.1.4 LSTM Plan
lag_setting <- 120 # = nrow(df_tst)
batch_size <- 40
train_length <- 440
tsteps <- 1
epochs <- 300
# 5.1.5 Train/Test Setup
lag_train_tbl <- df_processed_tbl %>%
mutate(value_lag = lag(value, n = lag_setting)) %>%
filter(!is.na(value_lag)) %>%
filter(key == "training") %>%
tail(train_length)
x_train_vec <- lag_train_tbl$value_lag
x_train_arr <- array(data = x_train_vec, dim = c(length(x_train_vec), 1, 1))
y_train_vec <- lag_train_tbl$value
y_train_arr <- array(data = y_train_vec, dim = c(length(y_train_vec), 1))
lag_test_tbl <- df_processed_tbl %>%
mutate(
value_lag = lag(value, n = lag_setting)
) %>%
filter(!is.na(value_lag)) %>%
filter(key == "testing")
x_test_vec <- lag_test_tbl$value_lag
x_test_arr <- array(data = x_test_vec, dim = c(length(x_test_vec), 1, 1))
y_test_vec <- lag_test_tbl$value
y_test_arr <- array(data = y_test_vec, dim = c(length(y_test_vec), 1))
# 5.1.6 LSTM Model
model <- keras_model_sequential()
model %>%
layer_lstm(units = 50,
input_shape = c(tsteps, 1),
batch_size = batch_size,
return_sequences = TRUE,
stateful = TRUE) %>%
layer_lstm(units = 50,
return_sequences = FALSE,
stateful = TRUE) %>%
layer_dense(units = 1)
model %>%
compile(loss = 'mae', optimizer = 'adam')
# 5.1.7 Fitting LSTM
for (i in 1:epochs) {
model %>% fit(x = x_train_arr,
y = y_train_arr,
batch_size = batch_size,
epochs = 1,
verbose = 1,
shuffle = FALSE)
model %>% reset_states()
cat("Epoch: ", i)
}
# 5.1.8 Predict and Return Tidy Data
# Make Predictions
pred_out <- model %>%
predict(x_test_arr, batch_size = batch_size) %>%
.[,1]
# Retransform values
pred_tbl <- tibble(
index = lag_test_tbl$index,
value = (pred_out * scale_history + center_history)^2
)
# Combine actual data with predictions
tbl_1 <- df_trn %>%
add_column(key = "actual")
tbl_2 <- df_tst %>%
add_column(key = "actual")
tbl_3 <- pred_tbl %>%
add_column(key = "predict")
# Create time_bind_rows() to solve dplyr issue
time_bind_rows <- function(data_1, data_2, index) {
index_expr <- enquo(index)
bind_rows(data_1, data_2) %>%
as_tbl_time(index = !! index_expr)
}
ret <- list(tbl_1, tbl_2, tbl_3) %>%
reduce(time_bind_rows, index = index) %>%
arrange(key, index) %>%
mutate(key = as_factor(key))
return(ret)
}
safe_lstm <- possibly(lstm_prediction, otherwise = NA)
safe_lstm(split, epochs, ...)
}
# Modified epochs to 10 to reduce processing time
predict_keras_lstm(split, epochs = 10)
# Map to all samples
sample_predictions_lstm_tbl <- rolling_origin_resamples %>%
mutate(predict = map(splits, predict_keras_lstm, epochs = 5))
#核心Tidyverse
图书馆(tidyverse)
图书馆(胶水)
图书馆(供猫用)
#时间序列
图书馆(timetk)
图书馆(tidyquant)
图书馆(藏书时代)
#形象化
图书馆(cowplot)
#预处理
图书馆(食谱)
#取样/准确度
图书馆(rsample)
图书馆(尺度)
#造型
图书馆(keras)
#如果以前未安装Keras,请安装Keras
安装_keras()
太阳黑子%
tk_tbl()%>%
变异(索引=截止日期(索引))%>%
as_tbl_时间(索引=索引)
#将样品分为11组
置信区间和实际数高于/低于某个任意数的概率是两个不同的问题。你想得到什么?查找标准偏差与标准误差。@hmhensen我试图得到高于或低于某个任意数字的概率。换句话说,我需要预测误差的标准差。数学相对容易。我遇到的问题是将所有预测错误从tibble
结构中的所有样本(类为“滚动原点”“rset”“tbl\u df”“tbl”“data.frame”
)获取到一个数据帧中。抱歉,我一直很忙。我试图复制你的代码,但是predict\u keras\u lstm(split,epochs=10)
只为我生成了NA
。这应该发生吗?@hmhensen不必担心。您是否安装了\u keras()
?这行代码基本上为11个样本中的每一个生成预测。如果您阅读LSTM文章,第一个名为Keras Stateful LSTM:Backtested Predictions的图就是此代码结果的可视化。