ANN menggunakan package (nnet)

Back Propagation

Keterbatasan Jaringan Syaraf Tiruan ketika hanya menggunakan layar tunggal dalam mengenali pola merupakan satu kekurangan dari jaringan dengan arsitektur tersebut. Kekurangan ini kemudian bisa ditanggulangi dengan menambahkan lagi beberapa layar tersembunyi diantara layar input dan output. Penambahan satu atau lebih layar tersembunyi membuat jaringan memiliki kemampuan untuk menyesuaikan bobot-bobot namun menyebabkan pelatihannya memerlukan waktu yang lebih lama. Maka sebaiknya mencoba dengan mengawali menambahkan satu layar tersembunyi lebih dahulu.

Backpropagation merupakan algoritma pembelajaran terawasi atau yang memiliki target dengan mengubah dan menyesuaikan nilai pada bobot-bobot yang terhubung dengan neuron-neuron yang ada pada lapisan tersembunyinya. Algoritma backpropagation melakukan perambatan maju (feed forward propagation) seperti pada perceptron terlebih dahulu, neuron-neuron diaktifkan dengan menggunakan fungsi aktivasi yang bisa dideferensiasikan, sehingga kemudian didapatkan error atau selisih antara nilai setelah diaktivasi atau output dengan target dan kemudian menggunakan error output ini untuk mengubah nilai bobot-bobotnya dalam arah mundur (backward propagation).

Alt text

Alt text

Kita akan menggunakan contoh pada “example” dalam paket nnet

library(nnet)

ir <- rbind(iris3[,,1],iris3[,,2],iris3[,,3])

targets <- class.ind( c(rep(“s”, 50), rep(“c”, 50), rep(“v”, 50)) )

samp <- c(sample(1:50,25), sample(51:100,25), sample(101:150,25))

