BAB I PENDAHULUAN

1.1 Latar Belakang

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.

1.2 Rumusan Masalah

Berdasarkan latar belakang di atas, rumusan masalah dalam praktikum ini adalah sebagai berikut:

  1. Bagaimana konsep dan implementasi model Artificial Neural Network (ANN) untuk regresi dan klasifikasi menggunakan bahasa pemrograman R?
  2. Bagaimana performa model ANN menggunakan metrik evaluasi MSE dan MAPE untuk regresi, serta akurasi dan presisi untuk klasifikasi?

1.3 Tujuan Penelitian

Berdasarkan rumusan masalah di atas, tujuan praktikum ini adalah sebagai berikut:

  1. Memahami konsep dan mengimplementasikan model Artificial Neural Network (ANN) untuk regresi dan klasifikasi menggunakan bahasa pemrograman RStudio.
  2. Mengevaluasi performa model ANN menggunakan metrik evaluasi MSE dan MAPE untuk regresi, serta akurasi dan presisi untuk klasifikasi.

1.4 Manfaat Penelitian

Adapun manfaat pada penelitian ini yaitu:

  1. Bagi penulis
    1. Memberikan informasi serta pengetahuan tentang metode Artificial Neural Network dalam Machine Learning.
    2. Mengembangkan dan menerapkan wawasan ilmu yang telah diperoleh dalam bidang statistika khususnya tentang ANN regresi dengan RStudio.
  2. Bagi pembaca
    Menambah ilmu pengetahuan dan pemahaman yang berkaitan tentang ANN regresi serta pengaruh banyaknya hidden neuron dan iterasi dengan RStudio.

1.5 Batasan Masalah

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.

1.6 Sistematika Penulisan

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

BAB II TINJAUAN PUSTAKA

2.1 Artificial Neural Network (ANN)

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.

2.2 Arsitektur ANN

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).

Tabel 1. Jenis arsitektur ANN
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

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.

2.3 Fungsi Aktivasi

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.

Tabel 2. Fungsi aktivasi pada ANN
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).

2.4 Algoritma Backpropagation

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.

  1. Forward propagation, yaitu menghitung keluaran jaringan berdasarkan masukan, bobot, dan fungsi aktivasi.
  2. Backward propagation, yaitu menghitung gradien kesalahan terhadap setiap bobot dari lapisan keluaran ke lapisan sebelumnya.
  3. Pembaruan bobot, yaitu memperbarui bobot berdasarkan gradien untuk mengurangi kesalahan prediksi.

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).

2.5 Overfitting dan Banyaknya Iterasi

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.

2.6 Parameter Penting pada Fungsi nnet()

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.

Tabel 3. Argumen fungsi nnet() yang digunakan
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.

2.7 Interpretasi Bobot Jaringan

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).

2.8 Splitting Data

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.

2.9 Evaluasi Model Regresi

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).

BAB III METODE PENELITIAN

3.1 Sumber Data

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.

3.2 Variabel Penelitian

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.

Tabel 4. Variabel penelitian
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

3.3 Langkah-langkah Analisis

Langkah-langkah analisis yang dilakukan adalah sebagai berikut.

  1. Mengimpor data iris dan melihat ringkasan datanya.
  2. Melakukan eksplorasi data melalui korelasi antarvariabel numerik dan nilai Petal.Width pada setiap spesies.
  3. Membagi data menjadi 80% data training dan 20% data testing secara acak dengan set.seed(918).
  4. Menyusun formula Petal.Width ~ Sepal.Length + Sepal.Width + Petal.Length + Species.
  5. Membangun enam model ANN regresi menggunakan nnet() untuk kombinasi size = 10, 20, 30 dan maxit = 250, 500 dengan linout = TRUE.
  6. Melakukan prediksi pada data testing.
  7. Menghitung MSE, RMSE, MAE, MAPE, dan \(R^2\) untuk setiap model.
  8. Membandingkan keenam model berdasarkan galat data training dan testing, serta membandingkannya dengan regresi linear sebagai pembanding.
  9. Mengulang pembentukan model dengan 20 bobot awal yang berbeda untuk melihat kestabilan hasil.
  10. Menampilkan struktur jaringan, bobot, dan variable importance menggunakan plotnet(), neuralweights(), dan olden().
  11. Menginterpretasikan setiap output dan menarik kesimpulan.

