Perbandingan NARXNET dengan NNTOOL untuk Peramalan Data Time-Series

Narnet merupakan penerapan neural network untuk prediksi data time series. Berbeda dengan prediksi data biasa yang mengandalkan atribut/variabel, prediksi data time series, atau dikenal dengan istilah proyeksi (projection), hanya mengandalkan riwayat data sebelumnya (historical data). Maka neural network untuk prediksi menjadikan data sebelumnya sebagai atribut yang digunakan saat pelatihan (training) maupun prediksi (simulating). Sementara itu, muncul Narxnet dengan istilah “x” yang berarti variabel eksternal (external). Variabel ini oleh matlab diberi istilah “external input” atau ada juga yang menyebut dengan istilah “intervention indicators” (lihat situs ini). Variabel ini tidak terlibat sebagai variabel yang berasal dari time series tetapi dijadikan variabel prediksi. Postingan yang lalu sepertinya cukup baik menjelaskan teknik ini.

Matlab telah memberikan layanan toolbox untuk penerapan Narxnet baik yang berbasis GUI maupun command. Yang berbasis command sepertinya lebih baik karena dapat digunakan untuk data berukuran kurang dari lima. Masalah yang sering muncul adalah akurasi hasil pelatihan ketika memprediksi data ke depan. Memang dapat dilakukan pelatihan ulang, tetapi tetap saja menjadi ragu-ragu untuk diterapkan, apalagi kesalahan yang terjadi bukan hanya dari sisi besaran melainkan arahnya (harusnya naik malah turun). Coba kita praktekan dengan data sederhana agar lebih mudah diketahui error-nya.

Data di atas merupakan data yang terdiri dari data time series dari satu sampai lima dan external input dari seribu hingga 1060. Kita diminta membuat Narxnet, melatihnya, dan memprediksi data setelah lima (tentu saja hasilnya dapat ditebak yaitu 6 dan 7). Listing berikut menggunakan toolbox Narxnet di Matlab. Atau buka panduannya dengan mengetik help narxnet di command window dan isi data time series dengan nama variabel t dan external input dengan nama variabel x. Jangan lupa tipe data yang digunakan adalah sequence.

  • t={1 2 3 4 5};
  • x={1000 1010 1020 1030 1040};
  • net = narxnet(1:2,1:2,10);
  • [X,Xi,Ai,T] = preparets(net,x,{},t);
  • net = train(net,X,T,Xi,Ai);
  • view(net)
  • Y = net(X,Xi,Ai)
  • perf = perform(net,Y,T)

Hasil training dapat dilihat pada gambar berikut (kiri) dan tampilan hasil Narxnet (kanan). Ada 7 plot yang tersedia untuk melihat kinerja pelatihan antara lain: performance, training state, error histogram, regression, time series response, error autocorrelation, dan input-error cross-correlation.

Step-Ahead Form

Step-Ahead form sering digunakan pada Nernet yang tanpa menggunakan External input. Perhatikan kode yang dicetak tebal di atas. Delay yang digunakan pada gambar di atas adalah 1 langkah. Fungsi yang diperlukan adalah fungsi Remove delay.

  • nets = removedelay(net);
  • view(net)
  • [Xs,Xis,Ais,Ts] = preparets(nets,x,{},t);
  • Ys = nets(Xs,Xis,Ais)
  • Ys =
  • [3.0000] [4.0000] [5.0000] [4.2465]

Hasilnya kurang menggembirakan, seharusnya 6.0000 tapi malah turun (4.2465). Salah satu cara untuk memperbaikinya adalah melakukan pelatihan ulang hingga diperoleh hasil yang memuaskan.

Multistep Prediction

Untuk Narxnet, ada pilihan lain yaitu Multistep prediction. Metode ini mengandalkan keunggulan dari external input. Makin banyak external input makin baik tetapi tentu saja persoalan berubah dari proyeksi menjadi prediksi biasa, dan data time series jadi tidak signifikan lagi manfaatnya.

