Hoàn toàn có thể sử dụng CNN để đưa ra dự đoán chuỗi thời gian là hồi quy hoặc phân loại. Các CNN rất giỏi trong việc tìm kiếm các mẫu cục bộ và trên thực tế, các CNN hoạt động với giả định rằng các mẫu cục bộ có liên quan ở mọi nơi. Ngoài ra chập là một hoạt động nổi tiếng trong chuỗi thời gian và xử lý tín hiệu. Một ưu điểm khác so với RNN là chúng có thể tính toán rất nhanh vì chúng có thể được song song hóa so với bản chất tuần tự RNN.
Trong đoạn mã dưới đây, tôi sẽ trình bày một nghiên cứu trường hợp trong đó có thể dự đoán nhu cầu điện trong R bằng cách sử dụng máy ảnh. Lưu ý rằng đây không phải là vấn đề phân loại (tôi không có ví dụ tiện dụng) nhưng không khó để sửa đổi mã để xử lý vấn đề phân loại (sử dụng đầu ra softmax thay vì đầu ra tuyến tính và mất entropy chéo).
Bộ dữ liệu có sẵn trong thư viện fpp2:
library(fpp2)
library(keras)
data("elecdemand")
elec <- as.data.frame(elecdemand)
dm <- as.matrix(elec[, c("WorkDay", "Temperature", "Demand")])
Tiếp theo chúng ta tạo một trình tạo dữ liệu. Điều này được sử dụng để tạo các lô dữ liệu đào tạo và xác nhận sẽ được sử dụng trong quá trình đào tạo. Lưu ý rằng mã này là phiên bản đơn giản hơn của trình tạo dữ liệu được tìm thấy trong cuốn sách "Deep Learning with R" (và phiên bản video của nó "Deep Learning with R in Motion") từ các ấn phẩm quản lý.
data_gen <- function(dm, batch_size, ycol, lookback, lookahead) {
num_rows <- nrow(dm) - lookback - lookahead
num_batches <- ceiling(num_rows/batch_size)
last_batch_size <- if (num_rows %% batch_size == 0) batch_size else num_rows %% batch_size
i <- 1
start_idx <- 1
return(function(){
running_batch_size <<- if (i == num_batches) last_batch_size else batch_size
end_idx <- start_idx + running_batch_size - 1
start_indices <- start_idx:end_idx
X_batch <- array(0, dim = c(running_batch_size,
lookback,
ncol(dm)))
y_batch <- array(0, dim = c(running_batch_size,
length(ycol)))
for (j in 1:running_batch_size){
row_indices <- start_indices[j]:(start_indices[j]+lookback-1)
X_batch[j,,] <- dm[row_indices,]
y_batch[j,] <- dm[start_indices[j]+lookback-1+lookahead, ycol]
}
i <<- i+1
start_idx <<- end_idx+1
if (i > num_batches){
i <<- 1
start_idx <<- 1
}
list(X_batch, y_batch)
})
}
Tiếp theo, chúng tôi chỉ định một số tham số được truyền vào các trình tạo dữ liệu của chúng tôi (chúng tôi tạo hai trình tạo một để đào tạo và một để xác thực).
lookback <- 72
lookahead <- 1
batch_size <- 168
ycol <- 3
Tham số nhìn lại là chúng ta muốn nhìn bao xa trong quá khứ và nhìn về phía trước trong tương lai chúng ta muốn dự đoán bao xa.
Tiếp theo, chúng tôi chia dữ liệu của chúng tôi và tạo hai trình tạo:
train_dm <- dm [1: 15000,]
val_dm <- dm[15001:16000,]
test_dm <- dm[16001:nrow(dm),]
train_gen <- data_gen(
train_dm,
batch_size = batch_size,
ycol = ycol,
lookback = lookback,
lookahead = lookahead
)
val_gen <- data_gen(
val_dm,
batch_size = batch_size,
ycol = ycol,
lookback = lookback,
lookahead = lookahead
)
Tiếp theo, chúng tôi tạo ra một mạng lưới thần kinh với một lớp chập và huấn luyện mô hình:
model <- keras_model_sequential() %>%
layer_conv_1d(filters=64, kernel_size=4, activation="relu", input_shape=c(lookback, dim(dm)[[-1]])) %>%
layer_max_pooling_1d(pool_size=4) %>%
layer_flatten() %>%
layer_dense(units=lookback * dim(dm)[[-1]], activation="relu") %>%
layer_dropout(rate=0.2) %>%
layer_dense(units=1, activation="linear")
model %>% compile(
optimizer = optimizer_rmsprop(lr=0.001),
loss = "mse",
metric = "mae"
)
val_steps <- 48
history <- model %>% fit_generator(
train_gen,
steps_per_epoch = 50,
epochs = 50,
validation_data = val_gen,
validation_steps = val_steps
)
Cuối cùng, chúng ta có thể tạo một số mã để dự đoán một chuỗi gồm 24 datapoint bằng một thủ tục đơn giản, được giải thích trong các bình luận R.
####### How to create predictions ####################
#We will create a predict_forecast function that will do the following:
#The function will be given a dataset that will contain weather forecast values and Demand values for the lookback duration. The rest of the MW values will be non-available and
#will be "filled-in" by the deep network (predicted). We will do this with the test_dm dataset.
horizon <- 24
#Store all target values in a vector
goal_predictions <- test_dm[1:(lookback+horizon),ycol]
#get a copy of the dm_test
test_set <- test_dm[1:(lookback+horizon),]
#Set all the Demand values, except the lookback values, in the test set to be equal to NA.
test_set[(lookback+1):nrow(test_set), ycol] <- NA
predict_forecast <- function(model, test_data, ycol, lookback, horizon) {
i <-1
for (i in 1:horizon){
start_idx <- i
end_idx <- start_idx + lookback - 1
predict_idx <- end_idx + 1
input_batch <- test_data[start_idx:end_idx,]
input_batch <- input_batch %>% array_reshape(dim = c(1, dim(input_batch)))
prediction <- model %>% predict_on_batch(input_batch)
test_data[predict_idx, ycol] <- prediction
}
test_data[(lookback+1):(lookback+horizon), ycol]
}
preds <- predict_forecast(model, test_set, ycol, lookback, horizon)
targets <- goal_predictions[(lookback+1):(lookback+horizon)]
pred_df <- data.frame(x = 1:horizon, y = targets, y_hat = preds)
và Voila:
Không tệ lắm.