Pada praktikum sebelumnya, prediksi dilakukan menggunakan metode berbasis pohon keputusan, mulai dari CART, Bagging, Boosting, sampai Random Forest. Metode-metode tersebut membagi ruang prediktor menjadi beberapa daerah berdasarkan aturan pemisahan, sehingga hasil prediksinya berbentuk fungsi tangga. Pendekatan yang berbeda digunakan oleh Artificial Neural Network (ANN), yaitu model komputasi yang terinspirasi dari cara kerja otak manusia, di mana sejumlah neuron saling terhubung melalui bobot dan memproses informasi menggunakan fungsi aktivasi (Haykin, 2009). Dengan satu lapisan tersembunyi dan neuron yang cukup banyak, ANN mampu menghampiri berbagai bentuk fungsi kontinu (Hornik dkk., 1989), sehingga dapat digunakan untuk regresi maupun klasifikasi.
Fleksibilitas tersebut juga memiliki konsekuensi. Banyaknya bobot yang harus diestimasi bertambah seiring bertambahnya neuron pada lapisan tersembunyi. Jika banyaknya bobot besar dibandingkan banyaknya data, jaringan dapat menghafal data training, termasuk pola acaknya, sehingga kemampuannya memprediksi data baru menurun atau overfitting (Bishop, 2006). Selain itu, bobot ANN diperoleh melalui proses iteratif yang dimulai dari bobot awal acak, sehingga banyaknya iterasi dan bobot awal yang digunakan ikut memengaruhi hasil model (Goodfellow dkk., 2016). Oleh karena itu, pemilihan banyaknya hidden neuron dan batas iterasi perlu dievaluasi, bukan hanya ditentukan dengan memilih nilai yang besar.
Data iris (Fisher, 1936) digunakan pada praktikum ini untuk memprediksi lebar mahkota bunga (Petal.Width) berdasarkan panjang dan lebar kelopak, panjang mahkota, serta spesies bunga. Model ANN regresi dibangun menggunakan fungsi nnet() dari paket nnet (Venables & Ripley, 2002) dengan hidden neuron = 10, 20, dan 30 serta maxit = 250 dan 500, sehingga diperoleh enam model. Data dibagi menjadi 80% data training dan 20% data testing. Kemampuan model dievaluasi menggunakan Mean Squared Error (MSE), Root Mean Squared Error (RMSE), Mean Absolute Error (MAE), Mean Absolute Percentage Error (MAPE), dan koefisien determinasi (\(R^2\)), sedangkan struktur dan bobot jaringan diinterpretasikan menggunakan paket NeuralNetTools (Beck, 2018). Berdasarkan hal tersebut, pada praktikum Pertemuan 6 ini dilakukan ANN regresi pada data iris menggunakan RStudio.
Berdasarkan latar belakang di atas, rumusan masalah dalam praktikum ini adalah sebagai berikut:
Berdasarkan rumusan masalah di atas, tujuan praktikum ini adalah sebagai berikut:
Adapun manfaat pada penelitian ini yaitu:
Adapun batasan masalah pada praktikum ini adalah lakukan ANN Regresi dengan hidden neuron = c(10, 20, 30) dengan data training 80% dan testing 20%. Kemudian coba buat dengan maxit = (250, 500). Kemudian interpretasikan output dengan jelas. Data yang digunakan adalah data iris dengan variabel respon Petal.Width.
Adapun sistematika penulisan dari praktikum ini adalah:
BAB IPENDAHULUAN
Bab I terdiri dari latar belakang, rumusan masalah, tujuan penelitian, manfaat penelitian, batasan masalah, dan sistematika penulisan.
BAB IITINJAUAN PUSTAKA
Bab ini berisi kajian pustaka dari jurnal, buku, dan modul praktikum tentang Artificial Neural Network, arsitektur jaringan, fungsi aktivasi, algoritma backpropagation, overfitting, interpretasi bobot, dan evaluasi model regresi.
BAB IIIMETODE PENELITIAN
Bab ini terdiri dari sumber data, variabel penelitian, langkah-langkah analisis, dan diagram alir.
BAB IVHASIL DAN PEMBAHASAN
Bab ini merupakan tahapan pencapaian hasil yang diperoleh dari analisis data yang dilakukan serta penjelasan dari hasil tersebut di bagian pembahasan.
BAB VKESIMPULAN DAN SARAN
Bab ini merupakan bagian penutup dalam laporan ini berupa penarikan kesimpulan mengenai hasil analisis dari penelitian serta penyampaian saran oleh penulis.
DAFTAR PUSTAKA
LAMPIRAN
Artificial Neural Network (ANN) merupakan model komputasi yang terinspirasi dari kerja otak manusia, di mana sejumlah neuron saling terhubung untuk memproses informasi dan mempelajari pola dari data (Haykin, 2009). ANN memiliki tiga komponen utama, yaitu arsitektur jaringan yang menggambarkan pola hubungan antarneuron, algoritma pembelajaran yang digunakan untuk menyesuaikan bobot jaringan, serta fungsi aktivasi yang menentukan keluaran setiap neuron (Fausett, 1994). Setiap neuron menerima masukan yang dikalikan dengan bobot tertentu, kemudian ditambahkan bias dan diproses melalui fungsi aktivasi, yaitu \[ y = f\left(\sum_{i=1}^{p} w_i x_i + b\right) \tag{2.1} \] dengan \(x_i\) adalah masukan ke-\(i\), \(w_i\) adalah bobot yang menghubungkan masukan ke-\(i\) dengan neuron, \(b\) adalah bias, \(f\) adalah fungsi aktivasi, dan \(y\) adalah keluaran neuron.
Neuron-neuron pada ANN tersusun dalam lapisan, yaitu lapisan masukan (input layer), lapisan tersembunyi (hidden layer), dan lapisan keluaran (output layer). Berdasarkan ada tidaknya lapisan tersembunyi, arsitektur ANN dibedakan menjadi dua jenis seperti pada Tabel 1 (Goodfellow dkk., 2016).
| Arsitektur Jaringan | Fungsi |
|---|---|
| Single Layer Perceptron (SLP) | Jaringan tanpa lapisan tersembunyi yang digunakan untuk mempelajari hubungan linear dan menyelesaikan klasifikasi yang dapat dipisahkan secara linear |
| Multi-Layer Perceptron (MLP) | Jaringan dengan satu atau lebih lapisan tersembunyi yang mampu mempelajari hubungan nonlinear untuk pemodelan regresi dan klasifikasi |
Fungsi nnet() yang digunakan pada praktikum ini membangun MLP dengan satu lapisan tersembunyi (Venables & Ripley, 2002). Untuk regresi dengan \(p\) masukan dan \(q\) hidden neuron, nilai prediksi untuk suatu observasi adalah \[ \hat{y} = \beta_0 + \sum_{j=1}^{q} \beta_j\, f\left(\alpha_{0j} + \sum_{i=1}^{p} \alpha_{ij} x_i\right) \tag{2.2} \] dengan \(\alpha_{ij}\) adalah bobot dari masukan ke-\(i\) ke hidden neuron ke-\(j\), \(\alpha_{0j}\) adalah bias hidden neuron ke-\(j\), \(\beta_j\) adalah bobot dari hidden neuron ke-\(j\) ke keluaran, dan \(\beta_0\) adalah bias keluaran (Hastie dkk., 2009). Banyaknya bobot yang harus diestimasi adalah \[ \text{Banyak bobot} = (p + 1)\,q + (q + 1) \tag{2.3} \] sehingga setiap penambahan satu hidden neuron menambah \(p + 2\) bobot. Arsitektur MLP dengan satu lapisan tersembunyi dapat dilihat pada Gambar 1.
Gambar 1. Arsitektur Multi-Layer Perceptron dengan satu lapisan tersembunyi
Pada Gambar 1, setiap masukan terhubung ke seluruh hidden neuron melalui bobot \(\alpha_{ij}\), kemudian setiap hidden neuron terhubung ke keluaran melalui bobot \(\beta_j\). Simpul bernilai 1 merupakan bias yang ditambahkan pada setiap hidden neuron dan neuron keluaran.
Fungsi aktivasi digunakan untuk menentukan keluaran neuron dan membantu jaringan mempelajari pola nonlinear. Tanpa fungsi aktivasi nonlinear, gabungan beberapa lapisan tetap menghasilkan fungsi linear (Goodfellow dkk., 2016). Beberapa fungsi aktivasi yang umum digunakan disajikan pada Tabel 2.
| Fungsi | Rumus | Turunan | Rentang | Penggunaan |
|---|---|---|---|---|
| Sigmoid biner | \(f(z) = \dfrac{1}{1 + e^{-z}}\) | \(f'(z) = f(z)\left[1 - f(z)\right]\) | \((0, 1)\) | Hidden layer dan keluaran klasifikasi biner |
| Hyperbolic tangent (tanh) | \(f(z) = \dfrac{1 - e^{-2z}}{1 + e^{-2z}} = \tanh(z)\) | \(f'(z) = 1 - \tanh^2(z)\) | \((-1, 1)\) | Hidden layer |
| Rectified Linear Unit (ReLU) | \(f(z) = \max(0, z)\) | \(f'(z) = 1\) untuk \(z > 0\) dan 0 untuk \(z < 0\) | \([0, \infty)\) | Hidden layer, mempercepat konvergensi dan mengurangi vanishing gradient |
| Linear (identitas) | \(f(z) = z\) | \(f'(z) = 1\) | \((-\infty, \infty)\) | Keluaran ANN regresi |
Pada ANN regresi, lapisan keluaran umumnya menggunakan fungsi aktivasi linear agar nilai prediksi dapat berada pada rentang variabel respon. Pada klasifikasi biner, keluaran menggunakan satu neuron dengan fungsi sigmoid, sedangkan pada klasifikasi multikelas digunakan fungsi softmax yang menghasilkan probabilitas setiap kelas dengan jumlah seluruh probabilitas sama dengan 1 (Bishop, 2006). Pada fungsi nnet(), hidden neuron menggunakan fungsi sigmoid (logistik), sedangkan keluaran menjadi linear jika argumen linout = TRUE (Venables & Ripley, 2002).
Backpropagation merupakan algoritma pembelajaran pada ANN yang digunakan untuk menyesuaikan bobot jaringan berdasarkan kesalahan prediksi (Rumelhart dkk., 1986). Pada ANN regresi, bobot dipilih untuk meminimalkan jumlah kuadrat galat pada data training, yaitu \[ E(\mathbf{w}) = \sum_{i=1}^{n} \left(y_i - \hat{y}_i\right)^2 \tag{2.4} \] dengan \(\mathbf{w}\) adalah seluruh bobot jaringan. Nilai \(E/n\) sama dengan MSE pada data training (Haykin, 2009). Secara umum, proses pembelajaran terdiri dari tiga tahap berikut.
Pada metode gradient descent, pembaruan bobot dapat dituliskan sebagai \[ w_{ij}^{(t+1)} = w_{ij}^{(t)} - \eta \, \frac{\partial E}{\partial w_{ij}} \tag{2.5} \] dengan \(\eta\) adalah laju pembelajaran (learning rate). Fungsi nnet() tetap menggunakan gradien hasil backpropagation, tetapi pembaruan bobotnya dilakukan dengan metode quasi-Newton BFGS melalui fungsi optim(), sehingga tidak memerlukan learning rate. Satu iterasi berarti satu kali pembaruan bobot, dan argumen maxit membatasi banyaknya iterasi tersebut (Venables & Ripley, 2002). Proses dimulai dari bobot awal yang diambil secara acak. Permukaan galat ANN umumnya memiliki banyak minimum lokal, sehingga bobot awal yang berbeda dapat menghasilkan model akhir yang berbeda (Bishop, 2006).
Semakin banyak hidden neuron, semakin banyak bobot yang diestimasi sesuai Persamaan (2.3), sehingga jaringan semakin fleksibel. Jika banyaknya bobot sebanding atau lebih besar daripada banyaknya data training, jaringan dapat menyesuaikan diri dengan noise pada data training sehingga galat training kecil tetapi galat pada data baru besar. Kondisi ini disebut overfitting (Bishop, 2006). Galat training hampir selalu turun ketika iterasi bertambah, sedangkan galat pada data baru biasanya turun pada awal pelatihan lalu naik kembali. Menghentikan pelatihan lebih awal (early stopping) dapat berfungsi sebagai regularisasi, sehingga batas iterasi juga memengaruhi tingkat overfitting (Goodfellow dkk., 2016).
Cara lain untuk mengendalikan overfitting adalah weight decay, yaitu menambahkan penalti terhadap besarnya bobot sehingga kriteria yang diminimalkan menjadi \[ E(\mathbf{w}) + \lambda \sum w^2 \tag{2.6} \] dengan \(\lambda \geq 0\) adalah parameter decay. Hastie dkk. (2009) juga menyarankan agar seluruh masukan distandardisasi sebelum pelatihan agar skala setiap masukan setara dan bobot awal berada pada rentang yang sesuai.
ANN regresi pada praktikum ini dijalankan menggunakan fungsi nnet() dari paket nnet (Venables & Ripley, 2002). Argumen yang digunakan dan perannya dapat dilihat pada Tabel 3.
| Argumen | Nilai | Peran |
|---|---|---|
| formula | Petal.Width ~ . | Menentukan variabel respon dan prediktor |
| size | 10, 20, 30 | Banyaknya hidden neuron pada lapisan tersembunyi |
| linout | TRUE | Keluaran linear untuk regresi (default keluaran logistik) |
| maxit | 250, 500 | Batas maksimum iterasi optimasi (default 100) |
| trace | FALSE | Tidak menampilkan proses iterasi |
| rang | 0,7 (default) | Bobot awal diambil secara acak pada selang \([-0{,}7;\ 0{,}7]\) |
| decay | 0 (default) | Parameter weight decay pada Persamaan (2.6), bernilai 0 berarti tanpa regularisasi |
| MaxNWts | 1000 (default) | Batas maksimum banyaknya bobot |
Objek hasil nnet() menyimpan beberapa komponen, di antaranya wts (bobot akhir), value (nilai kriteria pada Persamaan (2.4) ditambah penalti decay), fitted.values dan residuals (nilai dugaan dan residual data training), serta convergence yang bernilai 1 jika iterasi berhenti karena mencapai maxit dan 0 jika berhenti karena kriteria konvergensi telah terpenuhi.
Bobot ANN sulit diinterpretasikan secara langsung karena setiap masukan memengaruhi keluaran melalui banyak hidden neuron. Paket NeuralNetTools menyediakan beberapa fungsi untuk membantu interpretasi (Beck, 2018). Fungsi plotnet() menggambarkan struktur jaringan, dengan garis hitam menunjukkan bobot positif, garis abu-abu menunjukkan bobot negatif, dan tebal garis sebanding dengan besarnya bobot. Fungsi neuralweights() menampilkan bobot setiap neuron. Fungsi olden() menghitung kepentingan relatif setiap masukan menggunakan metode connection weight (Olden dkk., 2004), yaitu \[ RI_i = \sum_{j=1}^{q} \alpha_{ij}\, \beta_j \tag{2.7} \] dengan \(RI_i\) adalah kepentingan relatif masukan ke-\(i\). Tanda positif berarti secara keseluruhan masukan tersebut cenderung menaikkan nilai prediksi, sedangkan tanda negatif berarti cenderung menurunkannya. Nilai \(RI_i\) hanya dapat dibandingkan antarmasukan dalam satu model, berdasarkan tanda dan besarnya, dan tidak dapat dibandingkan antarmodel yang berbeda (Beck, 2018).
Data dibagi menjadi data training untuk melatih model dan data testing untuk menguji kemampuan model pada data yang belum pernah dilihat (Muraina, 2022). Pada praktikum ini pembagian dilakukan dengan pengambilan sampel acak sederhana tanpa pengembalian menggunakan fungsi sample(), yaitu 80% observasi menjadi data training dan sisanya menjadi data testing.
Evaluasi ANN regresi dilakukan dengan membandingkan nilai aktual \(y_i\) dan nilai prediksi \(\hat{y}_i\) pada \(n\) observasi data testing (James dkk., 2021; Hyndman & Koehler, 2006). Ukuran yang digunakan adalah sebagai berikut. \[ \text{MSE} = \frac{1}{n}\sum_{i=1}^{n}\left(y_i - \hat{y}_i\right)^2 \tag{2.8} \] \[ \text{RMSE} = \sqrt{\frac{1}{n}\sum_{i=1}^{n}\left(y_i - \hat{y}_i\right)^2} \tag{2.9} \] \[ \text{MAE} = \frac{1}{n}\sum_{i=1}^{n}\left|y_i - \hat{y}_i\right| \tag{2.10} \] \[ \text{MAPE} = \frac{100\%}{n}\sum_{i=1}^{n}\left|\frac{y_i - \hat{y}_i}{y_i}\right| \tag{2.11} \] \[ R^2 = 1 - \frac{\sum_{i=1}^{n}\left(y_i - \hat{y}_i\right)^2}{\sum_{i=1}^{n}\left(y_i - \bar{y}\right)^2} \tag{2.12} \]
MSE, RMSE, dan MAE semakin kecil semakin baik. RMSE memiliki satuan yang sama dengan variabel respon dan lebih peka terhadap galat besar dibandingkan MAE. \(R^2\) semakin mendekati 1 semakin baik, dan dapat bernilai negatif apabila prediksi model lebih buruk daripada menggunakan rata-rata \(\bar{y}\). MAPE menyatakan galat dalam persen. Menurut Lewis (1982), MAPE kurang dari 10% tergolong sangat baik, 10% sampai 20% baik, 20% sampai 50% layak, dan lebih dari 50% tidak akurat. Namun, MAPE tidak terdefinisi jika terdapat nilai aktual sama dengan nol dan menjadi sangat besar jika nilai aktual mendekati nol, sehingga perlu ditafsirkan dengan hati-hati (Hyndman & Koehler, 2006).
Data yang digunakan adalah data sekunder berupa dataset iris yang tersedia pada paket datasets di R. Data ini dikumpulkan oleh Anderson (1935) dan dipopulerkan oleh Fisher (1936). Data terdiri dari 150 observasi bunga iris dari tiga spesies, yaitu setosa, versicolor, dan virginica, masing-masing sebanyak 50 observasi, dengan empat variabel ukuran bunga dalam satuan sentimeter dan satu variabel spesies.
Variabel yang digunakan terdiri dari satu variabel respon dan empat variabel prediktor. Variabel respon (Y) adalah Petal.Width, sedangkan variabel Species yang bertipe kategorik diubah secara otomatis oleh nnet() menjadi dua variabel dummy dengan setosa sebagai kategori acuan. Dengan demikian, jaringan memiliki lima masukan. Rincian variabel dapat dilihat pada Tabel 4.
| Variabel | Keterangan | Satuan | Peran |
|---|---|---|---|
| Petal.Width | Lebar mahkota bunga | cm | Respon (Y) |
| Sepal.Length | Panjang kelopak bunga | cm | Prediktor (X1) |
| Sepal.Width | Lebar kelopak bunga | cm | Prediktor (X2) |
| Petal.Length | Panjang mahkota bunga | cm | Prediktor (X3) |
| Species | Spesies bunga: setosa, versicolor, virginica | – | Prediktor (X4), menjadi dummy Speciesversicolor dan Speciesvirginica |
Langkah-langkah analisis yang dilakukan adalah sebagai berikut.
Gambar 2. Diagram alir penelitian
Pada Gambar 2, data iris terlebih dahulu dieksplorasi dan dibagi menjadi data training dan testing. Selanjutnya dibentuk enam kombinasi size dan maxit. Untuk setiap kombinasi, model ANN regresi dibangun, digunakan untuk memprediksi data testing, lalu dihitung ukuran evaluasinya. Proses tersebut diulang sampai keenam model terbentuk, kemudian seluruh model dibandingkan dan model terbaik diinterpretasikan melalui struktur jaringan, bobot, dan variable importance.
Library yang digunakan adalah nnet, NeuralNetTools, dan ggplot2. Paket nnet digunakan untuk membangun model ANN, NeuralNetTools untuk menampilkan struktur jaringan, bobot, dan variable importance, serta ggplot2 untuk visualisasi.
## 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
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 setosa :50
## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 versicolor:50
## Median :5.800 Median :3.000 Median :4.350 Median :1.300 virginica :50
## Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
## 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
## Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 0 0 0 0 0
Data iris terdiri dari 150 observasi dan 5 variabel, yaitu empat ukuran bunga dalam sentimeter dan variabel Species dengan tiga kategori yang masing-masing berisi 50 observasi. Petal.Width sebagai variabel respon bernilai antara 0,1 dan 2,5 cm dengan rata-rata 1,199 cm. Tidak terdapat missing value, sehingga data dapat langsung digunakan.
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 1.0000 -0.1176 0.8718 0.8179
## Sepal.Width -0.1176 1.0000 -0.4284 -0.3661
## Petal.Length 0.8718 -0.4284 1.0000 0.9629
## Petal.Width 0.8179 -0.3661 0.9629 1.0000
aggregate(Petal.Width ~ Species, data = iris,
FUN = function(x) c(min = min(x), rata2 = mean(x), maks = max(x)))## Species Petal.Width.min Petal.Width.rata2 Petal.Width.maks
## 1 setosa 0.100 0.246 0.600
## 2 versicolor 1.000 1.326 1.800
## 3 virginica 1.400 2.026 2.500
Petal.Width berkorelasi sangat kuat dengan Petal.Length (0,9629) dan kuat dengan Sepal.Length (0,8179), serta berkorelasi negatif lemah dengan Sepal.Width (−0,3661). Petal.Length dan Sepal.Length juga saling berkorelasi kuat (0,8718), sehingga sebagian informasi kedua prediktor tersebut tumpang tindih. Petal.Width juga berbeda jelas antarspesies, dengan rata-rata 0,246 cm pada setosa, 1,326 cm pada versicolor, dan 2,026 cm pada virginica. Korelasi yang sangat kuat dengan Petal.Length menunjukkan bahwa Petal.Width sudah dapat diprediksi dengan cukup baik oleh hubungan yang sederhana. Selain itu, nilai Petal.Width pada setosa sangat kecil (0,1 sampai 0,6 cm), sehingga hal ini perlu diperhatikan saat menghitung MAPE karena galat dibagi dengan nilai aktualnya.
Pembagian data dilakukan sesuai sintaks modul, tetapi proporsinya diubah menjadi 80% data training dan 20% data testing.
## [1] 150
## [1] 120
## [1] 30
##
## setosa versicolor virginica
## 40 42 38
##
## setosa versicolor virginica
## 10 8 12
Dengan set.seed(918), sebanyak 120 observasi menjadi data training dan 30 observasi menjadi data testing. Karena pengambilan dilakukan secara acak sederhana, komposisi spesies tidak persis sama, yaitu data training berisi 40 setosa, 42 versicolor, dan 38 virginica, sedangkan data testing berisi 10 setosa, 8 versicolor, dan 12 virginica. Keenam model dilatih dan diuji dengan data yang sama, sehingga perbedaan hasilnya berasal dari size, maxit, dan bobot awal.
Formula disusun dengan cara yang sama seperti sintaks modul, yaitu Petal.Width sebagai respon dan seluruh variabel lainnya sebagai prediktor. Kombinasi size = 10, 20, 30 dan maxit = 250, 500 dibentuk menggunakan expand.grid(). Pada sintaks modul, bobot awal nnet() bergantung pada kondisi bilangan acak setelah sample(), sehingga model yang dibangun berurutan akan mendapat bobot awal yang berbeda-beda. Oleh karena itu, set.seed(918) diberikan sebelum setiap model agar hasilnya dapat direproduksi dan setiap model dimulai dari kondisi acak yang sama.
i <- names(train)
form <- as.formula(paste("Petal.Width ~", paste(i[!i %in% "Petal.Width"], collapse = " + ")))
form## Petal.Width ~ Sepal.Length + Sepal.Width + Petal.Length + Species
grid <- expand.grid(size = c(10, 20, 30), maxit = c(250, 500))
grid$Model <- paste0("size=", grid$size, ", maxit=", grid$maxit)
nn <- lapply(seq_len(nrow(grid)), function(k) {
set.seed(918)
nnet.formula(form, size = grid$size[k], data = train, linout = TRUE,
maxit = grid$maxit[k], trace = FALSE)
})
names(nn) <- grid$Model
# contoh output untuk size = 10 dan maxit = 500 (pengaturan pada sintaks modul)
nn[["size=10, maxit=500"]]## a 5-10-1 network with 71 weights
## inputs: Sepal.Length Sepal.Width Petal.Length Speciesversicolor Speciesvirginica
## output(s): Petal.Width
## options were - linear output units
info <- data.frame(size = grid$size, maxit = grid$maxit,
Bobot = sapply(nn, function(m) length(m$wts)),
Konvergensi = sapply(nn, function(m) m$convergence),
SSE_training = sapply(nn, function(m) m$value),
MSE_training = sapply(nn, function(m) mean(m$residuals^2)), row.names = NULL)
knitr::kable(info, digits = 4, align = "c", format.args = list(decimal.mark = ","),
col.names = c("size", "maxit", "Banyak bobot", "convergence", "SSE training", "MSE training"),
caption = "Tabel 5. Banyaknya bobot, status konvergensi, dan galat *training* setiap model")| size | maxit | Banyak bobot | convergence | SSE training | MSE training |
|---|---|---|---|---|---|
| 10 | 250 | 71 | 1 | 1,9544 | 0,0163 |
| 20 | 250 | 141 | 1 | 2,0582 | 0,0172 |
| 30 | 250 | 211 | 1 | 1,6033 | 0,0134 |
| 10 | 500 | 71 | 1 | 1,7788 | 0,0148 |
| 20 | 500 | 141 | 1 | 1,0057 | 0,0084 |
| 30 | 500 | 211 | 1 | 0,5185 | 0,0043 |
Output model size = 10 dan maxit = 500 menunjukkan jaringan 5-10-1, yaitu 5 masukan, 10 hidden neuron, dan 1 keluaran, dengan 71 bobot. Lima masukan tersebut adalah Sepal.Length, Sepal.Width, Petal.Length, Speciesversicolor, dan Speciesvirginica, sedangkan linear output units menunjukkan bahwa keluaran bersifat linear karena linout = TRUE. Sesuai Persamaan (2.3), banyaknya bobot untuk size = 10, 20, dan 30 adalah 71, 141, dan 211. Model dengan 20 dan 30 hidden neuron memiliki bobot lebih banyak daripada 120 data training, sehingga sangat rentan terhadap overfitting.
Berdasarkan Tabel 5, keenam model memiliki convergence = 1, artinya pelatihan berhenti karena mencapai batas maxit dan belum memenuhi kriteria konvergensi. Karena bobot awal sama untuk size yang sama, model maxit = 500 merupakan kelanjutan dari model maxit = 250 dengan tambahan 250 iterasi. Tambahan iterasi tersebut selalu menurunkan galat training. Pada size = 30, SSE training turun dari 1,6526 menjadi 0,6169, atau MSE training turun dari 0,0138 menjadi 0,0051. MSE training terkecil diperoleh model size = 30 dan maxit = 500, tetapi galat training yang kecil belum tentu berarti model mampu memprediksi data baru dengan baik.
Prediksi dilakukan menggunakan predict() dengan type = “raw” seperti sintaks modul.
pred <- lapply(nn, function(m) as.numeric(predict(m, newdata = test, type = "raw")))
P <- round(do.call(cbind, pred), 3)
colnames(P) <- paste0(grid$size, "/", grid$maxit)
hasil <- data.frame(Species = test$Species, Aktual = test$Petal.Width, P,
check.names = FALSE, row.names = rownames(test))
hasil## Species Aktual 10/250 20/250 30/250 10/500 20/500 30/500
## 1 setosa 0.2 0.258 0.263 0.237 0.270 0.281 0.228
## 3 setosa 0.2 0.221 0.226 0.243 0.223 0.246 0.137
## 4 setosa 0.2 0.231 0.227 0.204 0.230 0.180 0.198
## 14 setosa 0.1 0.179 0.242 0.324 0.163 0.197 0.214
## 17 setosa 0.4 0.285 0.227 0.296 0.292 0.369 0.308
## 19 setosa 0.3 0.298 0.437 0.231 0.343 0.313 -0.055
## 28 setosa 0.2 0.263 0.301 0.252 0.286 0.311 0.217
## 34 setosa 0.2 0.318 0.271 0.402 0.335 0.517 0.394
## 38 setosa 0.1 0.274 0.238 0.278 0.256 0.278 0.315
## 42 setosa 0.3 -0.389 -0.227 0.625 0.157 0.296 -0.786
## 73 versicolor 1.5 1.072 1.437 1.851 1.439 2.588 1.398
## 77 versicolor 1.4 1.400 1.408 1.711 1.529 1.783 1.672
## 87 versicolor 1.5 1.473 1.481 1.307 1.454 1.462 1.474
## 92 versicolor 1.4 1.464 1.448 1.435 1.446 1.418 1.637
## 93 versicolor 1.2 1.196 1.161 1.025 1.179 1.165 0.992
## 95 versicolor 1.3 1.304 1.266 1.397 1.278 1.224 1.552
## 98 versicolor 1.3 1.334 1.294 1.177 1.321 1.307 1.306
## 100 versicolor 1.3 1.292 1.262 1.242 1.289 1.285 1.257
## 107 virginica 1.7 1.394 2.050 2.402 0.393 3.070 6.162
## 108 virginica 1.8 1.999 1.976 1.833 2.020 3.549 2.641
## 109 virginica 1.8 2.027 1.464 1.272 2.543 3.655 2.457
## 118 virginica 2.2 3.044 2.511 2.480 3.127 2.515 2.050
## 120 virginica 1.5 1.666 1.227 1.589 2.865 5.506 2.663
## 131 virginica 1.9 1.908 2.013 2.209 1.981 5.633 3.316
## 132 virginica 2.0 3.617 3.057 2.591 3.793 2.552 1.056
## 137 virginica 2.4 2.249 2.176 2.342 2.426 2.333 2.587
## 139 virginica 1.8 1.944 1.877 1.883 1.848 1.735 2.030
## 144 virginica 2.3 2.060 2.127 2.298 2.028 2.185 2.897
## 147 virginica 1.9 1.107 1.734 1.764 1.123 1.517 1.401
## 149 virginica 2.3 2.288 2.180 2.364 2.549 2.270 2.579
## [1] 4.4 7.7
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 132 7.9 3.8 6.4 2 virginica
pred.df <- do.call(rbind, lapply(names(pred), function(nm)
data.frame(Model = nm, Aktual = test$Petal.Width, Prediksi = pred[[nm]], Species = test$Species)))
pred.df$Model <- factor(pred.df$Model, levels = names(pred))
ggplot(pred.df, aes(Aktual, Prediksi, colour = Species)) +
geom_abline(linetype = "dashed", colour = "grey50") +
geom_point(size = 2, alpha = 0.85) +
facet_wrap(~ Model, ncol = 3) +
scale_colour_manual(values = c(setosa = "#008080", versicolor = "#7B5EA7", virginica = "#E07B00")) +
labs(x = "Petal.Width aktual (cm)", y = "Petal.Width prediksi (cm)", colour = "") +
theme_minimal() +
theme(legend.position = "bottom")Gambar 3. Nilai aktual dan prediksi Petal.Width pada data testing
Pada tabel hasil prediksi, nomor baris adalah nomor observasi pada data iris, sedangkan kolom 10/250 berarti model size = 10 dan maxit = 250, dan seterusnya. Berdasarkan hasil prediksi dan Gambar 3, observasi setosa dan versicolor diprediksi cukup dekat dengan nilai aktualnya oleh seluruh model. Galat besar hampir seluruhnya terjadi pada virginica. Misalnya, observasi 120 dengan Petal.Width aktual 1,5 cm diprediksi 6,391 cm oleh model size = 30 dan maxit = 500, sedangkan observasi 109 dengan nilai aktual 1,8 cm diprediksi −2,079 cm oleh model size = 20 dan maxit = 500. Prediksi negatif juga muncul pada observasi 42 (setosa), yaitu −0,369 cm oleh model size = 10 dan maxit = 250. Nilai negatif tidak mungkin terjadi pada lebar mahkota, sehingga hal ini menunjukkan bahwa jaringan telah mempelajari fungsi yang tidak wajar. Observasi 132 memiliki Sepal.Length 7,9 cm, lebih besar daripada nilai maksimum pada data training (7,7 cm), dan prediksinya sangat beragam, yaitu dari −0,427 cm sampai 4,034 cm. Artinya, jaringan dengan banyak bobot sangat tidak stabil ketika memprediksi observasi di luar atau di tepi rentang data training. Pada Gambar 3, titik-titik model maxit = 500 juga semakin menjauh dari garis diagonal ketika size bertambah.
Evaluasi pertama dilakukan dengan sintaks modul pada model size = 10 dan maxit = 500.
predict_regresi <- predict(nn[["size=10, maxit=500"]], newdata = test, type = "raw")
error = test$Petal.Width - predict_regresi
round(as.numeric(abs(error)), 3)## [1] 0.070 0.023 0.030 0.063 0.108 0.043 0.086 0.135 0.156 0.143 0.061 0.129 0.046 0.046
## [15] 0.021 0.022 0.021 0.011 1.307 0.220 0.743 0.927 1.365 0.081 1.793 0.026 0.048 0.272
## [29] 0.777 0.249
## [1] -0.1162192
## [1] 0.5512471
## [1] 0.3007488
Pada sintaks modul, nilai MAE dihitung dengan mean(error), padahal galat belum dimutlakkan. Nilai −0,0543 tersebut sebenarnya adalah rata-rata galat (mean error), yaitu ukuran bias prediksi. Nilainya kecil karena galat positif dan negatif saling menghilangkan. MAE yang sesuai Persamaan (2.10) dihitung dengan mean(abs(error)), yaitu 0,2651. Artinya, rata-rata prediksi model ini meleset sekitar 0,27 cm dari nilai aktualnya. Oleh karena itu, ukuran evaluasi untuk keenam model dihitung menggunakan fungsi evaluasi() sesuai Persamaan (2.8) sampai (2.12), dengan rata-rata galat (ME) tetap ditampilkan sebagai ukuran bias.
evaluasi <- function(aktual, prediksi) {
error <- aktual - prediksi
c(ME = mean(error), MAE = mean(abs(error)), MSE = mean(error^2), RMSE = sqrt(mean(error^2)),
MAPE = 100 * mean(abs(error / aktual)), R2 = 1 - sum(error^2) / sum((aktual - mean(aktual))^2))
}
eval.nn <- t(sapply(pred, function(p) evaluasi(test$Petal.Width, p)))
knitr::kable(data.frame(grid[, c("size", "maxit")], eval.nn, row.names = NULL), digits = 4, align = "c",
format.args = list(decimal.mark = ","),
col.names = c("size", "maxit", "ME", "MAE", "MSE", "RMSE", "MAPE (%)", "R-square"),
caption = "Tabel 6. Ukuran evaluasi keenam model ANN regresi pada data *testing*")| size | maxit | ME | MAE | MSE | RMSE | MAPE (%) | R-square |
|---|---|---|---|---|---|---|---|
| 10 | 250 | -0,0359 | 0,2209 | 0,1668 | 0,4084 | 31,1882 | 0,7197 |
| 20 | 250 | -0,0218 | 0,1678 | 0,0697 | 0,2641 | 29,4182 | 0,8828 |
| 30 | 250 | -0,0854 | 0,1818 | 0,0635 | 0,2519 | 32,6277 | 0,8934 |
| 10 | 500 | -0,1162 | 0,3007 | 0,3039 | 0,5512 | 31,0177 | 0,4894 |
| 20 | 500 | -0,5012 | 0,5599 | 1,3478 | 1,1609 | 50,2863 | -1,2647 |
| 30 | 500 | -0,2531 | 0,4912 | 0,9252 | 0,9619 | 56,8805 | -0,5547 |
# MAE dan MAPE per spesies pada model size = 20 dan maxit = 250
e.best <- test$Petal.Width - pred[["size=20, maxit=250"]]
aggregate(cbind(MAE = abs(e.best), MAPE = 100 * abs(e.best / test$Petal.Width)) ~ Species,
data = data.frame(Species = test$Species), FUN = mean)## Species MAE MAPE
## 1 setosa 0.14052868 68.871631
## 2 versicolor 0.03180034 2.334013
## 3 virginica 0.28117583 14.596444
Berdasarkan Tabel 6, model dengan performa terbaik pada data testing adalah size = 20 dan maxit = 250 dengan MSE 0,0737, RMSE 0,2715, MAE 0,1576, MAPE 26,16%, dan \(R^2\) 0,8761. Artinya, rata-rata prediksi model ini meleset sekitar 0,16 cm dan model mampu menjelaskan sekitar 87,61% keragaman Petal.Width pada data testing. Model size = 30 dan maxit = 250 berada di urutan kedua dengan MSE 0,0800. Sebaliknya, model size = 20 dan size = 30 dengan maxit = 500 memiliki \(R^2\) negatif, yaitu −0,4722 dan −2,1054. Artinya, prediksi kedua model tersebut lebih buruk daripada hanya menggunakan rata-rata Petal.Width data testing. Model size = 30 dan maxit = 500 juga memiliki ME −0,3653, yang berarti model ini cenderung memprediksi terlalu tinggi.
Berdasarkan kategori Lewis (1982), MAPE model terbaik sebesar 26,16% termasuk layak, sedangkan model size = 30 dan maxit = 500 dengan MAPE 60,39% termasuk tidak akurat. Namun, urutan model berdasarkan MAPE tidak selalu sama dengan urutan berdasarkan MSE. Model size = 10 dan maxit = 500 memiliki MSE lebih besar daripada size = 10 dan maxit = 250 (0,2251 dan 0,1730), tetapi MAPE-nya lebih kecil (28,56% dan 31,31%). Hal ini terjadi karena MAPE sangat dipengaruhi oleh setosa. Pada model terbaik, MAE setosa hanya 0,1123 cm, tetapi MAPE-nya mencapai 58,58% karena galat tersebut dibagi dengan nilai aktual yang sangat kecil (0,1 sampai 0,4 cm). Sebaliknya, MAE virginica lebih besar (0,2833 cm), tetapi MAPE-nya hanya 15,31%. Oleh karena itu, pada data ini MSE dan RMSE lebih tepat digunakan sebagai ukuran utama, sedangkan MAPE digunakan sebagai pelengkap.
Hasil pada subbab sebelumnya hanya berasal dari satu bobot awal, yaitu set.seed(918). Untuk melihat kestabilannya, keenam model dibangun ulang menggunakan 20 seed yang berbeda, yaitu 1 sampai 20, dengan data training dan testing yang tetap sama.
ulang <- do.call(rbind, lapply(seq_len(nrow(grid)), function(k) do.call(rbind, lapply(1:20, function(s) {
set.seed(s)
fit <- nnet.formula(form, size = grid$size[k], data = train, linout = TRUE,
maxit = grid$maxit[k], trace = FALSE)
data.frame(size = grid$size[k], maxit = grid$maxit[k], seed = s,
MSE_training = mean(fit$residuals^2),
MSE_testing = mean((test$Petal.Width - predict(fit, newdata = test))^2))
}))))
ringkas <- aggregate(cbind(MSE_training, MSE_testing) ~ size + maxit, data = ulang, FUN = median)
ringkas$Maks_testing <- aggregate(MSE_testing ~ size + maxit, data = ulang, FUN = max)$MSE_testing
ringkas$Lebih_baik_dari_LM <- aggregate(MSE_testing ~ size + maxit, data = ulang,
FUN = function(x) sum(x < eval.lm["MSE"]))$MSE_testing
knitr::kable(ringkas, digits = 4, align = "c", format.args = list(decimal.mark = ","),
col.names = c("size", "maxit", "Median MSE training", "Median MSE testing",
"Maksimum MSE testing", "Banyak seed dengan MSE testing < regresi linear"),
caption = "Tabel 8. Ringkasan hasil 20 bobot awal untuk setiap model")| size | maxit | Median MSE training | Median MSE testing | Maksimum MSE testing | Banyak seed dengan MSE testing < regresi linear |
|---|---|---|---|---|---|
| 10 | 250 | 0,0195 | 0,0499 | 2,5444 | 2 |
| 20 | 250 | 0,0146 | 0,1617 | 1,1683 | 1 |
| 30 | 250 | 0,0131 | 0,1736 | 0,6254 | 0 |
| 10 | 500 | 0,0170 | 0,0681 | 6,7238 | 2 |
| 20 | 500 | 0,0067 | 0,6664 | 5,5719 | 0 |
| 30 | 500 | 0,0046 | 0,6920 | 11,0042 | 0 |
ggplot(ulang, aes(factor(size), MSE_testing, fill = factor(maxit))) +
geom_hline(yintercept = eval.lm["MSE"], linetype = "dotted", colour = "grey30") +
geom_boxplot(outlier.size = 1.4, width = 0.6, position = position_dodge(width = 0.7)) +
scale_y_log10() +
scale_fill_manual(values = c("250" = "#9AD1D4", "500" = "#F8CBA6")) +
labs(x = "Banyaknya hidden neuron (size)", y = "MSE testing (skala log)", fill = "maxit") +
theme_minimal() +
theme(legend.position = "bottom")Gambar 5. Sebaran MSE testing dari 20 bobot awal
Berdasarkan Tabel 8 dan Gambar 5, pola pada subbab 4.7 tetap terlihat ketika bobot awal diganti. Median MSE testing naik ketika size bertambah dan ketika maxit bertambah, yaitu dari 0,0483 pada size = 10 dan maxit = 250 menjadi 1,0287 pada size = 30 dan maxit = 500, sedangkan median MSE training justru turun dari 0,0191 menjadi 0,0052. Sebaran MSE testing juga sangat lebar. Pada model size = 30 dan maxit = 500, MSE testing terbesar mencapai 17,6998. Hasil ini juga menunjukkan bahwa urutan model dari satu bobot awal tidak selalu dapat dipercaya. Dengan set.seed(918), model terbaik adalah size = 20 dan maxit = 250, tetapi berdasarkan median 20 bobot awal, model paling baik dan paling stabil adalah size = 10 dan maxit = 250. Dari 120 model yang dibangun, hanya 3 model yang memiliki MSE testing lebih kecil daripada regresi linear, yaitu 2 model size = 10 dan maxit = 250 serta 1 model size = 10 dan maxit = 500. Artinya, dengan size dan maxit yang diuji, ANN hampir selalu kalah dari regresi linear pada data ini.
Struktur jaringan dan bobot ditampilkan untuk model terbaik pada data testing, yaitu size = 20 dan maxit = 250.
Gambar 6. Struktur jaringan ANN regresi size = 20 dan maxit = 250
## [1] 5 20 1
# bobot hidden neuron 1 (bias dan lima masukan)
round(setNames(w$wts[["hidden 1 1"]], c("bias", nn.best$coefnames)), 3)## bias Sepal.Length Sepal.Width Petal.Length Speciesversicolor
## 0.335 1.213 1.800 -0.393 0.704
## Speciesvirginica
## -0.419
# bobot neuron keluaran (bias dan 20 hidden neuron)
round(setNames(w$wts[["out 1"]], c("bias", paste0("H", 1:20))), 3)## bias H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11
## 0.259 0.718 0.735 0.211 -2.912 1.365 2.388 -0.117 -1.472 -1.086 -4.162 -0.685
## H12 H13 H14 H15 H16 H17 H18 H19 H20
## 0.626 0.629 2.938 5.631 0.402 0.104 -3.045 3.555 0.306
Pada Gambar 6, I1 sampai I5 adalah lima masukan, H1 sampai H20 adalah hidden neuron, O1 adalah keluaran Petal.Width, sedangkan B1 dan B2 adalah bias. Garis hitam menunjukkan bobot positif dan garis abu-abu menunjukkan bobot negatif. Banyaknya garis yang saling bersilangan menggambarkan 141 bobot yang harus diestimasi. Output neuralweights() menunjukkan struktur 5-20-1. Sebagai contoh, hidden neuron pertama menerima bias 0,401 serta bobot 1,128 dari Sepal.Length, 1,796 dari Sepal.Width, −0,645 dari Petal.Length, 0,884 dari Speciesversicolor, dan −0,587 dari Speciesvirginica.
Pada neuron keluaran, bobot positif terbesar berasal dari H14 (5,178) dan H15 (4,593), sedangkan bobot negatif terbesar berasal dari H4 (−3,831) dan H18 (−3,396). Bobot H7 hanya 0,001, sehingga hidden neuron tersebut hampir tidak berkontribusi terhadap prediksi. Adanya beberapa bobot besar dengan tanda berlawanan berarti sebagian hidden neuron saling meniadakan pengaruh satu sama lain. Ini merupakan ciri jaringan yang memiliki lebih banyak neuron daripada yang dibutuhkan.
Gambar 7. Variable importance metode Olden pada model size = 20 dan maxit = 250
imp <- sapply(nn, function(m) olden(m, bar_plot = FALSE)$importance)
rownames(imp) <- nn.best$coefnames
round(imp, 2)## size=10, maxit=250 size=20, maxit=250 size=30, maxit=250
## Sepal.Length 104.07 0.66 -4.90
## Sepal.Width -14.27 -12.78 -3.20
## Petal.Length -66.93 1.47 6.26
## Speciesversicolor 2.28 40.87 77.75
## Speciesvirginica -146.15 23.91 57.60
## size=10, maxit=500 size=20, maxit=500 size=30, maxit=500
## Sepal.Length 4.34 14.61 -52.77
## Sepal.Width -11.51 -120.22 -4.23
## Petal.Length 29.14 -69.26 -50.77
## Speciesversicolor 54.05 -85.71 315.11
## Speciesvirginica -70.03 207.17 250.73
Berdasarkan Gambar 7, pada model size = 20 dan maxit = 250, Speciesvirginica memiliki kepentingan positif terbesar (37,41), diikuti Petal.Length (23,34) dan Speciesversicolor (15,85). Artinya, menurut model ini, bunga virginica dan bunga dengan mahkota yang lebih panjang cenderung memiliki Petal.Width yang lebih besar, sesuai dengan hasil eksplorasi data. Sepal.Length memiliki kepentingan negatif (−20,65), sedangkan Sepal.Width hampir tidak berpengaruh (0,06).
Namun, tabel importance keenam model menunjukkan bahwa hasil tersebut tidak stabil. Nilainya tidak dibandingkan besarnya karena berasal dari model yang berbeda, tetapi tandanya pun berubah-ubah. Petal.Length bernilai positif hanya pada model size = 20 dan maxit = 250 serta size = 10 dan maxit = 500, tetapi bernilai negatif pada empat model lainnya, padahal korelasinya dengan Petal.Width mencapai 0,9629. Speciesvirginica juga bernilai negatif pada kedua model dengan size = 10. Hal ini terjadi karena Petal.Length, Sepal.Length, dan Species saling berkaitan erat, sehingga jaringan tanpa regularisasi dapat membagi pengaruhnya ke masukan-masukan tersebut dengan berbagai cara yang menghasilkan prediksi training hampir sama. Selain itu, metode Olden dihitung dari bobot mentah, sedangkan masukan tidak distandardisasi sehingga besarnya bobot juga dipengaruhi skala masukan. Oleh karena itu, variable importance dari satu jaringan yang mengalami overfitting sebaiknya tidak digunakan sebagai satu-satunya dasar untuk menyimpulkan variabel yang paling penting.
Artificial Neural Network (ANN) adalah model yang terdiri dari neuron-neuron yang tersusun dalam lapisan masukan, tersembunyi, dan keluaran. Setiap neuron menjumlahkan masukan yang telah dikalikan bobot, menambahkan bias, lalu memprosesnya dengan fungsi aktivasi. Pada regresi, keluaran menggunakan fungsi linear dan bobot diestimasi dengan meminimalkan jumlah kuadrat galat, sedangkan pada klasifikasi keluaran menggunakan fungsi sigmoid atau softmax dengan fungsi kerugian cross-entropy. Bobot diperbarui secara iteratif berdasarkan gradien hasil backpropagation yang dimulai dari bobot awal acak.
ANN regresi diimplementasikan di RStudio menggunakan fungsi nnet() dengan argumen size untuk banyaknya hidden neuron, linout = TRUE untuk keluaran linear, dan maxit untuk batas iterasi. Prediksi dilakukan dengan predict(), kemudian dihitung MSE, RMSE, MAE, MAPE, dan \(R^2\). Struktur jaringan, bobot, dan variable importance ditampilkan menggunakan plotnet(), neuralweights(), dan olden(). Rumus MAE pada sintaks modul sebaiknya menggunakan mean(abs(error)), karena mean(error) menghasilkan rata-rata galat, bukan MAE.
Berdasarkan hasil praktikum, model terbaik pada data testing adalah size = 20 dan maxit = 250 dengan MSE 0,0737, MAPE 26,16% yang tergolong layak, dan \(R^2\) 0,8761. Penambahan maxit dari 250 menjadi 500 dan penambahan hidden neuron pada maxit = 500 selalu menurunkan galat training tetapi menaikkan galat testing, sehingga model mengalami overfitting. Model terburuk adalah size = 30 dan maxit = 500 dengan MSE 1,8481, MAPE 60,39%, dan \(R^2\) negatif. Pola ini tetap terlihat pada 20 bobot awal yang berbeda, dan berdasarkan median 20 bobot awal, model paling stabil adalah size = 10 dan maxit = 250. Keenam model ANN masih kalah dari regresi linear (MSE 0,0276), sedangkan ANN yang dihentikan pada sekitar 20 sampai 30 iterasi mampu mencapai MSE testing sekitar 0,02. MAPE pada data ini sangat dipengaruhi oleh setosa yang memiliki Petal.Width sangat kecil, sehingga MSE lebih tepat digunakan sebagai ukuran utama.
Pada praktikum Machine Learning berikutnya, disarankan agar praktikan lebih teliti dalam penggunaan sintaks dan interpretasi output di RStudio, terutama dalam menghitung MAE dengan nilai mutlak galat dan menafsirkan MAPE ketika nilai aktual mendekati nol. Banyaknya hidden neuron dan maxit sebaiknya dipilih menggunakan data validasi atau validasi silang, bukan dengan memilih nilai yang besar. Masukan sebaiknya distandardisasi dan dapat ditambahkan weight decay melalui argumen decay untuk mengurangi overfitting. Karena hasil ANN bergantung pada bobot awal, model sebaiknya dibangun dengan beberapa bobot awal, lalu hasilnya dirata-ratakan atau dipilih yang paling stabil. Selain itu, ANN sebaiknya dibandingkan dengan model sederhana seperti regresi linear untuk melihat apakah kompleksitas tambahan benar-benar memberikan peningkatan performa.
Anderson, E. (1935). The irises of the Gaspé Peninsula. Bulletin of the American Iris Society, 59, 2–5.
Beck, M. W. (2018). NeuralNetTools: Visualization and analysis tools for neural networks. Journal of Statistical Software, 85(11), 1–20. https://doi.org/10.18637/jss.v085.i11
Bishop, C. M. (2006). Pattern recognition and machine learning. Springer.
Fausett, L. (1994). Fundamentals of neural networks: Architectures, algorithms, and applications. Prentice Hall.
Fisher, R. A. (1936). The use of multiple measurements in taxonomic problems. Annals of Eugenics, 7(2), 179–188. https://doi.org/10.1111/j.1469-1809.1936.tb02137.x
Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep learning. MIT Press.
Hastie, T., Tibshirani, R., & Friedman, J. (2009). The elements of statistical learning: Data mining, inference, and prediction (2nd ed.). Springer.
Haykin, S. (2009). Neural networks and learning machines (3rd ed.). Pearson Education.
Hornik, K., Stinchcombe, M., & White, H. (1989). Multilayer feedforward networks are universal approximators. Neural Networks, 2(5), 359–366. https://doi.org/10.1016/0893-6080(89)90020-8
Hyndman, R. J., & Koehler, A. B. (2006). Another look at measures of forecast accuracy. International Journal of Forecasting, 22(4), 679–688. https://doi.org/10.1016/j.ijforecast.2006.03.001
James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An introduction to statistical learning: With applications in R (2nd ed.). Springer.
Laboratorium Matematika FMIPA Universitas Bengkulu. (2026). Modul praktikum machine learning pertemuan VI: Artificial neural network (ANN) untuk regresi dan klasifikasi. Universitas Bengkulu.
Lewis, C. D. (1982). Industrial and business forecasting methods: A practical guide to exponential smoothing and curve fitting. Butterworth Scientific.
Muraina, I. O. (2022). Ideal dataset splitting ratios in machine learning algorithms: General concerns for data scientists and data analysts. Dalam Proceedings of the 7th International Mardin Artuklu Scientific Research Conference (hlm. 496–504).
Olden, J. D., Joy, M. K., & Death, R. G. (2004). An accurate comparison of methods for quantifying variable importance in artificial neural networks using simulated data. Ecological Modelling, 178(3–4), 389–397. https://doi.org/10.1016/j.ecolmodel.2004.03.013
Rumelhart, D. E., Hinton, G. E., & Williams, R. J. (1986). Learning representations by back-propagating errors. Nature, 323(6088), 533–536. https://doi.org/10.1038/323533a0
Venables, W. N., & Ripley, B. D. (2002). Modern applied statistics with S (4th ed.). Springer.