Prinsip kerjanya adalah menggunakan lingkar terbuka (open loop) untuk merakit Narxnet dari data yang tersedia kemudian merubahnya menjadi lingkar tertutup (closed loop). Narxnet yang sudah dalam bentuk lingkar tertutup kemudian digunakan untuk memprediksi hanya berdasarkan data external input. Kembali ke kasus di atas, dengan Multistep prediction Narxnet dibagi menjadi dua segmen yaitu segmen dengan target/output yang diketahui dan yang hanya diketahui external input-nya saja (x). Di sini time stap yang tersedia hanya dua yaitu data keenam (1050) dan ketujuh (1060). Gunakan t yang sama dengan kasus sebelumnya, tetapi dengan x yang ditambah dengan dua data sebagai dasar patokan untuk memprediksi t.

  • x={1000 1010 1020 1030 1040 1050 1060};
  • numTimesteps = size(x,2);
  • knownOutputTimesteps = 1:(numTimesteps-5);
  • predictOutputTimesteps = (numTimesteps-4):numTimesteps;
  • x1 = x(1,knownOutputTimesteps);
  • t1 = t(1,knownOutputTimesteps);
  • x2 = x(1,predictOutputTimesteps);

Perhatikan penggunaan fungsi closeloop untuk membuat lingkar tertutup dari network yang telah dilatih sebelumnya.

  • [Xo,Xio,Aio,To] = preparets(net,x1,{},t1);
  • [Y1,Xfo,Afo] = net(Xo,Xio,Aio);
  • [netc,Xic,Aic] = closeloop(net,Xfo,Afo);
  • [Y2,Xfc,Afc] = netc(x2,Xic,Aic);

Hasilnya disimpan dalam variabel Y2 yakni [4.2465] dan [0.2789]. Sangat tidak akurat dan harus dilatih ulang. Untuk mengulangnya tinggal copy-paste lagi kode-kode di atas. Berikut untuk training kedua:

  • Y2 =
  • [3.0000] [4.0000] [5.0000] [7.2076] [8.8717]

Masih kurang akurat (terlalu besar). Berikut ini akan dicoba tidak dengan Narxnet melainkan NNTOOL seperti biasa apakah hasilnya lebih baik?

Prediksi Data Time Series dengan NNTOOL

Seperti dibahas di awal, data deret waktu yang lampau dijadikan variabel untuk memprediksi data berikutnya. Variabel external input ditambahkan sebagai data eksternal. Gunakan data berikut ini untuk training. Terus terang saya agak kagok dengan format kolom nntool, saya lebih suka format baris seperti tabel biasa, jadi saya menggunakan transpose setelah memasukan data dengan format baris agar berganti kolom yang sesuai dengan nntool.

  • data=[1 2 1020; 2 3 1030; 3 4 1040];
  • data=transpose(data);
  • target=[3;4;5];
  • target=transpose(target);

Panggil fungsi nntool untuk membuka GUI perancangan neural network (lebih jelasnya lihat postingan JST). Perhatikan penggunaan fungsi PURELIN agar neural network mampu memprediksi nilai yang diluar rentang data pelatihan.

Hasil pelatihan disimpan dengan nama network1 yang akan digunakan untuk memprediksi data yang akan datang. Dengan menggeser (shifting window) satu persatu, diperoleh data keenam dan ketujuh sebagai berikut.

  • dataenam=[4 5 1050];
  • dataenam=transpose(dataenam);
  • proj6=sim(network1,dataenam)
  • proj6 =
  • 6.0000
  • datatujuh=[5 6.0000 1060];
  • datatujuh=transpose(datatujuh);
  • proj7=sim(network1,datatujuh)
  • proj7 =
  • 7.0000

Perhatikan, hasilnya sangat akurat yaitu data keenam dan ketujuh berturut-turut 6.0000 dan 7.0000 hanya dengan sekali proses pelatihan. Itulah mengapa saya lebih suka menggunakan NNTOOL untuk meramalkan data baik dengan maupun yang tanpa external input. Problem ini sudah saya coba baik dengan Matlab 2008b maupun Matlab 2013. Mohon masukan dari pembaca.

Iklan

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s