Artificial Neural Network (ANN) atau Jaringan Syaraf Tiruan (JST) adalah model komputasi yang terinspirasi dari cara kerja otak manusia, yaitu sejumlah neuron yang saling terhubung untuk memproses informasi dan mempelajari pola dari data (Fransiska, 2026). ANN tersusun atas lapisan masukan (input layer), lapisan tersembunyi (hidden layer), dan lapisan keluaran (output layer). Setiap neuron menerima masukan yang dikalikan bobot, ditambah bias, lalu diproses melalui fungsi aktivasi untuk menghasilkan keluaran. Jaringan dengan satu atau lebih lapisan tersembunyi disebut Multi-Layer Perceptron (MLP) dan mampu mempelajari hubungan non-linear untuk pemodelan regresi maupun klasifikasi (Fransiska, 2026).
Dalam klasifikasi, ANN dilatih menggunakan algoritma backpropagation yang terdiri atas tahap forward propagation, backward propagation, dan pembaruan bobot, sehingga kesalahan prediksi diminimalkan secara bertahap (Aini dkk., 2023; Fransiska, 2026). Penerapan ANN backpropagation untuk klasifikasi telah banyak dilakukan di Indonesia. Harahap (2022) mengklasifikasikan penyakit demam menggunakan 135 data latih dan 15 data uji, dan menemukan melalui trial and error bahwa konfigurasi terbaik memakai 29 neuron pada hidden layer dengan akurasi 100%. Heryanto dkk. (2023) mengklasifikasikan jenis kulit wajah dengan memvariasikan jumlah hidden layer dan jumlah neuron per lapisan, dan memperoleh akurasi 96,70% pada model dengan sembilan lapisan tersembunyi berisi enam neuron pada tiap lapisannya. Kedua penelitian tersebut menunjukkan bahwa jumlah neuron pada lapisan tersembunyi merupakan pengaturan yang perlu dicoba secara empiris.
Selain arsitektur jaringan, proporsi pembagian data training dan testing juga memengaruhi hasil. Sapriani dkk. (2023) membandingkan lima skenario pembagian data pada klasifikasi status preeklampsia, dan skenario terbaik adalah 80% training dan 20% testing dengan akurasi 67,65%, sedangkan skenario 60:40 hanya menghasilkan akurasi 58,21%. Aini dkk. (2023) pada klasifikasi rating produk melaporkan akurasi 0,81 untuk pembagian 60:40 dan 0,83 untuk 80:20, dengan akurasi tertinggi 0,85 pada pembagian 90:10. Temuan-temuan ini menunjukkan bahwa hasil ANN bergantung pada jumlah neuron dan proporsi pembagian data.
Oleh karena itu, pada praktikum ini dilakukan ANN klasifikasi pada
data Iris menggunakan package nnet dengan
membandingkan jumlah hidden neuron sebesar 10, 20, dan 30 pada
dua skenario pembagian data, yaitu 80% training : 20%
testing dan 60% training : 40% testing.
Kinerja setiap model dievaluasi pada data testing menggunakan
confusion matrix, akurasi, presisi, recall, dan
F1-score, kemudian setiap output diinterpretasikan.
Pembahasan ANN regresi pada laporan ini dibatasi pada tinjauan
teori.
Berdasarkan latar belakang, rumusan masalah yang dapat disimpulkan adalah sebagai berikut:
Berdasarkan rumusan masalah tersebut, tujuan yang dapat disimpulkan adalah sebagai berikut:
ANN memiliki tiga komponen utama, yaitu arsitektur jaringan yang menggambarkan pola hubungan antar-neuron, algoritma pembelajaran yang digunakan untuk menyesuaikan bobot jaringan, serta fungsi aktivasi yang menentukan keluaran setiap neuron (Fransiska, 2026; Aini dkk., 2023). Secara matematis, pengolahan informasi pada satu neuron dinyatakan sebagai (Fransiska, 2026):
\[y = f\left(\sum_{i=1}^{p} w_i x_i + b\right)\]
dengan \(x_i\) adalah masukan ke-\(i\), \(w_i\) bobot yang menghubungkan masukan ke-\(i\) dengan neuron, \(b\) bias, \(f\) fungsi aktivasi, dan \(y\) keluaran neuron.
Tabel 1. Arsitektur ANN
| Arsitektur | Keterangan |
|---|---|
| Single Layer Perceptron (SLP) | Jaringan tanpa lapisan tersembunyi yang digunakan untuk mempelajari hubungan linear dan klasifikasi yang dapat dipisahkan secara linear |
| Multi-Layer Perceptron (MLP) | Jaringan dengan satu atau lebih lapisan tersembunyi yang mampu mempelajari hubungan non-linear untuk regresi dan klasifikasi |
Sumber: Fransiska (2026).
Banyaknya neuron pada lapisan tersembunyi menentukan kapasitas jaringan. Pada MLP dengan \(p\) masukan, \(h\) neuron tersembunyi, dan \(K\) keluaran, banyaknya bobot (termasuk bias) yang diestimasi adalah:
\[N_{bobot} = p \cdot h + h + h \cdot K + K\]
Semakin besar \(h\), semakin banyak bobot yang harus dipelajari sehingga model lebih fleksibel, tetapi juga lebih berisiko mengalami overfitting terutama pada data berukuran kecil. Belum ada aturan pasti untuk menentukan jumlah neuron optimal sehingga penentuannya umumnya dilakukan secara trial and error (Harahap, 2022; Sapriani dkk., 2023).
ANN regresi digunakan untuk memprediksi variabel respons berupa nilai
numerik kontinu. Lapisan keluaran umumnya menggunakan fungsi aktivasi
linear agar jaringan dapat menghasilkan nilai prediksi sesuai rentang
variabel respons, dan kinerjanya dievaluasi menggunakan MSE, RMSE, dan
MAPE atau \(R^2\) (Fransiska, 2026).
Pada nnet, hal ini diatur dengan argumen
linout = TRUE. Sesuai batasan masalah, praktikum ini
berfokus pada ANN klasifikasi.
ANN klasifikasi digunakan untuk memprediksi variabel respons berupa kategori. Berdasarkan jumlah kelas, terdapat dua jenis (Fransiska, 2026):
Data Iris memiliki tiga kelas sehingga termasuk klasifikasi multikelas dengan tiga neuron keluaran. Kelas prediksi ditentukan dari neuron keluaran yang memiliki probabilitas terbesar.
Backpropagation menyesuaikan bobot jaringan berdasarkan kesalahan prediksi melalui tiga tahap, yaitu (Fransiska, 2026; Aini dkk., 2023):
Pada klasifikasi multikelas, fungsi kerugian yang digunakan adalah categorical cross-entropy:
\[L = -\frac{1}{n}\sum_{i=1}^{n}\sum_{k=1}^{K} y_{ik}\log(\hat{y}_{ik})\]
dengan \(y_{ik}\) adalah label aktual dan \(\hat{y}_{ik}\) adalah probabilitas prediksi. Pembaruan bobot dengan gradient descent dituliskan:
\[w_{ij}^{(t+1)} = w_{ij}^{(t)} - \eta \frac{\partial L}{\partial w_{ij}}\]
dengan \(\eta\) adalah learning
rate (Fransiska, 2026). Pada nnet, optimasi bobot
dilakukan dengan algoritma BFGS dengan jumlah iterasi maksimum
maxit (bawaan 100), sehingga tidak memakai learning
rate secara eksplisit.
Tabel 2. Fungsi aktivasi pada ANN klasifikasi
| Fungsi | Keterangan |
|---|---|
| Sigmoid | Cocok untuk klasifikasi biner |
| Softmax | Cocok untuk klasifikasi multikelas |
| ReLU | Mempercepat konvergensi dan mengatasi masalah vanishing gradient |
| Tanh | Menghasilkan keluaran antara -1 dan 1 dan membantu normalisasi sinyal neuron |
Sumber: Fransiska (2026).
Pada nnet, lapisan tersembunyi menggunakan fungsi
sigmoid logistik dan lapisan keluaran untuk lebih dari dua kelas
menggunakan softmax.
Evaluasi ANN klasifikasi dilakukan dengan membandingkan kelas aktual dan kelas prediksi yang disajikan dalam confusion matrix (Fransiska, 2026). Pada klasifikasi biner:
Tabel 3. Confusion matrix
| Predicted Positive | Predicted Negative | |
|---|---|---|
| Actual Positive | True Positive (TP) | False Negative (FN) |
| Actual Negative | False Positive (FP) | True Negative (TN) |
Sumber: Fransiska (2026).
\[Akurasi = \frac{TP+TN}{TP+TN+FP+FN}, \quad Presisi = \frac{TP}{TP+FP}, \quad Recall = \frac{TP}{TP+FN}\]
\[F1\text{-}Score = 2\times\frac{Presisi \times Recall}{Presisi + Recall}\]
Pada klasifikasi multikelas, presisi, recall, dan \(F1\) dihitung untuk setiap kelas dengan memperlakukan kelas tersebut sebagai kelas positif dan kelas lainnya sebagai negatif (one-vs-rest), kemudian dirata-ratakan (macro average). Akurasi menyatakan proporsi observasi yang diklasifikasikan benar, yaitu jumlah diagonal confusion matrix dibagi total observasi (Sapriani dkk., 2023; Aini dkk., 2023).
Data Iris tersedia di R (data(iris)) dan terdiri atas
150 observasi bunga iris dari tiga spesies (setosa,
versicolor, virginica) masing-masing 50 observasi.
Terdapat empat variabel prediktor numerik, yaitu
Sepal.Length, Sepal.Width,
Petal.Length, dan Petal.Width (dalam cm),
serta variabel respons Species. Spesies setosa
terpisah jelas dari dua spesies lainnya, sedangkan versicolor
dan virginica sebagian saling tumpang tindih sehingga kesalahan
klasifikasi umumnya terjadi pada kedua kelas tersebut.
Jenis data yang digunakan dalam penelitian ini adalah data
kuantitatif. Data yang digunakan adalah data Iris bawaan R sebanyak 150
observasi. Data dibagi menjadi data training dan
testing dengan dua skenario, yaitu 80% : 20% dan 60% : 40%,
menggunakan pengambilan sampel acak dengan set.seed(917).
Variabel Species digunakan sebagai variabel respons untuk
membangun model ANN klasifikasi.
| No | Variabel | Keterangan | Tipe Data | Peran |
|---|---|---|---|---|
| 1 | Species | Spesies bunga iris (setosa, versicolor, virginica) | Kategorik | Respons |
| 2 | Sepal.Length | Panjang kelopak (cm) | Numerik | Prediktor |
| 3 | Sepal.Width | Lebar kelopak (cm) | Numerik | Prediktor |
| 4 | Petal.Length | Panjang mahkota (cm) | Numerik | Prediktor |
| 5 | Petal.Width | Lebar mahkota (cm) | Numerik | Prediktor |
Tabel 4. Skenario model yang dibandingkan
| Skenario | Data training | Data testing | Hidden neuron |
|---|---|---|---|
| 1 | 80% (120 obs) | 20% (30 obs) | 10 |
| 2 | 80% (120 obs) | 20% (30 obs) | 20 |
| 3 | 80% (120 obs) | 20% (30 obs) | 30 |
| 4 | 60% (90 obs) | 40% (60 obs) | 10 |
| 5 | 60% (90 obs) | 40% (60 obs) | 20 |
| 6 | 60% (90 obs) | 40% (60 obs) | 30 |
nnet,
NeuralNetTools, ggplot2, dan
knitr).sample() dengan
set.seed(917).nnet() untuk
size (hidden neuron) = 10, 20, dan 30 pada kedua
skenario pembagian data (6 model).plotnet(),
neuralweights(), dan olden().Pada batasan masalah diminta melakukan ANN klasifikasi dengan
hidden neuron = c(10, 20, 30) menggunakan data
training 80% dan testing 20% serta data
training 60% dan testing 40%, kemudian
menginterpretasikan setiap output dengan jelas. Data yang
digunakan adalah data Iris dan seluruh pembagian data serta pelatihan
model menggunakan set.seed(917) sesuai contoh pada
modul.
Package nnet menyediakan fungsi
nnet() untuk membangun ANN dengan satu lapisan tersembunyi,
NeuralNetTools untuk visualisasi arsitektur
(plotnet()), pengambilan bobot
(neuralweights()), dan variable importance
(olden()), ggplot2 untuk visualisasi, serta
knitr untuk menyajikan tabel.
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
## [1] 150 5
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
## Median :5.800 Median :3.000 Median :4.350 Median :1.300
## 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
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
Data Iris terdiri atas 150 observasi dan 5 variabel, yaitu 4 variabel
prediktor numerik dan 1 variabel respons Species bertipe
factor dengan 3 kelas, masing-masing 50, 50, 50 observasi
(setosa, versicolor, virginica). Jumlah observasi yang sama pada tiap
kelas menunjukkan data seimbang (balanced) sehingga akurasi
cukup layak digunakan sebagai ukuran evaluasi. Rata-rata
Petal.Length adalah 3,76 cm dan rata-rata
Petal.Width adalah 1,20 cm.
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 0 0 0 0 0
Tidak terdapat missing value pada data (total 0), sehingga data dapat langsung digunakan tanpa penanganan data hilang.
par(mfrow = c(1, 2))
boxplot(Petal.Length ~ Species, data = iris, col = c("#A5D6A7", "#90CAF9", "#FFCC80"),
main = "Petal.Length menurut Species", xlab = "Species", ylab = "cm")
boxplot(Petal.Width ~ Species, data = iris, col = c("#A5D6A7", "#90CAF9", "#FFCC80"),
main = "Petal.Width menurut Species", xlab = "Species", ylab = "cm")Boxplot memperlihatkan bahwa Petal.Length dan
Petal.Width pada setosa jauh lebih kecil dan tidak
tumpang tindih dengan dua spesies lain, sedangkan versicolor
dan virginica memiliki rentang yang berdekatan dan sebagian
beririsan. Pola ini menjadi dugaan awal bahwa setosa mudah
diklasifikasikan, sedangkan kesalahan klasifikasi, jika ada, paling
mungkin terjadi antara versicolor dan virginica.
lv <- levels(iris$Species)
bagi_data <- function(prop) {
set.seed(917)
index <- sample(1:nrow(iris), round(prop * nrow(iris)))
list(train = iris[index, ], test = iris[-index, ])
}
sp80 <- bagi_data(0.8) # training 80% - testing 20%
sp60 <- bagi_data(0.6) # training 60% - testing 40%
c(train80 = nrow(sp80$train), test20 = nrow(sp80$test),
train60 = nrow(sp60$train), test40 = nrow(sp60$test))## train80 test20 train60 test40
## 120 30 90 60
dist_kelas <- rbind(
"80:20 - training" = table(sp80$train$Species),
"80:20 - testing" = table(sp80$test$Species),
"60:40 - training" = table(sp60$train$Species),
"60:40 - testing" = table(sp60$test$Species)
)
kable(dist_kelas, align = "c", caption = "Banyaknya observasi tiap spesies pada data training dan testing")| setosa | versicolor | virginica | |
|---|---|---|---|
| 80:20 - training | 42 | 40 | 38 |
| 80:20 - testing | 8 | 10 | 12 |
| 60:40 - training | 33 | 26 | 31 |
| 60:40 - testing | 17 | 24 | 19 |
Pada skenario 80:20, data training berjumlah 120 observasi dan data testing 30 observasi, sehingga setiap observasi testing mewakili 3,33% akurasi. Pada skenario 60:40, data training berjumlah 90 observasi dan data testing 60 observasi, sehingga setiap observasi testing mewakili 1,67% akurasi. Pengambilan sampel dilakukan secara acak sehingga proporsi tiap spesies pada data training dan testing tidak persis sama dengan proporsi awal (lihat tabel), yang wajar karena tidak digunakan pengambilan sampel berstrata.
# Fungsi evaluasi klasifikasi multikelas (macro average)
hitung_klas <- function(aktual, prediksi) {
aktual <- factor(aktual, levels = lv)
prediksi <- factor(prediksi, levels = lv)
tab <- table(Aktual = aktual, Prediksi = prediksi)
acc <- sum(diag(tab)) / sum(tab)
prec <- diag(tab) / colSums(tab)
rec <- diag(tab) / rowSums(tab)
f1 <- 2 * prec * rec / (prec + rec)
prec[is.nan(prec)] <- 0; rec[is.nan(rec)] <- 0; f1[is.nan(f1)] <- 0
list(tab = tab, acc = acc, prec = prec, rec = rec, f1 = f1,
prec_m = mean(prec), rec_m = mean(rec), f1_m = mean(f1))
}Fungsi hitung_klas() menyusun confusion matrix
dan menghitung akurasi, presisi, recall, dan \(F1\) per kelas serta rata-ratanya
(macro average) sesuai rumus pada subbab 2.7.
Model dibentuk untuk size = 10, 20, dan 30 pada kedua
skenario pembagian data. Seluruh parameter lain menggunakan nilai bawaan
nnet() (antara lain maxit = 100), dan
set.seed(917) dipanggil sebelum setiap model dilatih karena
bobot awal jaringan ditentukan secara acak.
skenario <- expand.grid(Hidden = c(10L, 20L, 30L), prop = c(0.8, 0.6))
skenario$Split <- ifelse(skenario$prop == 0.8, "80:20", "60:40")
model_list <- vector("list", nrow(skenario))
metrik_list <- vector("list", nrow(skenario))
hasil_rows <- vector("list", nrow(skenario))
for (i in seq_len(nrow(skenario))) {
sp <- if (skenario$prop[i] == 0.8) sp80 else sp60
set.seed(917)
mod <- nnet(Species ~ ., data = sp$train, size = skenario$Hidden[i], trace = FALSE)
prd_test <- predict(mod, newdata = sp$test, type = "class")
prd_train <- predict(mod, newdata = sp$train, type = "class")
m <- hitung_klas(sp$test$Species, prd_test)
model_list[[i]] <- mod
metrik_list[[i]] <- m
hasil_rows[[i]] <- data.frame(
Split = skenario$Split[i],
Hidden = skenario$Hidden[i],
N_train = nrow(sp$train),
N_test = nrow(sp$test),
Jumlah_Bobot = length(mod$wts),
Galat_Akhir = mod$value,
Konvergen = mod$convergence == 0,
Akurasi_train = mean(prd_train == sp$train$Species),
Akurasi_test = m$acc,
Presisi = m$prec_m,
Recall = m$rec_m,
F1 = m$f1_m
)
}
hasil <- do.call(rbind, hasil_rows)
rownames(hasil) <- NULLKeenam model berhasil dibentuk. Banyaknya bobot yang diestimasi pada tiap model mengikuti rumus \(N_{bobot} = p \cdot h + h + h \cdot K + K\) dengan \(p = 4\) dan \(K = 3\), yaitu 83, 163, 243 bobot untuk hidden neuron 10, 20, dan 30. Jumlah bobot ini jauh lebih besar dibandingkan banyaknya data training (120 dan 90 observasi), sehingga ada kemungkinan model mengalami overfitting, yang diperiksa dengan membandingkan akurasi training dan testing.
Pada Output ini data training sebanyak 120 observasi (80%) dan data testing sebanyak 30 observasi (20%).
Pada skenario ini data training sebanyak 90 observasi (60%) dan data testing sebanyak 60 observasi (40%).
tab_banding <- hasil[, c("Split", "Hidden", "Akurasi_train", "Akurasi_test", "Presisi", "Recall", "F1")]
kable(tab_banding, digits = 4, align = "c",
caption = "Perbandingan kinerja seluruh model (Presisi, Recall, dan F1 adalah rata-rata makro pada data testing)")| Split | Hidden | Akurasi_train | Akurasi_test | Presisi | Recall | F1 |
|---|---|---|---|---|---|---|
| 80:20 | 10 | 0.9917 | 1.00 | 1.0000 | 1.0000 | 1.0000 |
| 80:20 | 20 | 1.0000 | 0.90 | 0.9231 | 0.9167 | 0.9089 |
| 80:20 | 30 | 1.0000 | 0.90 | 0.9117 | 0.9056 | 0.9074 |
| 60:40 | 10 | 1.0000 | 0.95 | 0.9548 | 0.9510 | 0.9526 |
| 60:40 | 20 | 1.0000 | 0.95 | 0.9548 | 0.9510 | 0.9526 |
| 60:40 | 30 | 1.0000 | 0.95 | 0.9630 | 0.9474 | 0.9518 |
Berdasarkan akurasi pada data testing, model terbaik adalah model dengan 10 hidden neuron pada skenario 80:20 dengan akurasi 100,00%, presisi 1,0000, recall 1,0000, dan \(F1\) 1,0000. Model ini memiliki akurasi testing tertinggi tunggal di antara keenam model.
kable(tab_split, digits = 4, align = "c",
caption = "Rata-rata kinerja menurut skenario pembagian data (rata-rata atas tiga hidden neuron)")| Split | Akurasi_train | Akurasi_test | Presisi | Recall | F1 |
|---|---|---|---|---|---|
| 60:40 | 1.0000 | 0.9500 | 0.9575 | 0.9498 | 0.9523 |
| 80:20 | 0.9972 | 0.9333 | 0.9449 | 0.9407 | 0.9388 |
kable(tab_hidden, digits = 4, align = "c",
caption = "Rata-rata kinerja menurut jumlah hidden neuron (rata-rata atas dua skenario pembagian data)")| Hidden | Akurasi_train | Akurasi_test | Presisi | Recall | F1 |
|---|---|---|---|---|---|
| 10 | 0.9958 | 0.975 | 0.9774 | 0.9755 | 0.9763 |
| 20 | 1.0000 | 0.925 | 0.9389 | 0.9338 | 0.9307 |
| 30 | 1.0000 | 0.925 | 0.9373 | 0.9265 | 0.9296 |
Pengaruh proporsi pembagian data. Rata-rata akurasi testing pada skenario 80:20 adalah 93,33% dan pada skenario 60:40 adalah 95,00%. Skenario 60:40 menghasilkan akurasi rata-rata yang lebih tinggi, sehingga tidak sejalan dengan temuan Sapriani dkk. (2023) dan Aini dkk. (2023) bahwa porsi data training yang lebih besar cenderung lebih baik. Hal ini dapat terjadi karena data Iris berukuran kecil dengan kelas yang relatif mudah dipisahkan, sehingga hasil sangat dipengaruhi oleh komposisi observasi yang kebetulan masuk ke data testing. Perlu diingat bahwa data testing skenario 80:20 hanya 30 observasi sehingga satu kesalahan klasifikasi mengubah akurasi sebesar 3,33 poin persentase, sedangkan pada skenario 60:40 sebesar 1,67 poin persentase. Selisih akurasi yang kecil antar-skenario sebaiknya tidak ditafsirkan sebagai perbedaan kemampuan model yang nyata.
Pengaruh jumlah hidden neuron. Pada skenario 80:20, akurasi testing untuk 10, 20, dan 30 hidden neuron masing-masing adalah 100,00%, 90,00%, 90,00%, dengan rentang 10,00 poin persentase antar-model. Pada skenario 60:40, akurasinya masing-masing 95,00%, 95,00%, 95,00%, sehingga penambahan neuron juga tidak mengubah akurasi. Jumlah neuron memberikan perbedaan akurasi yang cukup terlihat, tetapi karena data testing berukuran kecil perbedaan tersebut perlu ditafsirkan dengan hati-hati. Penambahan neuron juga meningkatkan jumlah bobot dari 83 menjadi 243, sehingga kompleksitas model meningkat. Sebanyak 1 dari 6 model berhenti pada iterasi maksimum (maxit = 100) sebelum konvergen. Hal ini menunjukkan model dengan neuron lebih banyak membutuhkan iterasi lebih banyak, sehingga menaikkan maxit dapat menjadi pengaturan yang layak dicoba. Hasil ini sejalan dengan Harahap (2022) dan Heryanto dkk. (2023) bahwa jumlah neuron perlu ditentukan secara empiris dan tidak selalu semakin banyak semakin baik.
plot_df <- rbind(
data.frame(Split = hasil$Split, Hidden = factor(hasil$Hidden), Jenis = "Training", Akurasi = hasil$Akurasi_train),
data.frame(Split = hasil$Split, Hidden = factor(hasil$Hidden), Jenis = "Testing", Akurasi = hasil$Akurasi_test)
)
plot_df$Split <- factor(plot_df$Split, levels = c("80:20", "60:40"))
plot_df$Jenis <- factor(plot_df$Jenis, levels = c("Training", "Testing"))
ggplot(plot_df, aes(x = Hidden, y = Akurasi, fill = Jenis)) +
geom_col(position = "dodge") +
geom_text(aes(label = round(Akurasi, 3)), position = position_dodge(width = 0.9),
vjust = -0.3, size = 3) +
facet_wrap(~ Split, labeller = labeller(Split = function(x) paste("Pembagian data", x))) +
coord_cartesian(ylim = c(0, 1.08)) +
theme_minimal() +
labs(title = "Akurasi Data Training dan Testing menurut Hidden Neuron",
x = "Jumlah hidden neuron", y = "Akurasi", fill = "")Grafik batang membandingkan akurasi training dan testing untuk setiap jumlah hidden neuron pada kedua skenario. Selisih yang besar antara batang training dan testing menandakan overfitting, sedangkan batang yang sama tinggi menandakan model dapat menggeneralisasi dengan baik.
Eksplorasi dilakukan pada model terbaik, yaitu model dengan 10 hidden neuron pada skenario 80:20.
mod_best <- model_list[[i_best]]
sp_best <- if (hasil$Split[i_best] == "80:20") sp80 else sp60
mod_best## a 4-10-3 network with 83 weights
## inputs: Sepal.Length Sepal.Width Petal.Length Petal.Width
## output(s): Species
## options were - softmax modelling
Diagram menampilkan arsitektur model terbaik: 4 neuron pada input
layer (Sepal.Length, Sepal.Width,
Petal.Length, Petal.Width), 10 neuron pada
hidden layer, dan 3 neuron pada output layer (satu
untuk tiap spesies). Neuron berlabel B adalah bias. Garis hitam
menunjukkan bobot positif dan garis abu-abu menunjukkan bobot negatif,
sedangkan ketebalan garis sebanding dengan besar bobot. Banyaknya garis
yang terbentuk menunjukkan jaringan terhubung penuh (fully
connected) dengan 83 bobot.
## List of 2
## $ struct: int [1:3] 4 10 3
## $ wts :List of 13
Output neuralweights() memuat bobot yang
menghubungkan setiap neuron pada satu lapisan ke lapisan berikutnya,
termasuk bobot bias. Total bobot yang diestimasi pada model terbaik
adalah 83, sesuai rumus \(p \cdot h + h + h
\cdot K + K\). Bobot-bobot ini yang diperbarui selama proses
backpropagation untuk meminimalkan galat. Karena banyak dan
saling berinteraksi melalui fungsi aktivasi non-linear, bobot individual
sulit diinterpretasikan langsung sehingga variable importance
digunakan sebagai ringkasan.
olden_mat <- tryCatch({
sapply(lv, function(sp) {
o <- olden(mod_best, out_var = sp, bar_plot = FALSE)
v <- o$importance
names(v) <- rownames(o)
v[names(iris)[1:4]]
})
}, error = function(e) NULL)
if (!is.null(olden_mat)) kable(olden_mat, digits = 3, align = "c",
caption = "Olden variable importance menurut neuron keluaran (spesies)")| setosa | versicolor | virginica | |
|---|---|---|---|
| Sepal.Length | 2547227 | 6060020 | -8609192 |
| Sepal.Width | 2893670 | 6840309 | -9736171 |
| Petal.Length | -5567725 | -13147630 | 18719615 |
| Petal.Width | -5286873 | -12526804 | 17817810 |
for (sp in lv) {
tryCatch(print(olden(mod_best, out_var = sp) +
ggtitle(paste("Olden variable importance - neuron keluaran", sp))),
error = function(e) NULL)
}Metode Olden menjumlahkan hasil kali bobot dari tiap prediktor
melalui seluruh neuron tersembunyi menuju satu neuron keluaran, sehingga
nilainya memiliki tanda. Nilai positif berarti kenaikan prediktor
meningkatkan keluaran neuron tersebut (peluang spesies tersebut),
sedangkan nilai negatif berarti sebaliknya, dan semakin besar nilai
mutlaknya semakin besar pengaruhnya. Hasilnya: pada neuron keluaran
setosa variabel dengan pengaruh terbesar adalah
Petal.Length (-5.567.724,81, berpengaruh negatif); pada
neuron keluaran versicolor variabel dengan pengaruh terbesar
adalah Petal.Length (-13.147.629,53, berpengaruh negatif);
pada neuron keluaran virginica variabel dengan pengaruh
terbesar adalah Petal.Length (18.719.615,17, berpengaruh
positif). Hasil ini sebaiknya dibandingkan dengan boxplot pada subbab
4.2, yaitu variabel ukuran mahkota (Petal) tampak paling membedakan
ketiga spesies, sedangkan nilai olden bergantung pada bobot awal acak
dan karena itu dapat berbeda jika model dilatih ulang dengan seed yang
berbeda.
Artificial Neural Network (ANN) adalah model yang terdiri
atas input layer, hidden layer, dan output
layer, yang dilatih dengan backpropagation melalui tahap
forward propagation, backward propagation, dan
pembaruan bobot. Pada klasifikasi multikelas, lapisan keluaran
menggunakan softmax sehingga setiap kelas memiliki probabilitas
dan jumlah probabilitasnya sama dengan 1. ANN klasifikasi pada data Iris
berhasil dibangun menggunakan fungsi nnet() dan dievaluasi
menggunakan confusion matrix, akurasi, presisi,
recall, dan \(F1\).
Berdasarkan perbandingan enam model (hidden neuron 10, 20, dan 30 pada pembagian data 80:20 dan 60:40), model terbaik pada data testing adalah model dengan 10 hidden neuron pada skenario 80:20 dengan akurasi 100,00%, presisi 1,0000, recall 1,0000, dan \(F1\) 1,0000. Rata-rata akurasi testing pada skenario 80:20 adalah 93,33% dan pada skenario 60:40 adalah 95,00%, sehingga skenario 60:40 menghasilkan akurasi rata-rata yang lebih baik pada data ini. Akurasi antar-jumlah hidden neuron menunjukkan perbedaan yang terlihat, sehingga jumlah neuron yang lebih banyak tidak otomatis memberikan hasil yang lebih baik dan hanya menambah jumlah bobot dari 83 menjadi 243. Karena data testing berukuran kecil, perbedaan satu atau dua observasi dapat mengubah urutan model, sehingga pemilihan model terbaik perlu ditafsirkan dengan hati-hati.
Praktikan disarankan untuk mempelajari lebih lanjut mengenai program
RStudio melalui berbagai sumber pembelajaran, seperti buku, jurnal,
modul praktikum, maupun sumber belajar lainnya agar semakin memahami
penerapan ANN. Pada penelitian selanjutnya, disarankan menggunakan
validasi silang (cross-validation) atau pengulangan pembagian
data dengan beberapa nilai set.seed agar perbandingan model
lebih andal, menaikkan nilai maxit bila model belum
konvergen, menambahkan regularisasi (decay) untuk
mengurangi overfitting, melakukan standardisasi prediktor,
serta menggunakan data yang lebih besar atau lebih kompleks seperti
Breast Cancer. Praktikan juga diharapkan lebih teliti dalam
melakukan pengolahan data dan penulisan kode program agar dapat
meminimalkan kesalahan selama praktikum.
Fransiska, H. (2026). Modul Praktikum Machine Learning dan Model Prediction. Universitas Bengkulu: Bengkulu.
Aini, D. H. N., Kurniasari, D., Nuryaman, A., & Usman, M. (2023). Implementasi artificial neural network dengan algoritma backpropagation untuk klasifikasi penilaian rating pada penjualan Blackmores di Tokopedia. Jurnal Teknik Informatika (JUTIF), 4(2), 365–372. https://doi.org/10.52436/1.jutif.2023.4.2.539
Harahap, C. P. (2022). Klasifikasi penyakit demam menggunakan jaringan syaraf tiruan algoritma backpropagation. Journal of Informatics and Data Science, 1(2). https://doi.org/10.24114/j-ids.v1i2.38680
Heryanto, M. A., Juananta, D., Sadanareswari, A., & Wulandari, S. A. (2023). Klasifikasi jenis kulit wajah menggunakan backpropagation neural networks berbasis GLCM. ELKOMIKA: Jurnal Teknik Energi Elektrik, Teknik Telekomunikasi, & Teknik Elektronika, 11(3), 705–715. https://doi.org/10.26760/elkomika.v11i3.705
Sapriani, Poerwanto, B., & Aswi, A. (2023). Implementasi backpropagation neural network pada status preeklampsia ibu hamil. Jurnal Matematika dan Statistika serta Aplikasinya, 11(2). https://journal.uin-alauddin.ac.id/index.php/msa/article/download/40657/18540