Contoh prediksi deret waktu menggunakan jaringan saraf pada R

8

Adakah yang punya contoh pendidikan singkat yang cepat bagaimana menggunakan jaringan saraf ( nnetdalam R misalnya) untuk tujuan prediksi?

Berikut adalah contoh, dalam R, dari deret waktu

T <- seq(0,20,length=200)
Y <- 1 + 3*cos(4*T+2) +.2*T^2 + rnorm(200)
plot(T,Y,type="l")

Ini hanya sebuah contoh tetapi yang saya miliki adalah data musiman yang gelisah.

dfhgfh
sumber

Jawaban:

15

Rob Hyndman sedang melakukan beberapa penelitian aktif tentang peramalan dengan jaring nueral. Dia baru-baru ini menambahkan nnetar()fungsi ke forecastpaket yang menggunakan nnetpaket yang Anda rujuk agar sesuai dengan data deret waktu.

http://cran.r-project.org/web/packages/forecast/index.html

Contoh dari dokumen bantuan:

fit <- nnetar(lynx)
fcast <- forecast(fit)
plot(fcast)

Rob memberikan lebih banyak konteks di bagian spesifik teks daring ini: Peramalan: prinsip dan praktik .

(Dan terima kasih banyak pada Rob.)

Shea Parkes
sumber
Ini bagus, tetapi hanya ada umpan ke depan
Tommaso Guerrini
2

Sedang mencari hal yang sama dan menemukan pertanyaan ini. Karena saya belum menemukan contoh, saya memutuskan untuk membuatnya sendiri. Sadarilah, saya bukan ahli dalam jaring saraf atau peramalan :)

Untuk memodelkan time-series secara efektif dengan neural nets (nnets), saya percaya nnet properti yang penting harus dimiliki adalah semacam memori (melacak apa yang terjadi di masa lalu). Oleh karena itu, jaring umpan maju mungkin merupakan ide yang buruk. Salah satu keluarga dalam jaring yang secara efektif dapat mensimulasikan memori adalah keluarga dari jaringan saraf berulang dan salah satu jenis jaringan saraf berulang yang paling dikenal mungkin jaringan Elman (bersama-sama dengan jaring memori jangka pendek (LSTM) panjang saya akan katakan). Untuk menemukan lebih banyak tentang jaringan Elman, Anda dapat membaca makalah asli yang memperkenalkan konsep atau melalui Wikipedia . Singkatnya, mereka memiliki lapisan tambahan yang disebut konteks yang digunakan sebagai jenis memori. Gambar ( sumber ) berikut menggambarkan ide tersebut

Jaringan Berulang Sederhana dari jenis Elman

Beruntung bagi kami, ada paket RSNNS di R yang mampu menyesuaikan jaring Elman. Paket ini dijelaskan secara rinci di sini .

Sekarang kita telah mempelajari dasar-dasarnya, mari kita lihat bagaimana kita dapat mengimplementasikan contoh dalam R dengan paket RSNNS.

library(RSNNS)

#
# simulate an arima time series example of the length n
#
set.seed(10001)
n <- 100
ts.sim <- arima.sim(list(order = c(1,1,0), ar = 0.7), n = n-1)

#
# create an input data set for ts.sim
# sw = sliding-window size
#
# the last point of the time series will not be used
#   in the training phase, only in the prediction/validation phase
# 
sw <- 1
X <- lapply(sw:(n-2),
       function(ind){
           ts.sim[(ind-sw+1):ind]
       })
X <- do.call(rbind, X)
Y <- sapply(sw:(n-2),
       function(ind){
           ts.sim[ind+1]
       })

# used to validate prediction properties
# on the last point of the series
newX <- ts.sim[(n-sw):(n-1)]
newY <- ts.sim[n]

# build an elman network based on the input
model <- elman(X, Y,
               size = c(10, 10),
               learnFuncParams = c(0.001),
               maxit = 500,
               linOut = TRUE)

#
# plot the results
#
limits <- range(c(Y, model$fitted.values))

plot(Y, type = "l", col="red",
     ylim=limits, xlim=c(0, length(Y)),
     ylab="", xlab="")
lines(model$fitted.values, col = "green", type="l")

points(length(Y)+1, newY, col="red", pch=16)
points(length(Y)+1, predict(model, newdata=newX),
       pch="X", col="green")

Kode ini harus menghasilkan gambar berikut masukkan deskripsi gambar di sini

Jadi yang kami lakukan dengan kode adalah sebagai berikut. Pertama, kami telah membuat contoh deret waktu (dari model ARIMA). Setelah itu kita memisahkan / mengiris contoh deret waktu menjadi input formulir (sw poin sebelumnya, titik berikutnya) untuk semua pasangan kecuali yang terakhir (dengan titik berikutnya sebagai titik terakhir dari contoh deret waktu). Parameter sw digunakan untuk mendefinisikan "jendela geser". Saya tidak akan berdebat di sini apa ukuran yang tepat untuk jendela geser tetapi hanya perhatikan bahwa karena jaringan Elman memiliki memori, jendela geser ukuran satu lebih dari pendekatan yang masuk akal (juga, lihat posting ini ).

Setelah persiapan selesai kita cukup membangun jaringan Elman dengan fungsi elman. Ada dua parameter yang harus Anda perhatikan; ukuran dan learningFuncParams. Parameter ukuran memberi Anda cara untuk menentukan ukuran jaringan (lapisan tersembunyi) dan cara Anda memilih parameter ini lebih merupakan seni daripada sains. Aturan praktis untuk learnFuncParams adalah tetap kecil jika layak (kekuatan pemrosesan Anda memungkinkan Anda tetap kecil / Anda punya cukup waktu untuk menunggu: D).

Dan voila, Anda memiliki jaringan saraf yang mampu memprediksi titik / nilai masa depan. Kekuatan prediktif dari pendekatan ini untuk contoh kita diilustrasikan pada gambar sebelumnya. Kurva merah menyajikan rangkaian waktu simulasi kami (tanpa titik terakhir) dan kurva hijau apa yang diperoleh dengan jaringan Elman yang sesuai. Titik merah menunjukkan titik terakhir (titik yang tidak digunakan selama proses pemasangan) dan titik hijau apa yang diprediksi oleh jaringan pas. Tidak buruk sama sekali :)

Ini adalah contoh tentang cara menggunakan RNN (jaringan Elman) dengan R untuk membuat prediksi / perkiraan. Beberapa mungkin berpendapat bahwa RNN bukan yang terbaik untuk masalah dan bahwa ada model nnet yang lebih baik untuk peramalan. Karena saya bukan ahli dalam mengajukan, saya akan menghindari membahas masalah ini.

Bacaan yang menarik jika Anda ingin menemukan lebih banyak tentang RNN adalah tinjauan kritis RNN dalam makalah pembelajaran urutan .

iugrina
sumber
Jalan yang menarik untuk dijelajahi, terima kasih. Saya akan tertarik untuk melihat bagaimana ini melakukan prediksi ke depan dengan beberapa periode lagi.
Morgan Ball
1
@MorganBall: Terima kasih. Jangan lupa untuk mengadaptasi input / output Anda untuk pelatihan secara tepat untuk prediksi yang lebih lama / lebih jauh.
iugrina