Perkembangan teknologi informasi menyebabkan data yang dihasilkan semakin besar dan beragam sehingga diperlukan metode machine learning untuk mempelajari pola dari data dan memprediksi suatu keluaran. Salah satu metode yang banyak digunakan adalah Artificial Neural Network (ANN) atau jaringan syaraf tiruan, yaitu model komputasi yang terinspirasi dari kerja otak manusia. ANN tersusun atas neuron-neuron yang saling terhubung dalam lapisan masukan (input layer), lapisan tersembunyi (hidden layer), dan lapisan keluaran (output layer). Setiap neuron memproses masukan melalui bobot dan bias, kemudian menerapkan fungsi aktivasi untuk menghasilkan keluaran (Fransiska, 2026; Saragih & Huda, 2022). Kemampuan tersebut membuat ANN dapat digunakan untuk permasalahan regresi maupun klasifikasi.
Pada klasifikasi, ANN digunakan untuk memprediksi variabel respons yang berbentuk kategori. Proses pembelajarannya bersifat terawasi (supervised learning) dan dilakukan melalui algoritma backpropagation, yaitu penyesuaian bobot jaringan berdasarkan kesalahan prediksi agar kesalahan tersebut semakin kecil (Fransiska, 2026). Arsitektur jaringan, termasuk banyaknya neuron pada hidden layer, memengaruhi kemampuan jaringan dalam mempelajari pola data. Jumlah neuron yang terlalu sedikit cenderung menyebabkan underfitting, sedangkan jumlah yang berlebihan berpotensi menimbulkan overfitting. Oleh karena itu, jumlah neuron pada hidden layer pada umumnya ditentukan melalui percobaan terhadap beberapa konfigurasi (Harahap, 2022).
Selain arsitektur jaringan, kinerja ANN dipengaruhi oleh praproses dan pembagian data. Normalisasi atau standardisasi data bertujuan menyesuaikan rentang nilai masukan agar sesuai dengan fungsi aktivasi sehingga pelatihan lebih stabil dan konvergensi bobot lebih cepat (Hertanto dkk., 2025), sedangkan pembagian data latih dan data uji merupakan tahapan yang lazim dilakukan sebelum model dievaluasi (Harahap, 2022). Kinerja model klasifikasi dinilai menggunakan confusion matrix beserta ukuran Accuracy, Precision, Recall, Specificity, dan F1-score (Lestari & Sirodj, 2021; Fransiska, 2026).
Berdasarkan latar belakang di atas, adapun rumusan masalah sebagai berikut:
Berdasarkan rumusan masalah, tujuan yang dapat disimpulkan adalah sebagai berikut:
Manfaat yang diperoleh melalui penelitian ini, yaitu:
Bagi penulis:
Bagi pembaca:
Adapun batasan masalah pada penelitian ini adalah menerapkan metode Artificial Neural Network (ANN) untuk klasifikasi dengan jumlah hidden neuron sebesar 10, 20, dan 30, menggunakan pembagian data training dan testing sebesar 80%:20% serta 60%:40%, kemudian menginterpretasikan hasil setiap model.
Adapun sistematika penulisan dari praktikum ini adalah:
BAB I PENDAHULUAN
Bab ini memuat latar belakang, rumusan masalah, tujuan dan manfaat, batasan masalah dan sistematika penulisan.
BAB II TINJAUAN PUSTAKA
Bab ini merupakan bab yang memuat pengertian dan teori yang diperlukan untuk rancangan penelitian pada bab-bab berikutnya.
BAB III METODE PENELITIAN
Bab ini merupakan bab yang memuat jenis dan sumber data, variabel penelitian, rancangan percobaan, dan langkah-langkah analisis yang diperlukan untuk rancangan penelitian pada bab-bab berikutnya.
BAB IV HASIL DAN PEMBAHASAN
Bab ini merupakan bab yang memuat hasil dan pembahasan yang telah dilakukan pada program kemudian diinterpretasikan.
BAB V KESIMPULAN DAN SARAN
Bab ini merupakan bab yang memuat kesimpulan dan saran.
DAFTAR PUSTAKA
Artificial Neural Network (ANN) merupakan model komputasi yang terinspirasi dari kerja otak manusia, yaitu sejumlah neuron saling terhubung untuk memproses informasi dan mempelajari pola dari data (Fransiska, 2026). Saragih dan Huda (2022) menjelaskan bahwa jaringan syaraf tiruan merupakan metode komputasi yang meniru sistem jaringan syaraf biologi dengan elemen perhitungan nonlinier dasar yang disebut neuron dan diorganisasikan sebagai jaringan yang saling terhubung. ANN terdiri atas lapisan masukan (input layer), lapisan tersembunyi (hidden layer), dan lapisan keluaran (output layer). Setiap neuron menerima masukan yang dikalikan dengan bobot tertentu, ditambahkan bias, kemudian diproses melalui fungsi aktivasi untuk menghasilkan keluaran (Fransiska, 2026).
Secara matematis, pengolahan informasi pada suatu neuron dinyatakan sebagai berikut (Fransiska, 2026):
\[ y=f\left(\sum_{i=1}^{p}w_i x_i+b\right) \]
Keterangan:
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 (Fransiska, 2026).
Arsitektur ANN dibedakan menjadi Single Layer Perceptron (SLP) dan Multi-Layer Perceptron (MLP) (Fransiska, 2026). Perbedaan keduanya dirangkum pada Tabel 1 berikut.
Tabel 1. Arsitektur Jaringan 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. |
Hertanto dkk. (2025) menyebutkan bahwa jaringan banyak lapisan memiliki kemampuan yang lebih baik dalam menyelesaikan permasalahan kompleks dibandingkan jaringan yang hanya terdiri dari satu lapisan. Praktikum ini menggunakan MLP dengan satu hidden layer.
Backpropagation merupakan algoritma pembelajaran pada ANN yang digunakan untuk menyesuaikan bobot jaringan berdasarkan kesalahan prediksi (Fransiska, 2026). Algoritma ini menggunakan konsep supervised learning, yaitu pembelajaran dengan data yang kelas atau nilai targetnya telah diketahui (Saragih & Huda, 2022). Proses pembelajaran terdiri atas tiga tahap berikut (Fransiska, 2026):
Pembaruan bobot menggunakan gradient descent dapat dituliskan sebagai berikut (Fransiska, 2026):
\[ w_{ij}^{(t+1)}=w_{ij}^{(t)}-\eta\frac{\partial L}{\partial w_{ij}} \]
dengan \(L\) adalah fungsi kerugian (loss function) dan \(\eta\) adalah laju pembelajaran (learning rate). Proses pelatihan dilakukan berulang sampai kesalahan mencapai nilai minimum yang diharapkan atau batas iterasi maksimum tercapai (Hertanto dkk., 2025).
Fungsi aktivasi digunakan untuk menentukan keluaran neuron dan membantu jaringan mempelajari pola nonlinear (Fransiska, 2026). Beberapa fungsi aktivasi yang umum digunakan dirangkum pada Tabel 2 berikut.
Tabel 2. Fungsi Aktivasi pada ANN
| Fungsi | Rumus | Penggunaan |
|---|---|---|
| Sigmoid | \(f(z)=\dfrac{1}{1+e^{-z}}\), dengan \(f'(z)=f(z)\left[1-f(z)\right]\) | Hidden layer atau klasifikasi biner; menghasilkan nilai antara 0 dan 1. |
| Hyperbolic tangent (Tanh) | \(f(x)=\dfrac{1-e^{-2x}}{1+e^{-2x}}=\tanh(x)\), dengan \(f'(x)=1-\tanh^{2}(x)\) | Hidden layer; menghasilkan nilai antara -1 dan 1. |
| Rectified Linear Unit (ReLU) | \(f(x)=\max(0,x)\) | Hidden layer; mempelajari pola nonlinear dan mempercepat konvergensi. |
| Softmax | \(\operatorname{softmax}(z_k)=\dfrac{e^{z_k}}{\sum_{j=1}^{K}e^{z_j}}\) | Klasifikasi multikelas; jumlah probabilitas seluruh kelas sama dengan 1. |
Pemilihan fungsi aktivasi dapat memengaruhi kecepatan konvergensi dan kemampuan jaringan dalam memodelkan hubungan nonlinear (Fransiska, 2026).
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. Evaluasi dilakukan dengan membandingkan nilai aktual dan nilai prediksi menggunakan Mean Squared Error (MSE) dan Mean Absolute Percentage Error (MAPE) (Fransiska, 2026):
\[ MSE=\frac{1}{n}\sum_{i=1}^{n}\left(y_i-\hat{y}_i\right)^2 \qquad MAPE=\frac{100\%}{n}\sum_{i=1}^{n}\left|\frac{y_i-\hat{y}_i}{y_i}\right| \]
Nilai MSE dan MAPE yang lebih kecil menunjukkan prediksi yang lebih mendekati nilai aktual.
ANN klasifikasi digunakan untuk memprediksi variabel respons berupa kategori. Berdasarkan jumlah kelasnya, klasifikasi dibedakan menjadi dua jenis (Fransiska, 2026):
Pembelajaran ANN klasifikasi dilakukan dengan meminimalkan kesalahan klasifikasi. Salah satu fungsi kerugian yang digunakan adalah cross-entropy loss, yang mengukur perbedaan antara probabilitas prediksi dan kelas aktual. Untuk klasifikasi biner digunakan binary cross-entropy (Fransiska, 2026):
\[ BCE=-\frac{1}{n}\sum_{i=1}^{n}\left[y_i\ln(\hat{p}_i)+(1-y_i)\ln(1-\hat{p}_i)\right] \]
dengan \(y_i\) adalah kelas aktual observasi ke-\(i\) yang bernilai 0 atau 1, dan \(\hat{p}_i\) adalah probabilitas kelas positif pada observasi ke-\(i\). Untuk klasifikasi multikelas digunakan 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 model untuk kelas ke-\(k\) (Fransiska, 2026).
Evaluasi ANN klasifikasi dilakukan dengan membandingkan kelas aktual dan kelas hasil prediksi, yang disajikan dalam confusion matrix (Fransiska, 2026). Struktur confusion matrix untuk klasifikasi biner disajikan pada Tabel 3 berikut.
Tabel 3. Confusion Matrix
| Prediksi Positif | Prediksi Negatif | |
|---|---|---|
| Aktual Positif | True Positive (TP) | False Negative (FN) |
| Aktual Negatif | False Positive (FP) | True Negative (TN) |
Berdasarkan confusion matrix, ukuran evaluasi yang digunakan adalah sebagai berikut (Fransiska, 2026).
1. Accuracy
\[ \text{Accuracy}=\frac{TP+TN}{TP+TN+FP+FN} \]
2. Precision
\[ \text{Precision}=\frac{TP}{TP+FP} \]
3. Recall
\[ \text{Recall}=\frac{TP}{TP+FN} \]
4. Specificity
\[ \text{Specificity}=\frac{TN}{TN+FP} \]
5. F1-score
\[ F1\text{-score}=2\times\frac{\text{Precision}\times\text{Recall}}{\text{Precision}+\text{Recall}} \]
Accuracy menunjukkan proporsi prediksi yang benar secara keseluruhan, Precision mengukur ketepatan prediksi pada kelas positif, Recall mengukur kemampuan model mengenali seluruh kasus positif, Specificity mengukur kemampuan model mengenali kasus negatif, sedangkan F1-score merupakan rata-rata harmonis Precision dan Recall. Pada praktikum ini kelas malignant ditetapkan sebagai kelas positif, sehingga Recall menunjukkan kemampuan model mengenali observasi malignant dan Specificity menunjukkan kemampuan model mengenali observasi benign.
Penelitian ini merupakan penelitian terapan dengan pendekatan
kuantitatif. Data yang digunakan adalah data sekunder berupa
dataset BreastCancer dari package
mlbench pada program R. Data tersebut memuat hasil
pengamatan karakteristik sel jaringan payudara yang digunakan untuk
mengklasifikasikan tumor sebagai benign (jinak) atau
malignant (ganas) menggunakan ANN.
Variabel respons yang digunakan adalah Class, yaitu
kelas tumor dengan kategori benign dan malignant.
Variabel prediktor meliputi Cl.thickness,
Cell.size, Cell.shape,
Marg.adhesion, Epith.c.size,
Bare.nuclei, Bl.cromatin,
Normal.nucleoli, dan Mitoses. Kolom
Id tidak digunakan karena hanya berfungsi sebagai identitas
observasi.
Berikut merupakan algoritma pengolahan data:
Mulai.
Input data.
Membagi data training dan testing (80%:20% dan 60%:40%).
Membangun model ANN dengan hidden neuron 10, 20, dan 30.
Melakukan prediksi dan evaluasi model.
Menginterpretasikan dan membandingkan hasil.
Menarik kesimpulan.
Selesai.
Berikut merupakan diagram alir penelitian:
Gambar 3.1 Diagram Alir Penelitian
# 2. Data
# Mengambil Dataset
data("BreastCancer", package = "mlbench")
bc_raw <- BreastCancer
# Melihat Dimensi Data
dim(bc_raw)## [1] 699 11
## Id Cl.thickness Cell.size Cell.shape Marg.adhesion
## 0 0 0 0 0
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses
## 0 16 0 0 0
## Class
## 0
Interpretasi: Dataset
BreastCancer terdiri atas 699 observasi dan 11 variabel,
yaitu kolom Id, sembilan variabel prediktor, dan variabel
Class. Terdapat 16 data kosong pada variabel
Bare.nuclei, sedangkan variabel lainnya tidak memiliki data
kosong.
# 3. Preprocessing Data
# Menghapus Kolom Id (Identitas Observasi)
bc <- bc_raw
bc$Id <- NULL
# Menghapus Pengamatan dengan Missing Value
bc <- na.omit(bc)
# Mengubah Prediktor Menjadi Numerik
kolom_prediktor <- setdiff(names(bc), "Class")
bc[kolom_prediktor] <- lapply(bc[kolom_prediktor], function(x) {
as.numeric(as.character(x))
})
# Menetapkan Urutan Kelas (benign sebagai Level Pertama)
bc$Class <- factor(as.character(bc$Class), levels = c("benign", "malignant"))
# Memeriksa Dimensi dan Missing Value Setelah Preprocessing
dim(bc)## [1] 683 10
## [1] 0
## Cl.thickness Cell.size Cell.shape Marg.adhesion
## Min. : 1.000 Min. : 1.000 Min. : 1.000 Min. : 1.00
## 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 1.000 1st Qu.: 1.00
## Median : 4.000 Median : 1.000 Median : 1.000 Median : 1.00
## Mean : 4.442 Mean : 3.151 Mean : 3.215 Mean : 2.83
## 3rd Qu.: 6.000 3rd Qu.: 5.000 3rd Qu.: 5.000 3rd Qu.: 4.00
## Max. :10.000 Max. :10.000 Max. :10.000 Max. :10.00
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli
## Min. : 1.000 Min. : 1.000 Min. : 1.000 Min. : 1.00
## 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 1.00
## Median : 2.000 Median : 1.000 Median : 3.000 Median : 1.00
## Mean : 3.234 Mean : 3.545 Mean : 3.445 Mean : 2.87
## 3rd Qu.: 4.000 3rd Qu.: 6.000 3rd Qu.: 5.000 3rd Qu.: 4.00
## Max. :10.000 Max. :10.000 Max. :10.000 Max. :10.00
## Mitoses Class
## Min. : 1.000 benign :444
## 1st Qu.: 1.000 malignant:239
## Median : 1.000
## Mean : 1.603
## 3rd Qu.: 1.000
## Max. :10.000
##
## benign malignant
## 444 239
##
## benign malignant
## 0.6501 0.3499
Interpretasi: Setelah data kosong dihapus, tersisa
683 observasi dengan 9 variabel prediktor dan 1 variabel respons tanpa
data kosong. Seluruh prediktor bernilai 1 sampai 10, dengan rata-rata
tertinggi pada Cl.thickness (4,442) dan
Bare.nuclei (3,545), serta rata-rata terendah pada
Mitoses (1,603) yang bernilai 1 pada sebagian besar
observasi. Distribusi kelas menunjukkan 444 observasi benign
(65,0%) dan 239 observasi malignant (35,0%), sehingga data
tidak seimbang sempurna. Oleh karena itu, evaluasi model tidak cukup
hanya menggunakan Accuracy, tetapi juga Precision,
Recall, Specificity, dan F1-score.
# 5. Pembagian Data Training dan Testing
# Skenario 1: Training 80% dan Testing 20%
set.seed(234)
indeks_80 <- createDataPartition(bc$Class, p = 0.80, list = FALSE)
train_80 <- bc[indeks_80, , drop = FALSE]
test_20 <- bc[-indeks_80, , drop = FALSE]
# Skenario 2: Training 60% dan Testing 40%
set.seed(234)
indeks_60 <- createDataPartition(bc$Class, p = 0.60, list = FALSE)
train_60 <- bc[indeks_60, , drop = FALSE]
test_40 <- bc[-indeks_60, , drop = FALSE]
# Jumlah Observasi dan Distribusi Kelas
distribusi_split <- bind_rows(
data.frame(Skenario = "80:20", Bagian = "Training",
as.data.frame(table(Kelas = train_80$Class))),
data.frame(Skenario = "80:20", Bagian = "Testing",
as.data.frame(table(Kelas = test_20$Class))),
data.frame(Skenario = "60:40", Bagian = "Training",
as.data.frame(table(Kelas = train_60$Class))),
data.frame(Skenario = "60:40", Bagian = "Testing",
as.data.frame(table(Kelas = test_40$Class)))
)
names(distribusi_split)[4] <- "Jumlah"
kable(distribusi_split, caption = "Distribusi Kelas pada Data Training dan Testing")| Skenario | Bagian | Kelas | Jumlah |
|---|---|---|---|
| 80:20 | Training | benign | 356 |
| 80:20 | Training | malignant | 192 |
| 80:20 | Testing | benign | 88 |
| 80:20 | Testing | malignant | 47 |
| 60:40 | Training | benign | 267 |
| 60:40 | Training | malignant | 144 |
| 60:40 | Testing | benign | 177 |
| 60:40 | Testing | malignant | 95 |
Interpretasi: Pada skenario 80:20, sebanyak 548 observasi digunakan sebagai data training (356 benign dan 192 malignant) dan 135 observasi sebagai data testing (88 benign dan 47 malignant). Pada skenario 60:40, sebanyak 411 observasi digunakan sebagai data training (267 benign dan 144 malignant) dan 272 observasi sebagai data testing (177 benign dan 95 malignant). Proporsi kelas benign dan malignant relatif terjaga pada kedua skenario. Perlu diperhatikan bahwa data testing skenario 80:20 lebih sedikit, sehingga satu kesalahan klasifikasi memengaruhi nilai metrik lebih besar (sekitar 0,74% dari 135 observasi) dibandingkan skenario 60:40 (sekitar 0,37% dari 272 observasi).
# 6. Fungsi Standardisasi (berdasarkan data training)
siapkan_data <- function(data_train, data_test) {
x_train <- data_train[, kolom_prediktor, drop = FALSE]
x_test <- data_test[, kolom_prediktor, drop = FALSE]
# Rata-rata dan simpangan baku dihitung dari data training
pusat <- vapply(x_train, mean, numeric(1))
skala <- vapply(x_train, sd, numeric(1))
skala[is.na(skala) | skala == 0] <- 1
# Parameter yang sama diterapkan pada data testing
train_sc <- as.data.frame(scale(x_train, center = pusat, scale = skala))
train_sc$Class <- data_train$Class
test_sc <- as.data.frame(scale(x_test, center = pusat, scale = skala))
test_sc$Class <- data_test$Class
list(train = train_sc, test = test_sc)
}
# Contoh pemeriksaan pada skenario 80:20
cek_sc <- siapkan_data(train_80, test_20)
round(colMeans(cek_sc$train[, kolom_prediktor]), 4)## Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## 0 0 0 0 0
## Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses
## 0 0 0 0
## Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## 1 1 1 1 1
## Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses
## 1 1 1 1
Interpretasi: Setelah standardisasi, seluruh prediktor pada data training memiliki rata-rata 0 dan simpangan baku 1, sehingga skala antarvariabel menjadi seragam dan tidak ada variabel yang mendominasi proses pelatihan. Data testing distandardisasi menggunakan rata-rata dan simpangan baku yang sama dari data training, sehingga informasi data testing tidak ikut memengaruhi pembentukan model.
# 7. Fungsi Evaluasi Model
evaluasi_ann <- function(aktual, prediksi) {
aktual <- factor(aktual, levels = c("benign", "malignant"))
prediksi <- factor(as.character(prediksi), levels = c("benign", "malignant"))
cm <- table(Aktual = aktual, Prediksi = prediksi)
TN <- as.numeric(cm["benign", "benign"])
FP <- as.numeric(cm["benign", "malignant"])
FN <- as.numeric(cm["malignant", "benign"])
TP <- as.numeric(cm["malignant", "malignant"])
precision <- TP / (TP + FP)
recall <- TP / (TP + FN)
metrik <- data.frame(
Accuracy = (TP + TN) / sum(cm),
Precision = precision,
Recall = recall,
Specificity = TN / (TN + FP),
F1_Score = 2 * precision * recall / (precision + recall)
)
list(confusion = cm, metrics = metrik)
}
# 8. Pembentukan Enam Model ANN
skenario <- list(
"80:20" = list(train = train_80, test = test_20),
"60:40" = list(train = train_60, test = test_40)
)
hidden_neuron <- c(10, 20, 30)
model_ann <- list()
hasil_confusion <- list()
hasil_metrik <- list()
hasil_train <- list()
for (nama_skenario in names(skenario)) {
dat <- siapkan_data(skenario[[nama_skenario]]$train,
skenario[[nama_skenario]]$test)
for (h in hidden_neuron) {
nama <- paste0("Train", gsub(":", "", nama_skenario), "_Hidden", h)
# Seed berbeda untuk setiap model agar bobot awal dapat direproduksi
set.seed(234 + h + ifelse(nama_skenario == "80:20", 80, 60))
model <- nnet(
Class ~ .,
data = dat$train,
size = h,
maxit = 1000,
decay = 0.01,
rang = 0.1,
MaxNWts = 20000,
trace = FALSE
)
# Prediksi dan evaluasi pada data testing
pred <- predict(model, newdata = dat$test, type = "class")
ev <- evaluasi_ann(dat$test$Class, pred)
# Akurasi pada data training sebagai pembanding
pred_train <- predict(model, newdata = dat$train, type = "class")
model_ann[[nama]] <- model
hasil_confusion[[nama]] <- ev$confusion
hasil_metrik[[nama]] <- data.frame(
Model = nama, Skenario = nama_skenario, Hidden_Neuron = h, ev$metrics
)
hasil_train[[nama]] <- data.frame(
Model = nama,
Accuracy_Training = mean(pred_train == dat$train$Class)
)
}
}
tabel_metrik <- bind_rows(hasil_metrik)
kable(tabel_metrik, digits = 4, caption = "Hasil Evaluasi Enam Model ANN pada Data Testing")| Model | Skenario | Hidden_Neuron | Accuracy | Precision | Recall | Specificity | F1_Score |
|---|---|---|---|---|---|---|---|
| Train8020_Hidden10 | 80:20 | 10 | 0.9630 | 0.9773 | 0.9149 | 0.9886 | 0.9451 |
| Train8020_Hidden20 | 80:20 | 20 | 0.9778 | 1.0000 | 0.9362 | 1.0000 | 0.9670 |
| Train8020_Hidden30 | 80:20 | 30 | 0.9852 | 1.0000 | 0.9574 | 1.0000 | 0.9783 |
| Train6040_Hidden10 | 60:40 | 10 | 0.9706 | 0.9485 | 0.9684 | 0.9718 | 0.9583 |
| Train6040_Hidden20 | 60:40 | 20 | 0.9596 | 0.9286 | 0.9579 | 0.9605 | 0.9430 |
| Train6040_Hidden30 | 60:40 | 30 | 0.9743 | 0.9490 | 0.9789 | 0.9718 | 0.9637 |
Interpretasi: Pada setiap skenario dibentuk tiga model ANN dengan 10, 20, dan 30 hidden neuron sehingga diperoleh enam model. Seluruh model memperoleh Accuracy pada data testing antara 0,9596 dan 0,9852, yang menunjukkan bahwa ANN mampu membedakan tumor benign dan malignant dengan baik pada data yang tidak digunakan saat pelatihan. Perbedaan kinerja antarmodel relatif kecil dan dibahas lebih rinci pada subbab berikut.
# 9. Fungsi Menampilkan Confusion Matrix dan Metrik Satu Model
tampil_model <- function(nama) {
print(kable(as.data.frame.matrix(hasil_confusion[[nama]]),
caption = paste("Confusion Matrix", nama)))
print(kable(filter(tabel_metrik, Model == nama), digits = 4,
caption = paste("Metrik Evaluasi", nama)))
}# 10. Perbandingan Metrik Enam Model
tabel_metrik_long <- tabel_metrik %>%
pivot_longer(
cols = c(Accuracy, Precision, Recall, Specificity, F1_Score),
names_to = "Metrik",
values_to = "Nilai"
)
ggplot(tabel_metrik_long,
aes(x = factor(Hidden_Neuron), y = Nilai,
group = Skenario, linetype = Skenario)) +
geom_point(size = 2.5) +
geom_line() +
facet_wrap(~ Metrik, scales = "free_y") +
labs(
title = "Perbandingan Metrik Evaluasi Enam Model ANN",
x = "Jumlah Hidden Neuron",
y = "Nilai Metrik",
linetype = "Pembagian Data"
) +
theme_minimal()
Interpretasi: Grafik menunjukkan bahwa pengaruh jumlah
hidden neuron berbeda pada kedua skenario. Pada skenario 80:20,
Accuracy meningkat dari 0,9630 ke 0,9778 lalu 0,9852, dan
F1-score meningkat dari 0,9451 ke 0,9670 lalu 0,9783. Pada
skenario 60:40, nilai Accuracy tidak meningkat secara konsisten
(0,9706; 0,9596; 0,9743), dengan model 20 hidden neuron sebagai
yang terendah. Dengan demikian, jumlah hidden neuron yang lebih
banyak tidak selalu menghasilkan kinerja yang lebih baik. Pada kedua
skenario, model dengan 30 hidden neuron menghasilkan
F1-score tertinggi. Skenario 80:20 dengan 20 dan 30 hidden
neuron menghasilkan Precision dan Specificity
sebesar 1,0000, sedangkan Recall tertinggi (0,9789) diperoleh
skenario 60:40 dengan 30 hidden neuron. Karena jumlah data
testing berbeda (135 dan 272 observasi), perbandingan
antarskenario perlu dilakukan dengan hati-hati.
# 11. Akurasi Training vs Testing
tabel_train_test <- bind_rows(hasil_train) %>%
left_join(tabel_metrik %>% select(Model, Accuracy_Testing = Accuracy),
by = "Model") %>%
mutate(Selisih = Accuracy_Training - Accuracy_Testing)
kable(tabel_train_test, digits = 4,
caption = "Perbandingan Akurasi pada Data Training dan Testing")| Model | Accuracy_Training | Accuracy_Testing | Selisih |
|---|---|---|---|
| Train8020_Hidden10 | 1 | 0.9630 | 0.0370 |
| Train8020_Hidden20 | 1 | 0.9778 | 0.0222 |
| Train8020_Hidden30 | 1 | 0.9852 | 0.0148 |
| Train6040_Hidden10 | 1 | 0.9706 | 0.0294 |
| Train6040_Hidden20 | 1 | 0.9596 | 0.0404 |
| Train6040_Hidden30 | 1 | 0.9743 | 0.0257 |
Interpretasi: Seluruh model memperoleh akurasi 1,0000 pada data training, sedangkan akurasi pada data testing berkisar antara 0,9596 dan 0,9852 dengan selisih 0,0148 sampai 0,0404. Model yang mampu memprediksi seluruh data training dengan benar menunjukkan bahwa jaringan memiliki fleksibilitas yang besar sehingga terdapat kecenderungan overfitting. Meskipun demikian, selisih terhadap data testing relatif kecil, sehingga model tetap mampu melakukan generalisasi dengan baik pada data baru. Selisih terkecil terdapat pada model dengan 30 hidden neuron skenario 80:20.
# 12. Peringkat Model (F1-score, kemudian Recall, kemudian Accuracy)
peringkat_model <- tabel_metrik %>%
arrange(desc(F1_Score), desc(Recall), desc(Accuracy))
kable(peringkat_model, digits = 4,
caption = "Peringkat Model ANN Berdasarkan F1-score, Recall, dan Accuracy")| Model | Skenario | Hidden_Neuron | Accuracy | Precision | Recall | Specificity | F1_Score |
|---|---|---|---|---|---|---|---|
| Train8020_Hidden30 | 80:20 | 30 | 0.9852 | 1.0000 | 0.9574 | 1.0000 | 0.9783 |
| Train8020_Hidden20 | 80:20 | 20 | 0.9778 | 1.0000 | 0.9362 | 1.0000 | 0.9670 |
| Train6040_Hidden30 | 60:40 | 30 | 0.9743 | 0.9490 | 0.9789 | 0.9718 | 0.9637 |
| Train6040_Hidden10 | 60:40 | 10 | 0.9706 | 0.9485 | 0.9684 | 0.9718 | 0.9583 |
| Train8020_Hidden10 | 80:20 | 10 | 0.9630 | 0.9773 | 0.9149 | 0.9886 | 0.9451 |
| Train6040_Hidden20 | 60:40 | 20 | 0.9596 | 0.9286 | 0.9579 | 0.9605 | 0.9430 |
## [1] "Train8020_Hidden30"
Interpretasi: Berdasarkan urutan F1-score,
Recall, dan Accuracy, model terbaik adalah
Train8020_Hidden30, yaitu ANN dengan pembagian data 80:20
dan 30 hidden neuron. Model ini memperoleh Accuracy
0,9852, Precision 1,0000, Recall 0,9574,
Specificity 1,0000, dan F1-score 0,9783.
F1-score digunakan sebagai kriteria utama karena
memperhitungkan keseimbangan Precision dan Recall pada
data yang kelasnya tidak seimbang. Peringkat berikutnya ditempati
Train8020_Hidden20 (F1-score 0,9670) dan
Train6040_Hidden30 (F1-score 0,9637). Perlu
dicatat bahwa Train6040_Hidden30 memiliki jumlah False
Negative yang sama (2 observasi) dengan model terbaik, tetapi
Recall-nya lebih tinggi (0,9789) karena jumlah observasi
malignant pada data testing lebih banyak. Selain itu,
model terbaik masih melewatkan 2 dari 47 kasus malignant,
sehingga pada konteks diagnosis hasil ini tetap perlu dipandang sebagai
evaluasi klasifikasi pada dataset ini dan bukan pengganti
diagnosis medis.
# 13. Eksplorasi Model Terbaik
model_pilihan <- model_ann[[as.character(model_terbaik$Model)]]
# Struktur dan jumlah bobot jaringan
model_pilihan$n## [1] 9 30 1
## [1] 331
# Bobot jaringan
bobot_ann <- neuralweights(model_pilihan)
# Variable importance (metode Olden)
olden(model_pilihan)
Interpretasi: Model terbaik memiliki struktur jaringan
9-30-1, yaitu sembilan neuron masukan (variabel prediktor), 30 neuron
pada hidden layer, dan satu neuron keluaran
(
Class), dengan total 331 bobot termasuk bias. Setiap
variabel masukan terhubung ke seluruh neuron tersembunyi, kemudian
diteruskan ke neuron keluaran untuk menghasilkan probabilitas kelas
malignant. Banyaknya hubungan antarneuron menunjukkan bahwa ANN
mampu mempelajari pola hubungan yang kompleks antara prediktor dan
respons.
Berdasarkan grafik variable importance metode Olden,
variabel Bare.nuclei memiliki kontribusi terbesar (sekitar
27,6), diikuti Cl.thickness (sekitar 21,4),
Bl.cromatin (sekitar 18,0), Mitoses (sekitar
17,9), dan Cell.shape (sekitar 14,7) yang berarah positif,
yaitu cenderung meningkatkan probabilitas kelas malignant.
Variabel Epith.c.size memiliki nilai negatif yang cukup
besar (sekitar -16,2), sedangkan Cell.size,
Marg.adhesion, dan Normal.nucleoli memiliki
nilai mendekati nol. Pada metode Olden, tanda positif atau negatif
menunjukkan arah kontribusi berdasarkan bobot jaringan dan besarnya
nilai mutlak menunjukkan besarnya kontribusi, sehingga nilai negatif
tidak berarti variabel tersebut tidak berpengaruh. Karena antarvariabel
prediktor saling berkorelasi, nilai ini menggambarkan kontribusi dalam
model dan tidak menunjukkan hubungan sebab-akibat.
Artificial Neural Network (ANN) dapat diterapkan untuk regresi dan klasifikasi menggunakan bahasa pemrograman R. Regresi digunakan untuk memprediksi nilai numerik, sedangkan klasifikasi digunakan untuk memprediksi kategori. Penerapannya meliputi persiapan data, pembentukan arsitektur jaringan, pelatihan model, dan prediksi.
Evaluasi performa ANN untuk regresi menggunakan MSE dan MAPE, sedangkan klasifikasi menggunakan akurasi dan presisi. MSE mengukur rata-rata kuadrat kesalahan prediksi, sementara MAPE mengukur rata-rata persentase kesalahan. Akurasi mengukur proporsi prediksi yang benar, sedangkan presisi mengukur ketepatan model dalam memprediksi kelas positif.
Model ANN klasifikasi pada dataset BreastCancer menggunakan 683 observasi dengan enam kombinasi pembagian data dan hidden neuron 10, 20, dan 30, menghasilkan Accuracy pengujian sebesar 95,96%–98,52%. Model terbaik menggunakan pembagian data 80:20 dan 30 hidden neuron, dengan Accuracy 98,52%, Precision 100%, dan hanya 2 kasus malignant tidak terdeteksi. Seluruh model menunjukkan indikasi overfitting, sedangkan metode Olden mengidentifikasi Bare.nuclei sebagai variabel dengan kontribusi terbesar.
Penelitian selanjutnya disarankan untuk memperbaiki penulisan kode dan sintaks program agar terhindar dari kesalahan (error). Setiap tahapan analisis perlu diperiksa untuk memastikan proses berjalan sesuai prosedur. Selain itu, ketelitian dalam menjalankan dan mengevaluasi program perlu ditingkatkan agar hasil analisis lebih akurat.