Zaman serisi tahminlerini regresyon veya sınıflandırma yapmak için bir CNN kullanmak tamamen mümkündür. CNN'ler yerel kalıpları bulmakta iyidir ve aslında CNN'ler, yerel kalıpların her yerde alakalı olduğu varsayımıyla çalışır. Ayrıca evrişim, zaman serilerinde ve sinyal işlemede iyi bilinen bir işlemdir. RNN'lere göre bir başka avantajı, RNN sıralı doğasına zıt olarak paralelleştirilebildiklerinden hesaplama için çok hızlı olmalarıdır.
Aşağıdaki kodda, R cinsinden elektrik talebini keras kullanarak tahmin etmenin mümkün olduğu bir durum çalışması göstereceğim. Bunun bir sınıflandırma sorunu olmadığını unutmayın (kullanışlı bir örneğim yoktu) ancak bir sınıflandırma problemini işlemek için kodu değiştirmek zor değildir (doğrusal bir çıktı yerine bir softmax çıkışı kullanın ve bir çapraz entropi kaybı).
Veri kümesi fpp2 kütüphanesinde bulunur:
library(fpp2)
library(keras)
data("elecdemand")
elec <- as.data.frame(elecdemand)
dm <- as.matrix(elec[, c("WorkDay", "Temperature", "Demand")])
Sonra bir veri üreteci yaratacağız. Bu, eğitim sürecinde kullanılacak eğitim ve validasyon verileri toplu oluşturmak için kullanılır. Bu kodun, manning yayınlarından "R ile Derin Öğrenme" kitabında (ve "Hareket Halinde R ile Derin Öğrenme" adlı video kitabında) bulunan bir veri oluşturucunun daha basit bir versiyonudur.
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)
})
}
Daha sonra veri üreticilerimize iletilecek bazı parametreleri belirledik (biri eğitim için diğeri doğrulama için iki jeneratör yaratıyoruz).
lookback <- 72
lookahead <- 1
batch_size <- 168
ycol <- 3
Lookback parametresi, geçmişte ne kadar uzağa bakmak istediğimizi, gelecekte ise ne kadar ileride tahmin etmek istediğimizi göstermektedir.
Sonra veri setimizi böldük ve iki üretici oluşturduk:
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
)
Sonra bir evrişimli katmanı olan bir sinir ağı yaratıp modeli eğitelim:
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
)
Son olarak, R yorumlarında açıklanan basit bir prosedür kullanarak 24 veri noktasından oluşan bir diziyi tahmin etmek için bir kod oluşturabiliriz.
####### 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)
ve işte:
Fena değil.