3.4 Diagram Alir Penelitian

Gambar 2. Diagram alir penelitian

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.

BAB IV HASIL DAN PEMBAHASAN

4.1 Library dan Import Data

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.

library(nnet)
library(NeuralNetTools)
library(ggplot2)
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
summary(iris)
##   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
colSums(is.na(iris))
## 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.

4.2 Eksplorasi Data

round(cor(iris[, 1:4]), 4)
##              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.

4.3 Splitting Data

Pembagian data dilakukan sesuai sintaks modul, tetapi proporsinya diubah menjadi 80% data training dan 20% data testing.

set.seed(918)
nrow(iris)
## [1] 150
index <- sample(1:nrow(iris), round(0.8*nrow(iris)))
train <- iris[index, ]; nrow(train)
## [1] 120
test <- iris[-index, ]; nrow(test)
## [1] 30
table(train$Species)
## 
##     setosa versicolor  virginica 
##         40         42         38
table(test$Species)
## 
##     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.

4.4 Membangun Model ANN Regresi

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")
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.

4.5 Prediksi Data Testing

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
# rentang Sepal.Length pada data training dan observasi 132
range(train$Sepal.Length)
## [1] 4.4 7.7
test["132", ]
##     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*

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.

4.6 Evaluasi Model

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
MAE = mean(error); MAE
## [1] -0.1162192
RMSE = sqrt(mean((test$Petal.Width - as.numeric(predict_regresi))^2)); RMSE
## [1] 0.5512471
mean(abs(error))
## [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*")
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.

4.7 Perbandingan Hidden Neuron dan maxit

Untuk melihat ada tidaknya overfitting, galat training dan galat testing setiap model dibandingkan. Regresi linear dengan formula yang sama juga ditambahkan sebagai pembanding sederhana.

lm.fit <- lm(form, data = train)
eval.lm <- evaluasi(test$Petal.Width, predict(lm.fit, newdata = test))

banding <- data.frame(Model = c(grid$Model, "Regresi linear"),
                      MSE_training = c(info$MSE_training, mean(resid(lm.fit)^2)),
                      MSE_testing = c(eval.nn[, "MSE"], eval.lm["MSE"]),
                      MAPE = c(eval.nn[, "MAPE"], eval.lm["MAPE"]), row.names = NULL)
banding$Rasio <- banding$MSE_testing / banding$MSE_training
knitr::kable(banding, digits = 4, align = "c", format.args = list(decimal.mark = ","),
             col.names = c("Model", "MSE training", "MSE testing", "MAPE testing (%)", "MSE testing / MSE training"),
             caption = "Tabel 7. Perbandingan galat *training* dan *testing* setiap model")
Tabel 7. Perbandingan galat training dan testing setiap model
Model MSE training MSE testing MAPE testing (%) MSE testing / MSE training
size=10, maxit=250 0,0163 0,1668 31,1882 10,2426
size=20, maxit=250 0,0172 0,0697 29,4182 4,0657
size=30, maxit=250 0,0134 0,0635 32,6277 4,7498
size=10, maxit=500 0,0148 0,3039 31,0177 20,4996
size=20, maxit=500 0,0084 1,3478 50,2863 160,8147
size=30, maxit=500 0,0043 0,9252 56,8805 214,1137
Regresi linear 0,0270 0,0276 22,0683 1,0210

Berdasarkan Tabel 7, penambahan maxit dari 250 menjadi 500 selalu menurunkan MSE training, tetapi selalu menaikkan MSE testing. Pada size = 20, MSE testing naik dari 0,0737 menjadi 0,8762, dan pada size = 30 naik dari 0,0800 menjadi 1,8481. Pada maxit = 500, penambahan hidden neuron juga menurunkan MSE training (0,0141; 0,0087; 0,0051), tetapi menaikkan MSE testing (0,2251; 0,8762; 1,8481). Rasio MSE testing terhadap MSE training model size = 30 dan maxit = 500 bahkan mencapai hampir 360 kali. Pola ini menunjukkan overfitting, yaitu jaringan semakin cocok dengan data training tetapi semakin buruk pada data baru. Regresi linear memiliki MSE training 0,0270 dan MSE testing 0,0276 yang hampir sama, serta MSE testing dan MAPE yang lebih kecil daripada keenam model ANN. Hal ini sesuai dengan hasil eksplorasi bahwa hubungan Petal.Width dengan prediktornya sudah cukup kuat dan sederhana, sehingga jaringan dengan banyak bobot tidak memberikan keuntungan pada data berukuran kecil ini.

