Mạng thần kinh chuyển đổi cho chuỗi thời gian?


21

Tôi muốn biết nếu có tồn tại một mã để đào tạo một mạng lưới thần kinh tích chập để thực hiện phân loại chuỗi thời gian.

Tôi đã thấy một số bài báo gần đây ( http://www.fer.unizg.hr/_doad/reposeective/KDI-Djalto.pdf ) nhưng tôi không chắc liệu có tồn tại một cái gì đó hay tôi có tự mình viết mã không.


1
Người đàn ông, nó rất lạ. CNN là công cụ tuyệt vời cho hình ảnh (tín hiệu) và hầu như không có tài liệu nào về dự đoán cổ phiếu sử dụng chúng ... Tất cả những gì tôi có thể tìm thấy là về các mạng thần kinh cũ không có gì tốt vào thời điểm đó ...
MasterID

Câu trả lời:


21

Nếu bạn muốn một giải pháp hộp đen nguồn mở, hãy thử xem Weka , một thư viện java về các thuật toán ML. Anh chàng này cũng đã sử dụng Lớp Covolutional trong Weka và bạn có thể chỉnh sửa mã phân loại của mình để phù hợp với nhiệm vụ phân loại chuỗi thời gian.

Về việc mã hóa của riêng bạn ... Tôi đang giải quyết vấn đề tương tự bằng thư viện python, theano (Tôi sẽ chỉnh sửa bài đăng này bằng một liên kết đến mã của tôi nếu tôi sớm bẻ khóa nó). Dưới đây là danh sách đầy đủ tất cả các giấy tờ tôi sẽ sử dụng để giúp tôi sau một giờ tìm kiếm trên web:

Để bắt đầu, bạn có thể chỉnh sửa mã được tìm thấy ở đây để phân loại theo một số loại khác nhau hoặc chỉnh sửa mã từ phân loại sang hồi quy - Tôi đã làm điều này bằng cách xóa lớp softmax cuối cùng và chỉ tạo một nút đầu ra. Tôi đã đào tạo nó trên các lát của một chức năng như y=sin(x)một bài kiểm tra.


Chỉ cần FYI - Tôi đã tìm thấy rất nhiều lỗi trong một số trong số này vì vậy đừng áp dụng chúng một cách mù quáng. Đáng chú ý là một số trong số họ không được công bố giấy tờ. Đây là một điểm khởi đầu tốt để học những điều cơ bản mặc dù
Alexander McFarlane

Nó sẽ được đánh giá cao nếu bạn có thể chia sẻ kiến ​​thức có được của bạn về những giấy tờ được đề cập ở đây có vấn đề?
bicepjai

1

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:

nhập mô tả hình ảnh ở đây

Không tệ lắm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.