সময় সিরিজের পূর্বাভাসগুলি তা রিগ্রেশন বা শ্রেণিবদ্ধকরণে করা সম্পূর্ণভাবে সিএনএন ব্যবহার করা সম্ভব। সিএনএনগুলি স্থানীয় নিদর্শনগুলি সন্ধান করতে ভাল এবং বাস্তবে সিএনএনগুলি এই ধারণাটি নিয়ে কাজ করে যে স্থানীয় নিদর্শনগুলি যে কোনও জায়গায় প্রাসঙ্গিক। এছাড়াও কনভোলশন সময় সিরিজ এবং সিগন্যাল প্রসেসিংয়ের একটি সুপরিচিত অপারেশন। আরএনএনগুলির সাথে আরেকটি সুবিধা হ'ল তারা গণনা করাতে খুব দ্রুত হতে পারে কারণ তারা আরএনএন অনুক্রমিক প্রকৃতির বিপরীতে সমান্তরালভাবে তৈরি হতে পারে।
নীচের কোডটিতে আমি একটি কেস স্টাডি প্রদর্শন করব যেখানে আর কেরাস ব্যবহার করে বিদ্যুতের চাহিদা পূর্বাভাস দেওয়া সম্ভব। দ্রষ্টব্য যে এটি কোনও শ্রেণিবদ্ধকরণের সমস্যা নয় (আমার কাছে উদাহরণটি কার্যকর ছিল না) তবে শ্রেণিবদ্ধকরণ সমস্যা পরিচালনা করতে কোড পরিবর্তন করা কঠিন নয় (লিনিয়ার আউটপুট এবং ক্রস এনট্রপি ক্ষতির পরিবর্তে একটি সফটম্যাক্স আউটপুট ব্যবহার করুন)।
ডেটাসেটটি fpp2 লাইব্রেরিতে পাওয়া যায়:
library(fpp2)
library(keras)
data("elecdemand")
elec <- as.data.frame(elecdemand)
dm <- as.matrix(elec[, c("WorkDay", "Temperature", "Demand")])
পরবর্তী আমরা একটি ডেটা জেনারেটর তৈরি করি। প্রশিক্ষণ প্রক্রিয়া চলাকালীন ব্যাচিংয়ের বৈধতা এবং বৈধতা ডেটা তৈরি করার জন্য এটি ব্যবহার করা হয়। নোট করুন যে এই কোডটি "ডেপ লার্নিং উইথ আর" বইটিতে পাওয়া ডেটা জেনারেটরের একটি সহজ সংস্করণ (এবং এর ভিডিও সংস্করণ "ডিপ লার্নিং উইথ আর মোশন") প্রকাশনা থেকে প্রাপ্ত from
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)
})
}
এরপরে আমরা আমাদের ডেটা জেনারেটরে পাস করার জন্য কয়েকটি পরামিতি নির্দিষ্ট করি (আমরা দুটি জেনারেটর তৈরি করি একটি প্রশিক্ষণের জন্য এবং একটি বৈধতার জন্য)।
lookback <- 72
lookahead <- 1
batch_size <- 168
ycol <- 3
লুকব্যাক প্যারামিটারটি হ'ল অতীতে আমরা কতদূর দেখতে চাই এবং ভবিষ্যতে আমরা কতদূর ভবিষ্যদ্বাণী করতে চাই look
এরপরে আমরা আমাদের ডেটাসেটকে বিভক্ত করে দুটি জেনারেটর তৈরি করি:
ট্রেন_ডিএম <- ডিএম [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
)
পরবর্তী আমরা একটি কনভ্যুশনাল স্তর সহ একটি নিউরাল নেটওয়ার্ক তৈরি করি এবং মডেলটিকে প্রশিক্ষণ দিন:
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
)
অবশেষে, আমরা একটি সাধারণ পদ্ধতি ব্যবহার করে 24 ডেটাপয়েন্টগুলির ক্রমিকের পূর্বাভাস দেওয়ার জন্য কিছু কোড তৈরি করতে পারি, আর মন্তব্যে ব্যাখ্যা করে।
####### 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)
এবং ভয়েলা:
এতোটা খারাপ না.