ir1 <- nnet(ir[samp,], targets[samp,], size = 2, rang = 0.1,

test.cl <- function(true, pred) {

}

test.cl(targets[-samp,], predict(ir1, ir[-samp,]))

kemudian dapat kita bahas skrip diatas perbaris, di dalam R ada beberapa dataset yang sudah menjadi bawaannya, contohnya bunga iris, didalam R terdapat dua jenis data bunga iris. yang pertama adalah ‘iris’ saja dan yang berikutnya ‘iris3’. Data pada ‘iris’ tersusun perbaris dengan 5 variabel, sedangkan pada data ‘iris3’ tersusun sesuai kelompok Spesiesnya.

library(nnet)
data(iris)
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
data(iris3)
iris3
## , , Setosa
## 
##       Sepal L. Sepal W. Petal L. Petal W.
##  [1,]      5.1      3.5      1.4      0.2
##  [2,]      4.9      3.0      1.4      0.2
##  [3,]      4.7      3.2      1.3      0.2
##  [4,]      4.6      3.1      1.5      0.2
##  [5,]      5.0      3.6      1.4      0.2
##  [6,]      5.4      3.9      1.7      0.4
##  [7,]      4.6      3.4      1.4      0.3
##  [8,]      5.0      3.4      1.5      0.2
##  [9,]      4.4      2.9      1.4      0.2
## [10,]      4.9      3.1      1.5      0.1
## [11,]      5.4      3.7      1.5      0.2
## [12,]      4.8      3.4      1.6      0.2
## [13,]      4.8      3.0      1.4      0.1
## [14,]      4.3      3.0      1.1      0.1
## [15,]      5.8      4.0      1.2      0.2
## [16,]      5.7      4.4      1.5      0.4
## [17,]      5.4      3.9      1.3      0.4
## [18,]      5.1      3.5      1.4      0.3
## [19,]      5.7      3.8      1.7      0.3
## [20,]      5.1      3.8      1.5      0.3
## [21,]      5.4      3.4      1.7      0.2
## [22,]      5.1      3.7      1.5      0.4
## [23,]      4.6      3.6      1.0      0.2
## [24,]      5.1      3.3      1.7      0.5
## [25,]      4.8      3.4      1.9      0.2
## [26,]      5.0      3.0      1.6      0.2
## [27,]      5.0      3.4      1.6      0.4
## [28,]      5.2      3.5      1.5      0.2
## [29,]      5.2      3.4      1.4      0.2
## [30,]      4.7      3.2      1.6      0.2
## [31,]      4.8      3.1      1.6      0.2
## [32,]      5.4      3.4      1.5      0.4
## [33,]      5.2      4.1      1.5      0.1
## [34,]      5.5      4.2      1.4      0.2
## [35,]      4.9      3.1      1.5      0.2
## [36,]      5.0      3.2      1.2      0.2
## [37,]      5.5      3.5      1.3      0.2
## [38,]      4.9      3.6      1.4      0.1
## [39,]      4.4      3.0      1.3      0.2
## [40,]      5.1      3.4      1.5      0.2
## [41,]      5.0      3.5      1.3      0.3
## [42,]      4.5      2.3      1.3      0.3
## [43,]      4.4      3.2      1.3      0.2
## [44,]      5.0      3.5      1.6      0.6
## [45,]      5.1      3.8      1.9      0.4
## [46,]      4.8      3.0      1.4      0.3
## [47,]      5.1      3.8      1.6      0.2
## [48,]      4.6      3.2      1.4      0.2
## [49,]      5.3      3.7      1.5      0.2
## [50,]      5.0      3.3      1.4      0.2
## 
## , , Versicolor
## 
##       Sepal L. Sepal W. Petal L. Petal W.
##  [1,]      7.0      3.2      4.7      1.4
##  [2,]      6.4      3.2      4.5      1.5
##  [3,]      6.9      3.1      4.9      1.5
##  [4,]      5.5      2.3      4.0      1.3
##  [5,]      6.5      2.8      4.6      1.5
##  [6,]      5.7      2.8      4.5      1.3
##  [7,]      6.3      3.3      4.7      1.6
##  [8,]      4.9      2.4      3.3      1.0
##  [9,]      6.6      2.9      4.6      1.3
## [10,]      5.2      2.7      3.9      1.4
## [11,]      5.0      2.0      3.5      1.0
## [12,]      5.9      3.0      4.2      1.5
## [13,]      6.0      2.2      4.0      1.0
## [14,]      6.1      2.9      4.7      1.4
## [15,]      5.6      2.9      3.6      1.3
## [16,]      6.7      3.1      4.4      1.4
## [17,]      5.6      3.0      4.5      1.5
## [18,]      5.8      2.7      4.1      1.0
## [19,]      6.2      2.2      4.5      1.5
## [20,]      5.6      2.5      3.9      1.1
## [21,]      5.9      3.2      4.8      1.8
## [22,]      6.1      2.8      4.0      1.3
## [23,]      6.3      2.5      4.9      1.5
## [24,]      6.1      2.8      4.7      1.2
## [25,]      6.4      2.9      4.3      1.3
## [26,]      6.6      3.0      4.4      1.4
## [27,]      6.8      2.8      4.8      1.4
## [28,]      6.7      3.0      5.0      1.7
## [29,]      6.0      2.9      4.5      1.5
## [30,]      5.7      2.6      3.5      1.0
## [31,]      5.5      2.4      3.8      1.1
## [32,]      5.5      2.4      3.7      1.0
## [33,]      5.8      2.7      3.9      1.2
## [34,]      6.0      2.7      5.1      1.6
## [35,]      5.4      3.0      4.5      1.5
## [36,]      6.0      3.4      4.5      1.6
## [37,]      6.7      3.1      4.7      1.5
## [38,]      6.3      2.3      4.4      1.3
## [39,]      5.6      3.0      4.1      1.3
## [40,]      5.5      2.5      4.0      1.3
## [41,]      5.5      2.6      4.4      1.2
## [42,]      6.1      3.0      4.6      1.4
## [43,]      5.8      2.6      4.0      1.2
## [44,]      5.0      2.3      3.3      1.0
## [45,]      5.6      2.7      4.2      1.3
## [46,]      5.7      3.0      4.2      1.2
## [47,]      5.7      2.9      4.2      1.3
## [48,]      6.2      2.9      4.3      1.3
## [49,]      5.1      2.5      3.0      1.1
## [50,]      5.7      2.8      4.1      1.3
## 
## , , Virginica
## 
##       Sepal L. Sepal W. Petal L. Petal W.
##  [1,]      6.3      3.3      6.0      2.5
##  [2,]      5.8      2.7      5.1      1.9
##  [3,]      7.1      3.0      5.9      2.1
##  [4,]      6.3      2.9      5.6      1.8
##  [5,]      6.5      3.0      5.8      2.2
##  [6,]      7.6      3.0      6.6      2.1
##  [7,]      4.9      2.5      4.5      1.7
##  [8,]      7.3      2.9      6.3      1.8
##  [9,]      6.7      2.5      5.8      1.8
## [10,]      7.2      3.6      6.1      2.5
## [11,]      6.5      3.2      5.1      2.0
## [12,]      6.4      2.7      5.3      1.9
## [13,]      6.8      3.0      5.5      2.1
## [14,]      5.7      2.5      5.0      2.0
## [15,]      5.8      2.8      5.1      2.4
## [16,]      6.4      3.2      5.3      2.3
## [17,]      6.5      3.0      5.5      1.8
## [18,]      7.7      3.8      6.7      2.2
## [19,]      7.7      2.6      6.9      2.3
## [20,]      6.0      2.2      5.0      1.5
## [21,]      6.9      3.2      5.7      2.3
## [22,]      5.6      2.8      4.9      2.0
## [23,]      7.7      2.8      6.7      2.0
## [24,]      6.3      2.7      4.9      1.8
## [25,]      6.7      3.3      5.7      2.1
## [26,]      7.2      3.2      6.0      1.8
## [27,]      6.2      2.8      4.8      1.8
## [28,]      6.1      3.0      4.9      1.8
## [29,]      6.4      2.8      5.6      2.1
## [30,]      7.2      3.0      5.8      1.6
## [31,]      7.4      2.8      6.1      1.9
## [32,]      7.9      3.8      6.4      2.0
## [33,]      6.4      2.8      5.6      2.2
## [34,]      6.3      2.8      5.1      1.5
## [35,]      6.1      2.6      5.6      1.4
## [36,]      7.7      3.0      6.1      2.3
## [37,]      6.3      3.4      5.6      2.4
## [38,]      6.4      3.1      5.5      1.8
## [39,]      6.0      3.0      4.8      1.8
## [40,]      6.9      3.1      5.4      2.1
## [41,]      6.7      3.1      5.6      2.4
## [42,]      6.9      3.1      5.1      2.3
## [43,]      5.8      2.7      5.1      1.9
## [44,]      6.8      3.2      5.9      2.3
## [45,]      6.7      3.3      5.7      2.5
## [46,]      6.7      3.0      5.2      2.3
## [47,]      6.3      2.5      5.0      1.9
## [48,]      6.5      3.0      5.2      2.0
## [49,]      6.2      3.4      5.4      2.3
## [50,]      5.9      3.0      5.1      1.8

sehingga nampak perbedaan susunan pada data ‘iris’ dan ‘iris3’

kemudian pada contoh kali ini digunakan gabungan (rbind) dari data iris3[,,1], iris3[,,2] dan iris3[,,3] yang berarti menggabungkan semua data iris dalam barisan yang terurut dengan tidak menyertakan ‘spesiesnya’. Gabungan data tersebut sebanyak 150 baris dengan empat variabel diberi nama baru yakni ‘ir’.

head(iris3[,,1])
##      Sepal L. Sepal W. Petal L. Petal W.
## [1,]      5.1      3.5      1.4      0.2
## [2,]      4.9      3.0      1.4      0.2
## [3,]      4.7      3.2      1.3      0.2
## [4,]      4.6      3.1      1.5      0.2
## [5,]      5.0      3.6      1.4      0.2
## [6,]      5.4      3.9      1.7      0.4
ir <- rbind(iris3[,,1],iris3[,,2],iris3[,,3])
head(ir)
##      Sepal L. Sepal W. Petal L. Petal W.
## [1,]      5.1      3.5      1.4      0.2
## [2,]      4.9      3.0      1.4      0.2
## [3,]      4.7      3.2      1.3      0.2
## [4,]      4.6      3.1      1.5      0.2
## [5,]      5.0      3.6      1.4      0.2
## [6,]      5.4      3.9      1.7      0.4
tail(ir)
##        Sepal L. Sepal W. Petal L. Petal W.
## [145,]      6.7      3.3      5.7      2.5
## [146,]      6.7      3.0      5.2      2.3
## [147,]      6.3      2.5      5.0      1.9
## [148,]      6.5      3.0      5.2      2.0
## [149,]      6.2      3.4      5.4      2.3
## [150,]      5.9      3.0      5.1      1.8

data ‘ir’ tersebut dianggap sebagai 4 node input dalam jaringan. Kemudian kita susun data target sebagai node outputnya.

targets <- class.ind( c(rep("s", 50), rep("c", 50), rep("v", 50)) )

target disini disusun dengan huruf s sebanyak 50 baris, huruf c sebanyak 50 baris dan huruf v sebanyak 50 baris, masing-masing mewakili spesiesnya. Jadi node ouputnya sebanyak 3 node dengan masing-masing node mewakili huruf s, c, dan v.

head(targets)
##      c s v
## [1,] 0 1 0
## [2,] 0 1 0
## [3,] 0 1 0
## [4,] 0 1 0
## [5,] 0 1 0
## [6,] 0 1 0
tail(targets)
##        c s v
## [145,] 0 0 1
## [146,] 0 0 1
## [147,] 0 0 1
## [148,] 0 0 1
## [149,] 0 0 1
## [150,] 0 0 1

kemudian dalam neural network dipergunakan konsep ‘data latih’ dan ‘data uji’ artinya sebagian data asli digunakan unuk melatih jaringan agar dapat mengenali pola dan sebagian lagi digunakan sebagai data uji dari jaringan yang telah dilatih tersebut. Jumlah data yang digunakan untuk latih dan uji berbeda-beda, ada beberapa yang menggunakan konsep 80% data digunakan untuk latih dan 20% nya digunakan untuk data uji. Dalam contoh kali ini akan digunakan 50% data latih dan 50% data uji.

samp <- c(sample(1:50,25), sample(51:100,25), sample(101:150,25))

Contoh perintah pada ‘sample(1:50,25)’ adalah memilih sebanyak 25 data secara acak dari data nomor urut 1 sampai 50.

sample(1:50,25)
##  [1] 39 13 43 20 34 18 28 41 49 22 37 23 47 36 46  3  4 35 44 45  8 19 11
## [24]  7 25

tentunya hasilnya akan berbeda-beda karena sistem melakukan pengambilan secara acak. Sehingga total akan didapatkan data sebanyak 75 dari masing-masing spesies. Data tersebut diberi nama ‘samp’.

Dengan data latih dan targetnya sebanyak 75 baris, maka kemudian kita bisa melatih jaringan untuk mengenali pola setiap spesies dengan menggunakan library(nnet) dengan perintah ‘nnet’ dan menyimpannya dengan nama ‘ir1’.

ir1 <- nnet(ir[samp,], targets[samp,], size = 2, rang = 0.1,
            decay = 5e-4, maxit = 200)
## # weights:  19
## initial  value 55.733820 
## iter  10 value 48.497468
## iter  20 value 28.857696
## iter  30 value 26.236688
## iter  40 value 26.207610
## iter  50 value 26.162149
## iter  60 value 26.103700
## iter  70 value 21.617969
## iter  80 value 17.460119
## iter  90 value 17.337671
## iter 100 value 2.884610
## iter 110 value 1.496395
## iter 120 value 1.217720
## iter 130 value 0.878850
## iter 140 value 0.644271
## iter 150 value 0.570435
## iter 160 value 0.488337
## iter 170 value 0.459668
## iter 180 value 0.455806
## iter 190 value 0.452383
## iter 200 value 0.451526
## final  value 0.451526 
## stopped after 200 iterations

jika kita ingin melihat hasil dari perintah ‘nnet’ maka kita bisa ketikkan ‘ir1’

ir1 
## a 4-2-3 network with 19 weights
## options were - decay=5e-04
str(ir1)
## List of 15
##  $ n            : num [1:3] 4 2 3
##  $ nunits       : int 10
##  $ nconn        : num [1:11] 0 0 0 0 0 0 5 10 13 16 ...
##  $ conn         : num [1:19] 0 1 2 3 4 0 1 2 3 4 ...
##  $ nsunits      : int 10
##  $ decay        : num 5e-04
##  $ entropy      : logi FALSE
##  $ softmax      : logi FALSE
##  $ censored     : logi FALSE
##  $ value        : num 0.452
##  $ wts          : num [1:19] -0.479 -2.792 -9.272 5.292 11.238 ...
##  $ convergence  : int 1
##  $ fitted.values: num [1:75, 1:3] 0.0139 0.0147 0.0149 0.0135 0.0149 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : NULL
##   .. ..$ : chr [1:3] "c" "s" "v"
##  $ residuals    : num [1:75, 1:3] -0.0139 -0.0147 -0.0149 -0.0135 -0.0149 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : NULL
##   .. ..$ : chr [1:3] "c" "s" "v"
##  $ call         : language nnet.default(x = ir[samp, ], y = targets[samp, ], size = 2, rang = 0.1,      decay = 5e-04, maxit = 200)
##  - attr(*, "class")= chr "nnet"

kemudian kita ingin melihat hasil prediksi antara data asli dengan sisa dari data latih atau data uji yang ingin kita prediksikan dengan membuat sebuah fungsi yang memberikan hasil berupa tabel antara data asli dengan hasil prediksi

test.cl <- function(true, pred) {
    true <- max.col(true)
    cres <- max.col(pred)
    table(true, cres)
}

kemudian sisa data latih (samp) dipakai sebagai data uji atau prediksi yakni (-samp)

test.cl(targets[-samp,], predict(ir1, ir[-samp,]))
##     cres
## true  1  2  3
##    1 22  0  3
##    2  0 25  0
##    3  2  0 23

dari hasil tabel ini sangat mempermudah kita dalam mengambil keputusan, bahwa jaringan dapat mengenali pola atau prediksi data baru yang dimasukkan. Kesalahan klasifikasi dapat juga dilihat sebesar 5 data yang salah dalam penempatan dibagi dengan jumlah total observasi yakni 75 (=5/75 * 100% = 66.7%)

salam,

R. Bagus Fajriya Hakim email : hakimf@uii.ac.id

Department of Statistics Universias Islam Indonesia