เครือข่ายประสาทเทียมสำหรับอนุกรมเวลา?


21

ฉันต้องการที่จะทราบว่ามีรหัสในการฝึกอบรมโครงข่ายประสาทเทียมเพื่อการจำแนกประเภทอนุกรมเวลาหรือไม่

ฉันเคยเห็นเอกสารล่าสุด ( http://www.fer.unizg.hr/_download/repository/KDI-Djalto.pdf ) แต่ฉันไม่แน่ใจว่ามีบางสิ่งอยู่หรือถ้าฉันทำรหัสด้วยตัวเอง


1
ผู้ชายมันแปลกมาก ซีเอ็นเอ็นเป็นเครื่องมือที่ยอดเยี่ยมมากสำหรับภาพ (สัญญาณ) และแทบจะไม่มีเอกสารเกี่ยวกับการคาดการณ์การใช้สต็อก ... ทั้งหมดที่ฉันสามารถหาได้คือเกี่ยวกับเครือข่ายประสาทเก่าที่ดีสำหรับสิ่งใดในเวลา ...
MasterID

คำตอบ:


21

หากคุณต้องการโซลูชันกล่องดำแบบโอเพนซอร์สลองดูที่Wekaซึ่งเป็นไลบรารี java ของ ML algorithm นี้คนยังใช้เลเยอร์ Covolutional ใน Weka และคุณสามารถแก้ไขรหัสการจำแนกของเขาเพื่อให้เหมาะกับเวลางานชุดการจัดหมวดหมู่

สำหรับการเข้ารหัสของคุณเอง ... ฉันกำลังทำงานกับปัญหาเดียวกันโดยใช้ห้องสมุดหลามtheano (ฉันจะแก้ไขโพสต์นี้ด้วยลิงค์ไปยังรหัสของฉันถ้าฉันแตกในไม่ช้า) นี่คือรายการที่ครอบคลุมของเอกสารทั้งหมดที่ฉันจะใช้เพื่อช่วยฉันจากชั่วโมงที่ดีของการค้นหาเว็บ:

ในฐานะที่เป็นจุดเริ่มต้นคุณสามารถแก้ไขรหัสที่พบที่นี่เพื่อจัดหมวดหมู่กับจำนวนหมวดหมู่ที่แตกต่างกันหรือแก้ไขจากการจัดหมวดหมู่ไปสู่การถดถอย - ฉันทำสิ่งนี้โดยการลบเลเยอร์ softmax สุดท้ายและสร้างโหนดเอาต์พุตเพียงโหนดเดียว ฉันฝึกมันเป็นฟังก์ชั่นเหมือนy=sin(x)เป็นการทดสอบ


เพียงแค่ FYI - ฉันพบข้อผิดพลาดจำนวนมากในบางส่วนของข้อผิดพลาดเหล่านี้ดังนั้นอย่านำไปใช้แบบสุ่ม โดยเฉพาะอย่างยิ่งบางคนไม่ได้รับการตีพิมพ์เอกสาร นี่เป็นจุดเริ่มต้นที่ดีในการเรียนรู้พื้นฐาน
Alexander McFarlane

มันจะได้รับการชื่นชมถ้าคุณสามารถแบ่งปันความรู้ที่คุณได้รับเกี่ยวกับสิ่งที่กล่าวถึงที่นี่มีปัญหา?
bicepjai

1

เป็นไปได้ทั้งหมดที่จะใช้ CNN ในการทำนายอนุกรมเวลาไม่ว่าจะเป็นการถดถอยหรือการจัดประเภท ซีเอ็นเอ็นนั้นดีในการค้นหารูปแบบของท้องถิ่นและในความเป็นจริงซีเอ็นเอ็นนั้นทำงานได้โดยมีสมมติฐานว่ารูปแบบของท้องถิ่นนั้นมีความเกี่ยวข้องทุกที่ นอกจากนี้ Convolution ยังเป็นที่รู้จักกันดีในเรื่องอนุกรมเวลาและการประมวลผลสัญญาณ ข้อได้เปรียบอีกข้อหนึ่งของ RNN ก็คือพวกมันสามารถคำนวณได้เร็วมากเนื่องจากสามารถทำการขนานได้เมื่อเทียบกับลำดับของ RNN

ในรหัสด้านล่างฉันจะแสดงกรณีศึกษาซึ่งเป็นไปได้ที่จะทำนายความต้องการไฟฟ้าใน R โดยใช้ keras โปรดทราบว่านี่ไม่ใช่ปัญหาการจัดหมวดหมู่ (ฉันไม่ได้มีตัวอย่างที่มีประโยชน์) แต่ก็ไม่ยากที่จะแก้ไขรหัสเพื่อจัดการกับปัญหาการจัดหมวดหมู่ (ใช้เอาต์พุต softmax แทนเอาต์พุตเชิงเส้นและการสูญเสียเอนโทรปี)

ชุดข้อมูลนั้นมีอยู่ในไลบรารี fpp2:

library(fpp2)
library(keras)

data("elecdemand")

elec <- as.data.frame(elecdemand)

dm <- as.matrix(elec[, c("WorkDay", "Temperature", "Demand")])

ต่อไปเราจะสร้างตัวสร้างข้อมูล ใช้สำหรับสร้างชุดการฝึกอบรมและข้อมูลการตรวจสอบความถูกต้องที่จะใช้ในระหว่างกระบวนการฝึกอบรม โปรดทราบว่ารหัสนี้เป็นเครื่องมือสร้างข้อมูลรุ่นที่เรียบง่ายกว่าที่พบในหนังสือ "Deep Learning with R" (และรุ่นวิดีโอของมัน "Deep Learning with R in Motion") จากการเผยแพร่แมนนิ่ง

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

พารามิเตอร์ lookback คือระยะไกลในอดีตที่เราต้องการดูและ lookahead ไกลแค่ไหนในอนาคตที่เราต้องการทำนาย

ต่อไปเราจะแยกชุดข้อมูลของเราและสร้างเครื่องกำเนิดไฟฟ้าสองเครื่อง:

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
)

ต่อไปเราจะสร้างโครงข่ายประสาทเทียมด้วยเลเยอร์ convolutional และฝึกฝนโมเดล:

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 ดาต้าพอยน์โดยใช้ขั้นตอนง่าย ๆ อธิบายในความคิดเห็น 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)

และ voila:

ป้อนคำอธิบายรูปภาพที่นี่

ก็ไม่เลวนะ.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.