시계열을위한 컨볼 루션 신경망?


21

시계열 분류를 수행하기 위해 회선 신경망을 훈련시키는 코드가 있는지 알고 싶습니다.

최근 논문 ( http://www.fer.unizg.hr/_download/repository/KDI-Djalto.pdf )을 보았지만 무언가가 있는지 또는 직접 코딩했는지는 확실하지 않습니다.


1
이봐, 정말 이상해 CNN은 이미지 (신호)를위한 매우 훌륭한 도구이며 그것들을 사용한 주식 예측에 관한 논문은 거의 없습니다 ... 제가 찾을 수있는 것은 당시에는 아무 것도 없었던 오래된 신경망에 관한 것입니다 ...
MasterID

답변:


21

오픈 소스 블랙 박스 솔루션을 원한다면 ML 알고리즘의 자바 라이브러리 인 Weka를 살펴보십시오 . 사람은 Weka에서 Covolutional Layers를 사용했으며 시계열 분류 작업에 맞게 분류 코드를 편집 할 수 있습니다.

자신의 코딩에 관해서는 ... python 라이브러리, theano를 사용하여 동일한 문제를 해결 하고 있습니다 (곧이 코드를 링크로 작성하면이 게시물을 편집 할 것입니다). 다음은 웹 검색에 도움이되는 모든 논문의 전체 목록입니다.

시작점으로 여기 에서 찾은 코드를 편집하여 다른 수의 범주를 기준으로 분류하거나 분류에서 회귀에 이르기까지 편집 할 수 있습니다. 최종 softmax 레이어를 제거하고 하나의 출력 노드 만 만들어이 작업을 수행했습니다. y=sin(x)테스트 와 같은 기능 조각에 대해 훈련했습니다 .


그냥 참고로-일부 오류가 많이 발견되어 맹목적으로 적용하지 마십시오. 특히 그들 중 일부는 출판 된 논문이 아닙니다. 이것은 비록 기초를 배울 수있는 좋은 출발점입니다
알렉산더 맥팔레인

여기에 언급 된 논문에 어떤 문제가 있는지에 대한 지식을 공유 할 수 있다면 감사하겠습니다.
bicepjai

1

CNN을 사용하여 회귀 또는 분류에 대한 시계열 예측을하는 것이 전적으로 가능합니다. CNN은 로컬 패턴을 찾는 데 능숙하며 실제로 CNN은 로컬 패턴이 모든 곳에서 관련이 있다고 가정합니다. 또한 회선은 시계열 및 신호 처리에서 잘 알려진 작업입니다. RNN의 또 다른 장점은 RNN 순차 특성과 반대로 병렬화 될 수 있기 때문에 계산 속도가 매우 빠르다는 것입니다.

아래 코드에서 나는 keras를 사용하여 R의 전력 수요를 예측할 수있는 사례 연구를 보여줄 것입니다. 이것은 분류 문제가 아니지만 (예제가 없었습니다) 분류 문제를 처리하기 위해 코드를 수정하는 것은 어렵지 않습니다 (선형 출력 및 교차 엔트로피 손실 대신 softmax 출력 사용).

데이터 세트는 fpp2 라이브러리에서 사용할 수 있습니다.

library(fpp2)
library(keras)

data("elecdemand")

elec <- as.data.frame(elecdemand)

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

다음으로 데이터 생성기를 만듭니다. 이것은 훈련 과정에서 사용될 일련의 훈련 및 검증 데이터를 생성하는 데 사용됩니다. 이 코드는 manning 간행물에서 "R을 사용한 딥 러닝"책 (및 "D 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

전환 확인 매개 변수는 과거에보고 싶은 거리와 미래에 얼마나 예측하고 싶은지를 나타냅니다.

다음으로 데이터 세트를 분할하고 두 개의 생성기를 만듭니다.

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
)

다음으로 컨볼 루션 레이어로 신경망을 만들고 모델을 학습시킵니다.

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
)

마지막으로 R 주석에 설명 된 간단한 절차를 사용하여 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)

그리고 짜잔 :

여기에 이미지 설명을 입력하십시오

나쁘지 않아.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.