Zaman serisi için evrişimli sinir ağı?


21

Zaman serisi sınıflandırması yapmak için evrişimli bir sinir ağını eğitmek için bir kod olup olmadığını bilmek istiyorum.

Bazı yeni makaleler gördüm ( http://www.fer.unizg.hr/_download/repository/KDI-Djalto.pdf ) ama bir şey olup olmadığından veya kendim kodladığımdan emin değilim.


1
Dostum çok garip. CNN, görüntüler (sinyaller) için çok harika bir araçtır ve bunları kullanarak stok tahmini hakkında neredeyse hiç kağıt yoktur ... Tüm bulabildiğim, o zamanlar hiçbir şey için iyi olmayan eski sinir ağları hakkında ...
MasterID

Yanıtlar:


21

Açık kaynaklı bir kara kutu çözümü istiyorsanız , ML algoritmalarının bir java kütüphanesi olan Weka'ya bakmayı deneyin . Bu adam aynı zamanda Weka'da Covolutional Layers'ı kullandı ve sınıflandırma kodunu zaman serisi sınıflandırma görevine uyacak şekilde düzenleyebilirsiniz.

Kendinizinkini kodlama gelince ... python kütüphanesi, theano kullanarak aynı sorun üzerinde çalışıyorum (yakında bu yazıyı kıracağım zaman bu yazıyı kodumun bağlantısıyla düzenleyeceğim). İşte web'de arama yapmamın bir saatinden itibaren yardım etmek için kullanacağım tüm makalelerin kapsamlı bir listesi:

Başlangıç ​​noktası olarak, burada bulunan kodu , farklı kategorilere göre sınıflandırmak için düzenleyebilir ya da sınıflandırmadan regresyona düzenleyebilirsiniz - Bunu, son softmax katmanını kaldırarak ve sadece bir çıkış düğümü yaparak yaptım. y=sin(x)Test gibi bir işlevin dilimlerinde eğittim .


Sadece FYI - Bunlardan bazılarında çok fazla hata buldum, bu yüzden onları kör etmeyin. Özellikle bazıları yayınlanmış yazılar değildir. Bu temelleri öğrenmek için iyi bir başlangıç ​​noktasıdır
Alexander McFarlane

Burada bahsi geçen evraklarla ilgili olarak edindiğiniz bilgileri paylaşırsanız memnun oluruz.
bicepjai

1

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:

görüntü tanımını buraya girin

Fena değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.