Rete neurale convoluzionale per serie storiche?


21

Vorrei sapere se esiste un codice per addestrare una rete neurale convoluzionale per la classificazione delle serie temporali.

Ho visto alcuni articoli recenti ( http://www.fer.unizg.hr/_download/repository/KDI-Djalto.pdf ) ma non sono sicuro che esista qualcosa o se lo devo codificare da solo.


1
Amico, è molto strano. La CNN è uno strumento fantastico per le immagini (segnali) e non ci sono quasi articoli sulla previsione delle scorte che li usano ... Tutto quello che posso trovare riguarda le vecchie reti neurali che all'epoca non andavano bene ...
MasterID

Risposte:


21

Se vuoi una soluzione open source black-box, prova a guardare Weka , una libreria java di algoritmi ML. Questo ragazzo ha anche usato i livelli di Covolutional in Weka e potresti modificare il suo codice di classificazione per adattarlo a un'attività di classificazione delle serie storiche.

Per quanto riguarda la codifica del tuo ... Sto lavorando allo stesso problema usando la libreria python, theano (modificherò questo post con un link al mio codice se lo creo presto). Ecco un elenco completo di tutti gli articoli che userò per aiutarmi da una buona ora di ricerche sul web:

Come punto di partenza, è possibile modificare il codice trovato qui per classificarlo in base a un diverso numero di categorie o modificarlo dalla classificazione alla regressione: l'ho fatto rimuovendo il layer finale di softmax e creando un solo nodo di output. L'ho allenato su sezioni di una funzione come y=sin(x)un test.


Cordiali saluti - Ho riscontrato molti errori in alcuni di questi, quindi non applicarli alla cieca. In particolare alcuni di essi non sono articoli pubblicati. Questo è un buon punto di partenza per apprendere le basi
Alexander McFarlane,

Sarebbe gradito se tu potessi condividere le tue conoscenze acquisite su quali documenti citati qui hanno problemi?
Bicepjai,

1

È del tutto possibile utilizzare una CNN per fare previsioni sulle serie temporali, che si tratti di regressione o classificazione. Le CNN sono brave a trovare modelli locali e in effetti le CNN lavorano sul presupposto che i modelli locali siano rilevanti ovunque. Anche la convoluzione è un'operazione ben nota nelle serie temporali e nell'elaborazione del segnale. Un altro vantaggio rispetto agli RNN è che possono essere molto veloci da calcolare poiché possono essere parallelizzati rispetto alla natura sequenziale RNN.

Nel codice che segue mostrerò un caso di studio in cui è possibile prevedere la domanda di elettricità in R usando le telecamere. Si noti che questo non è un problema di classificazione (non ho avuto un esempio utile) ma non è difficile modificare il codice per gestire un problema di classificazione (utilizzare un output softmax invece di un output lineare e una perdita di entropia incrociata).

Il set di dati è disponibile nella libreria fpp2:

library(fpp2)
library(keras)

data("elecdemand")

elec <- as.data.frame(elecdemand)

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

Successivamente creiamo un generatore di dati. Questo è usato per creare lotti di dati di addestramento e validazione da usare durante il processo di addestramento. Si noti che questo codice è una versione più semplice di un generatore di dati trovato nel libro "Deep Learning with R" (e la versione video di "Deep Learning with R in Motion") da pubblicazioni manning.

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)

  })
}

Successivamente specifichiamo alcuni parametri da trasmettere ai nostri generatori di dati (creiamo due generatori uno per la formazione e uno per la convalida).

lookback <- 72
lookahead <- 1
batch_size <- 168
ycol <- 3

Il parametro lookback è quanto lontano vogliamo guardare nel passato e lo sguardo quanto lontano vogliamo prevedere in futuro.

Successivamente dividiamo il nostro set di dati e creiamo due generatori:

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
)

Successivamente creiamo una rete neurale con uno strato convoluzionale e formiamo il modello:

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
)

Infine, possiamo creare del codice per prevedere una sequenza di 24 punti dati usando una semplice procedura, spiegata nei commenti 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)

e voilà:

inserisci qui la descrizione dell'immagine

Non male.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.