समय श्रृंखला के लिए संवेदी तंत्रिका नेटवर्क?


21

मैं यह जानना चाहूंगा कि क्या समय-श्रृंखला वर्गीकरण करने के लिए एक जटिल तंत्रिका जाल को प्रशिक्षित करने के लिए एक कोड मौजूद है।

मैंने हाल के कुछ कागज़ात देखे हैं ( http://www.fer.unizg.hr/_download/repository/KDI-Djalto.pdf ) लेकिन मुझे यकीन नहीं है कि कुछ मौजूद है या नहीं, अगर मैं इसे खुद से कोड करता हूं।


1
यार, यह बहुत अजीब है। CNN छवियों (संकेतों) के लिए बहुत ही बढ़िया उपकरण हैं और उनके उपयोग के बारे में स्टॉक की भविष्यवाणी के बारे में कोई कागजात नहीं हैं ... सभी मुझे मिल सकते हैं पुराने तंत्रिका नेटवर्क के बारे में जो उस समय कुछ नहीं के लिए अच्छे थे ...
MasterID

जवाबों:


21

यदि आप एक खुला स्रोत ब्लैक-बॉक्स समाधान चाहते हैं, तो Weka को देखें , जो कि एमएल एल्गोरिदम की एक जावा लाइब्रेरी है। इस आदमी ने भी Weka में कोवलुशनल लेयर्स का इस्तेमाल किया है और आप एक टाइम सीरीज के वर्गीकरण कार्य के लिए अपने वर्गीकरण कोड को संपादित कर सकते हैं।

के रूप में अपने खुद के कोडन के लिए ... मैं अजगर पुस्तकालय का उपयोग कर एक ही समस्या पर काम कर रहा हूँ, थीनो (मैं अपने कोड के लिए एक लिंक के साथ इस पोस्ट को संपादित करेगा अगर मैं इसे जल्द ही दरार)। यहां उन सभी पत्रों की एक व्यापक सूची दी गई है जिनका उपयोग मैं वेब पर खोज करने के अच्छे घंटे से करने में करूंगा:

एक प्रारंभिक बिंदु के रूप में, आप एक अलग संख्या में श्रेणियों के खिलाफ वर्गीकृत करने के लिए यहां पाए गए कोड को संपादित कर सकते हैं , या इसे वर्गीकरण से प्रतिगमन तक संपादित कर सकते हैं - मैंने अंतिम सॉफ्टमैक्स परत को हटाकर सिर्फ एक आउटपुट नोड बनाकर ऐसा किया। मैंने इसे y=sin(x)एक परीक्षण की तरह एक समारोह के स्लाइस पर प्रशिक्षित किया ।


सिर्फ FYI करें - मुझे इनमें से कुछ में बहुत सारी त्रुटियां मिलीं, इसलिए इन्हें आँख बंद करके लागू न करें। विशेष रूप से उनमें से कुछ प्रकाशित पत्र नहीं हैं। मूल बातें सीखने के लिए यह एक अच्छा प्रारंभिक बिंदु है
अलेक्जेंडर मैकफर्लेन

यह सराहना की जाएगी यदि आप अपने अधिग्रहीत ज्ञान को साझा कर सकते हैं कि यहां वर्णित कागजात में क्या समस्या है?
द्विसपजई २३'१६

1

सीएनएन का उपयोग पूरी तरह से संभव है कि समय की श्रृंखला की भविष्यवाणी करने के लिए यह प्रतिगमन या वर्गीकरण हो। सीएनएन स्थानीय पैटर्न खोजने में अच्छे हैं और वास्तव में सीएनएन इस धारणा के साथ काम करते हैं कि स्थानीय पैटर्न हर जगह प्रासंगिक हैं। साथ ही सजा समय श्रृंखला और सिग्नल प्रोसेसिंग में एक प्रसिद्ध ऑपरेशन है। RNN पर एक और लाभ यह है कि वे गणना करने के लिए बहुत तेज़ हो सकते हैं क्योंकि उन्हें RNN क्रमिक प्रकृति के विपरीत समानांतर किया जा सकता है।

नीचे दिए गए कोड में मैं एक केस स्टडी दिखाऊंगा जहां आर केरस का उपयोग करके बिजली की मांग का अनुमान लगाना संभव है। ध्यान दें कि यह एक वर्गीकरण समस्या नहीं है (मेरे पास एक उदाहरण काम नहीं है) लेकिन एक वर्गीकरण समस्या को संभालने के लिए कोड को संशोधित करना मुश्किल नहीं है (एक रैखिक उत्पादन के बजाय एक सॉफ्टमैक्स आउटपुट का उपयोग करें और एक क्रॉस एन्ट्रॉपी लॉस)।

डेटासेट fpp2 लाइब्रेरी में उपलब्ध है:

library(fpp2)
library(keras)

data("elecdemand")

elec <- as.data.frame(elecdemand)

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

आगे हम एक डेटा जनरेटर बनाते हैं। यह प्रशिक्षण प्रक्रिया के दौरान उपयोग किए जाने वाले प्रशिक्षण और सत्यापन डेटा के बैच बनाने के लिए उपयोग किया जाता है। ध्यान दें कि यह कोड मैनिंग प्रकाशनों की पुस्तक "डीप लर्निंग विथ आर" (और इसका वीडियो संस्करण "डीप लर्निंग विथ आर इन मोशन") में पाया गया एक डेटा जनरेटर का सरल संस्करण है।

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)

और वोइला:

यहाँ छवि विवरण दर्ज करें

इतना भी बेकार नहीं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.