Sebagai ilustrasi, modul ini menggunakan data yang digunakan oleh Koyama et al. (2021). Data diperoleh dari foto daun bayam, setelah dilakukan preprocessing, warna pada foto dapat digunakan sebagai input data pada pemodelan prediktif.
Pada ilustrasi ini, peubah respon disimpan pada kolom dengan judul label
(1=bayam segar, 0=tidak segar). Sedangkan sisa kolom pada data set merupakan peubah prediktor.
Berikut adalah proses impor data menggunakan fungsi read.csv()
. Data terlebih dulu dibagi menjadi dua, yaitu data training dan data testing. Pertama-tama, kita akan mengimpor data training.
spinach.train<-read.csv("https://github.com/raoy/STA514/raw/main/train_feature%20v.2.csv")
dim(spinach.train)
[1] 836 231
head(spinach.train)
spinach.test<-read.csv("https://github.com/raoy/STA514/raw/main/test_feature%20v.2.csv")
dim(spinach.test)
[1] 209 231
head(spinach.test)
Terdapat beberapa package yang perlu diinstall terlebih dulu agar dapat menjalankan fungsi-fungsi yang ada pada modul ini. Hal ini dapat dilakukan dengan menggunakan fungsi install.packages()
.
install.packages("caret")
install.packages("ggplot2")
install.packages("rpart.plot")
install.packages("fastAdaboost")
Setelah package diinstall, kita perlu memanggil package tersebut, dapat menggunakan fungsi library()
atau require()
.
library(caret)
Loading required package: ggplot2
Loading required package: lattice
Registered S3 method overwritten by 'data.table':
method from
print.data.table
library(ggplot2)
library(rpart.plot)
Loading required package: rpart
Sebelum memulai analisis, sebaiknya dipastikan bahwa format data sudah sesuai. Pada ilustrasi ini, kita akan membuat tipe objek peubah respon menjadi faktor, dengan label “segar” dan “tidak segar”.
spinach.train$label<-as.factor(spinach.train$label)
levels(spinach.train$label)<-c("No", "Fresh")
Hal serupa juga dilakukan untuk data testing.
spinach.test$label<-as.factor(spinach.test$label)
levels(spinach.test$label)<-c("No", "Fresh")
Pada data training, terlihat bahwa komposisi data bayam segar dan tidak segar cukup seimbang.
prop.table(table(spinach.train$label))
No Fresh
0.5215311 0.4784689
Pada ilustrasi ini, dilakukan standarisasi data sebagai bagian dari praproses data.
standardize <- preProcess(spinach.train, method = c("center", "scale"))
s.train <- predict(standardize, newdata = spinach.train)
s.test <- predict(standardize, newdata = spinach.test)
Berikut ini adalah pengaturan agar kita nantinya dapat mengevaluasi model menggunakan ROC cuve.
ctrl<-trainControl(method="cv", summaryFunction=twoClassSummary, classProbs=T,
savePredictions = T)
cart <- train(label ~ ., data = s.train,
method ='rpart',
trControl=ctrl)
Warning in train.default(x, y, weights = w, ...) :
The metric "Accuracy" was not in the result set. ROC will be used instead.
cart
CART
836 samples
230 predictors
2 classes: 'No', 'Fresh'
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 752, 753, 752, 752, 753, 752, ...
Resampling results across tuning parameters:
cp ROC Sens Spec
0.04000 0.7395976 0.6856237 0.7525
0.04125 0.7324954 0.6992600 0.7275
0.43500 0.5936311 0.8622622 0.3250
ROC was used to select the optimal model using the largest value.
The final value used for the model was cp = 0.04.
Peubah prediktor pada ilustrasi ini merupakan hasil konversi warna pada foto menjadi suatu nilai sehingga kita tidak berusaha untuk menginterpretasikannya. Namun demikian, pada kasus lain yang lebih relevan, Anda dapat menampilkan diagram pohon dari metode CART dengan fungsi rpart.plot()
.
rpart.plot(cart$finalModel)
Selain itu, dapat pula diperoleh tingkat kepentingan peubah. Sekali lagi, pada kasus ini, kita tidak berusaha memaknai kepentingan peubah, namun Anda mungkin memerlukannya pada kasus lain yang relevan.
plot(varImp(cart, scale = FALSE), top=10)
pred<-predict(cart, s.test)
confusionMatrix(pred, s.test$label, positive = "Fresh")
Confusion Matrix and Statistics
Reference
Prediction No Fresh
No 76 17
Fresh 33 83
Accuracy : 0.7608
95% CI : (0.6971, 0.8169)
No Information Rate : 0.5215
P-Value [Acc > NIR] : 9.293e-13
Kappa : 0.5238
Mcnemar's Test P-Value : 0.03389
Sensitivity : 0.8300
Specificity : 0.6972
Pos Pred Value : 0.7155
Neg Pred Value : 0.8172
Prevalence : 0.4785
Detection Rate : 0.3971
Detection Prevalence : 0.5550
Balanced Accuracy : 0.7636
'Positive' Class : Fresh
MLeval::evalm(cart, plots="r", silent=TRUE)
$roc
$proc
$prg
$cc
$probs
$probs$`Group 1`
$optres
$optres$`Group 1`
$stdres
$stdres$`Group 1`
NANA
set.seed(1)
rf <- train(label ~ ., data=s.train,
method='ranger',
trControl=ctrl,
importance = 'impurity')
Warning in train.default(x, y, weights = w, ...) :
The metric "Accuracy" was not in the result set. ROC will be used instead.
rf
Random Forest
836 samples
230 predictors
2 classes: 'No', 'Fresh'
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 752, 753, 752, 753, 753, 752, ...
Resampling results across tuning parameters:
mtry splitrule ROC Sens Spec
2 gini 0.8720540 0.7797040 0.8000
2 extratrees 0.8698018 0.7797569 0.8150
116 gini 0.8898850 0.7818710 0.8225
116 extratrees 0.8900086 0.7913319 0.8025
230 gini 0.8836430 0.7680761 0.8175
230 extratrees 0.8946816 0.7934461 0.8225
Tuning parameter 'min.node.size' was held constant at a value of 1
ROC was used to select the optimal model using the largest value.
The final values used for the model were mtry = 230, splitrule = extratrees
and min.node.size = 1.
pred<-predict(rf, s.test)
confusionMatrix(pred, s.test$label, positive = "Fresh")
Confusion Matrix and Statistics
Reference
Prediction No Fresh
No 90 20
Fresh 19 80
Accuracy : 0.8134
95% CI : (0.7539, 0.8638)
No Information Rate : 0.5215
P-Value [Acc > NIR] : <2e-16
Kappa : 0.6259
Mcnemar's Test P-Value : 1
Sensitivity : 0.8000
Specificity : 0.8257
Pos Pred Value : 0.8081
Neg Pred Value : 0.8182
Prevalence : 0.4785
Detection Rate : 0.3828
Detection Prevalence : 0.4737
Balanced Accuracy : 0.8128
'Positive' Class : Fresh
MLeval::evalm(rf, plots="r", silent=TRUE)
$roc
$proc
$prg
$cc
$probs
$probs$`Group 1`
$optres
$optres$`Group 1`
$stdres
$stdres$`Group 1`
NANA
set.seed(1)
adaboost <- train(label ~ ., data=s.train,
method='adaboost',
trControl=ctrl)
adaboost
pred<-predict(adaboost, s.test)
confusionMatrix(pred, s.test$label, positive = "Fresh")
set.seed(1)
svm <- train(label ~ ., data=s.train,
method='svmRadial',
metric = "F",
trControl=ctrl)
svm
pred<-predict(svm, s.test)
confusionMatrix(pred, s.test$label, positive = "Fresh")
Koyama, K., Tanaka, M., Cho, B. H., Yoshikawa, Y., & Koseki, S. (2021). Predicting sensory evaluation of spinach freshness using machine learning model and digital images. Plos one, 16(3), e0248769.
Setiabudi, N. A., Fakhrudin, N., & Ghoni, N. (2021, November 26). Klasifikasi: Studi Kasus Prediksi recharge. RPubs. https://rpubs.com/nurandi/sta581-p1-k8