Untuk melihat pengaruh maxit lebih rinci, model dibangun ulang dengan maxit = 10 sampai 500 dengan kelipatan 10. Karena bobot awal sama, setiap model menggambarkan kondisi jaringan pada iterasi tersebut.

iterasi <- seq(10, 500, 10)
kurva <- do.call(rbind, lapply(c(10, 20, 30), function(s) do.call(rbind, lapply(iterasi, function(m) {
  set.seed(918)
  fit <- nnet.formula(form, size = s, data = train, linout = TRUE, maxit = m, trace = FALSE)
  data.frame(size = s, maxit = m, Training = mean(fit$residuals^2),
             Testing = mean((test$Petal.Width - predict(fit, newdata = test))^2))
}))))

# iterasi dengan MSE testing terkecil untuk setiap size
do.call(rbind, lapply(split(kurva, kurva$size), function(d) d[which.min(d$Testing), ]))
##    size maxit   Training    Testing
## 10   10    30 0.02615559 0.01938887
## 20   20    20 0.02801164 0.02044780
## 30   30    30 0.02608295 0.01908732
kurva.df <- data.frame(size = paste(kurva$size, "hidden neuron"), maxit = kurva$maxit,
                       Data = rep(c("Training", "Testing"), each = nrow(kurva)),
                       MSE = c(kurva$Training, kurva$Testing))
kurva.df$size <- factor(kurva.df$size, levels = paste(c(10, 20, 30), "hidden neuron"))

ggplot(kurva.df, aes(maxit, MSE, colour = Data)) +
  geom_vline(xintercept = c(250, 500), linetype = "dashed", colour = "grey60") +
  geom_hline(yintercept = eval.lm["MSE"], linetype = "dotted", colour = "grey30") +
  geom_line(linewidth = 0.8) +
  facet_wrap(~ size) +
  scale_y_log10() +
  scale_colour_manual(values = c(Training = "#008080", Testing = "#E07B00")) +
  labs(x = "Banyaknya iterasi (maxit)", y = "MSE (skala log)", colour = "") +
  theme_minimal() +
  theme(legend.position = "bottom")
Gambar 4. MSE *training* dan *testing* menurut banyaknya iterasi

Gambar 4. MSE training dan testing menurut banyaknya iterasi

Pada Gambar 4, garis putus-putus menunjukkan maxit = 250 dan 500, sedangkan garis titik-titik menunjukkan MSE testing regresi linear. MSE training terus turun ketika iterasi bertambah, sedangkan MSE testing turun hanya pada sekitar 20 sampai 30 iterasi pertama, lalu cenderung naik. MSE testing terkecil sebesar 0,0194 pada size = 10 (30 iterasi), 0,0204 pada size = 20 (20 iterasi), dan 0,0191 pada size = 30 (30 iterasi), lebih kecil daripada MSE testing regresi linear. Jadi, ANN sebenarnya mampu memprediksi Petal.Width dengan baik jika pelatihan dihentikan lebih awal, dan maxit = 250 maupun 500 sudah terlalu banyak untuk data ini. Namun, iterasi terbaik ini ditentukan menggunakan data testing, sehingga hanya digunakan untuk melihat pola. Untuk memilih maxit secara benar, seharusnya digunakan data validasi yang terpisah dari data testing.

4.8 Pengaruh Bobot Awal

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")
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

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.

4.9 Visualisasi Jaringan dan Bobot

Struktur jaringan dan bobot ditampilkan untuk model terbaik pada data testing, yaitu size = 20 dan maxit = 250.

nn.best <- nn[["size=20, maxit=250"]]
plotnet(nn.best, pad_x = 0.62)
Gambar 6. Struktur jaringan ANN regresi *size* = 20 dan *maxit* = 250

Gambar 6. Struktur jaringan ANN regresi size = 20 dan maxit = 250

w <- neuralweights(nn.best)
w$struct
## [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.

4.10 Variable Importance

olden(nn.best)
Gambar 7. *Variable importance* metode Olden pada model *size* = 20 dan *maxit* = 250

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.

BAB V KESIMPULAN DAN SARAN

5.1 Kesimpulan

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.

5.2 Saran

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.

DAFTAR PUSTAKA

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.