library(readr)
library(MASS)
library(neuralnet)
library(nnet)
library(e1071)
Dataset yang digunakan ini adalah Dataset penguins size sumbernya dari kaggle. Dataset ini berisi informasi tentang karakteristik fisik dari penguin yang ditemukan di beberapa pulau, Berikut adalah rincian dari tiap kolomnya:
species: Spesies penguin (contoh: Adelie, Chinstrap, Gentoo).
island: Nama pulau tempat penguin ditemukan (contoh: Torgersen, Biscoe, Dream).
culmen_length_mm: Panjang paruh penguin dalam milimeter.
culmen_depth_mm: Kedalaman paruh penguin dalam milimeter.
flipper_length_mm: Panjang sirip penguin dalam milimeter.
body_mass_g: Berat tubuh penguin dalam gram.
sex: Jenis kelamin penguin (MALE atau FEMALE).
Label dalam dataset ini adalah “species”, karena merupakan kategori yang ingin diprediksi jika dataset digunakan untuk klasifikasi. Kolom ini berisi jenis spesies penguin, yaitu:
Adelie
Chinstrap
Gentoo
# Memanggil Data
penguins <- read.csv("C:/Users/priya/Downloads/penguins_size.csv", na.strings = c(".", "NA"))
View(penguins)
# Memindahkan Kolom Species ke Kolom Terakhir
penguins <- penguins[, c(setdiff(names(penguins), "species"), "species")]
# Cek data apakah ada missing value
colSums(is.na(penguins))
## island culmen_length_mm culmen_depth_mm flipper_length_mm
## 0 2 2 2
## body_mass_g sex species
## 2 11 0
# Menghapus baris yang memiliki missing value di kolom sex
penguins <- penguins[!is.na(penguins$sex), ]
str(penguins)
## 'data.frame': 333 obs. of 7 variables:
## $ island : chr "Torgersen" "Torgersen" "Torgersen" "Torgersen" ...
## $ culmen_length_mm : num 39.1 39.5 40.3 36.7 39.3 38.9 39.2 41.1 38.6 34.6 ...
## $ culmen_depth_mm : num 18.7 17.4 18 19.3 20.6 17.8 19.6 17.6 21.2 21.1 ...
## $ flipper_length_mm: int 181 186 195 193 190 181 195 182 191 198 ...
## $ body_mass_g : int 3750 3800 3250 3450 3650 3625 4675 3200 3800 4400 ...
## $ sex : chr "MALE" "FEMALE" "FEMALE" "FEMALE" ...
## $ species : chr "Adelie" "Adelie" "Adelie" "Adelie" ...
Pada proses ini mengubah type data label ke numeric, untuk train data type data diubah ke factor supaya lebih optimal dalam menangani variabel kategori dalam bentuk factor dibandingkan numerik dan untuk test data type data dibuah ke numeric karena labelnya numeric dan supaya mempermudah perbandingan Y aktual dan Y predik.
set.seed(8758)
# Mengonversi label target menjadi numerik
penguins$species<- as.numeric(as.factor(penguins$species)) - 1
# Membagi data menjadi training dan testing
train_idx <- sample(1:nrow(penguins), 0.8 * nrow(penguins))
train_data <- penguins[train_idx, ]
test_data <- penguins[-train_idx, ]
head(train_data)
## island culmen_length_mm culmen_depth_mm flipper_length_mm body_mass_g
## 324 Biscoe 49.1 15.0 228 5500
## 67 Biscoe 35.5 16.2 195 3350
## 129 Torgersen 39.0 17.1 191 3050
## 130 Torgersen 44.1 18.0 210 4000
## 60 Biscoe 37.6 19.1 194 3750
## 53 Biscoe 35.0 17.9 190 3450
## sex species
## 324 MALE 2
## 67 FEMALE 0
## 129 FEMALE 0
## 130 MALE 0
## 60 MALE 0
## 53 FEMALE 0
head(test_data)
## island culmen_length_mm culmen_depth_mm flipper_length_mm body_mass_g
## 1 Torgersen 39.1 18.7 181 3750
## 19 Torgersen 34.4 18.4 184 3325
## 22 Biscoe 37.7 18.7 180 3600
## 28 Biscoe 40.5 17.9 187 3200
## 32 Dream 37.2 18.1 178 3900
## 40 Dream 39.8 19.1 184 4650
## sex species
## 1 MALE 0
## 19 FEMALE 0
## 22 MALE 0
## 28 FEMALE 0
## 32 MALE 0
## 40 MALE 0
train_data$species <- as.factor(train_data$species)
test_data$species <- as.numeric(as.character(test_data$species))
Membuat model NN dan menggunakannya untuk mengklasifikasikan spesies penguin berdasarkan fitur seperti panjang paruh, panjang sirip, dan berat tubuh
# Membuat model Neural Network
nn_model <- nnet(species~., data=train_data, size=5, decay=0.01, maxit=200)
## # weights: 58
## initial value 285.513533
## iter 10 value 280.344350
## iter 20 value 280.335010
## iter 30 value 268.201616
## iter 40 value 118.072041
## iter 50 value 111.746170
## iter 60 value 107.252303
## iter 70 value 69.220538
## iter 80 value 32.924455
## iter 90 value 11.909298
## iter 100 value 3.228946
## iter 110 value 2.179430
## iter 120 value 2.041640
## iter 130 value 2.022952
## iter 140 value 1.919427
## iter 150 value 1.732817
## iter 160 value 1.695771
## iter 170 value 1.694747
## iter 180 value 1.694623
## iter 190 value 1.694528
## iter 200 value 1.694521
## final value 1.694521
## stopped after 200 iterations
# size=5: Jumlah neuron dalam hidden layer
# decay=0.01: Regularisasi untuk menghindari overfitting
# maxit=200: Jumlah iterasi maksimum
# Melakukan prediksi pada data testing
predictions <- predict(nn_model, test_data[, -7], type = "class")
Mengevaluasi hasil prediksi model NN dengan membandingkan label target (test_data$species) dengan hasil prediksi (predictions).
# Menampilkan hasil prediksi dalam bentuk tabel perbandingan dengan label asli
table(test_data$species, predictions)
## predictions
## 0 1 2
## 0 28 0 0
## 1 1 12 0
## 2 0 0 26
compare <- data.frame(
species = as.numeric(test_data$species),
predictions = as.numeric(predictions),
kategori = ifelse(test_data$species == predictions, "correct", "incorrect")
)
compare
## species predictions kategori
## 1 0 0 correct
## 2 0 0 correct
## 3 0 0 correct
## 4 0 0 correct
## 5 0 0 correct
## 6 0 0 correct
## 7 0 0 correct
## 8 0 0 correct
## 9 0 0 correct
## 10 0 0 correct
## 11 0 0 correct
## 12 0 0 correct
## 13 0 0 correct
## 14 0 0 correct
## 15 0 0 correct
## 16 0 0 correct
## 17 0 0 correct
## 18 0 0 correct
## 19 0 0 correct
## 20 0 0 correct
## 21 0 0 correct
## 22 0 0 correct
## 23 0 0 correct
## 24 0 0 correct
## 25 0 0 correct
## 26 0 0 correct
## 27 0 0 correct
## 28 0 0 correct
## 29 1 1 correct
## 30 1 1 correct
## 31 1 1 correct
## 32 1 1 correct
## 33 1 1 correct
## 34 1 1 correct
## 35 1 1 correct
## 36 1 1 correct
## 37 1 1 correct
## 38 1 1 correct
## 39 1 0 incorrect
## 40 1 1 correct
## 41 1 1 correct
## 42 2 2 correct
## 43 2 2 correct
## 44 2 2 correct
## 45 2 2 correct
## 46 2 2 correct
## 47 2 2 correct
## 48 2 2 correct
## 49 2 2 correct
## 50 2 2 correct
## 51 2 2 correct
## 52 2 2 correct
## 53 2 2 correct
## 54 2 2 correct
## 55 2 2 correct
## 56 2 2 correct
## 57 2 2 correct
## 58 2 2 correct
## 59 2 2 correct
## 60 2 2 correct
## 61 2 2 correct
## 62 2 2 correct
## 63 2 2 correct
## 64 2 2 correct
## 65 2 2 correct
## 66 2 2 correct
## 67 2 2 correct
akurasi <- sum(compare$kategori == "correct") / nrow(compare) * 100
akurasi
## [1] 98.50746
svm_model <- svm(species~., data = train_data, cost = 100, gamma = 1)
svm_pred <- predict(svm_model, test_data[,-7])
table(pred = svm_pred, true = test_data[,7])
## true
## pred 0 1 2
## 0 27 0 0
## 1 1 13 0
## 2 0 0 26
compare1 <- data.frame(
species = as.numeric(test_data$species),
predictions = as.numeric(svm_pred) -1,
kategori = ifelse(test_data$species == svm_pred, "correct", "incorrect")
)
compare1
## species predictions kategori
## 1 0 0 correct
## 2 0 0 correct
## 3 0 0 correct
## 4 0 0 correct
## 5 0 0 correct
## 6 0 0 correct
## 7 0 0 correct
## 8 0 0 correct
## 9 0 0 correct
## 10 0 0 correct
## 11 0 0 correct
## 12 0 0 correct
## 13 0 0 correct
## 14 0 0 correct
## 15 0 0 correct
## 16 0 0 correct
## 17 0 0 correct
## 18 0 0 correct
## 19 0 0 correct
## 20 0 0 correct
## 21 0 0 correct
## 22 0 0 correct
## 23 0 0 correct
## 24 0 0 correct
## 25 0 0 correct
## 26 0 1 incorrect
## 27 0 0 correct
## 28 0 0 correct
## 29 1 1 correct
## 30 1 1 correct
## 31 1 1 correct
## 32 1 1 correct
## 33 1 1 correct
## 34 1 1 correct
## 35 1 1 correct
## 36 1 1 correct
## 37 1 1 correct
## 38 1 1 correct
## 39 1 1 correct
## 40 1 1 correct
## 41 1 1 correct
## 42 2 2 correct
## 43 2 2 correct
## 44 2 2 correct
## 45 2 2 correct
## 46 2 2 correct
## 47 2 2 correct
## 48 2 2 correct
## 49 2 2 correct
## 50 2 2 correct
## 51 2 2 correct
## 52 2 2 correct
## 53 2 2 correct
## 54 2 2 correct
## 55 2 2 correct
## 56 2 2 correct
## 57 2 2 correct
## 58 2 2 correct
## 59 2 2 correct
## 60 2 2 correct
## 61 2 2 correct
## 62 2 2 correct
## 63 2 2 correct
## 64 2 2 correct
## 65 2 2 correct
## 66 2 2 correct
## 67 2 2 correct
akurasi <- sum(compare1$kategori == "correct") / nrow(compare) * 100
akurasi
## [1] 98.50746