Simultaneously Comparing Many Machine Learning Models

R for Pleasure

Nguyen Chi Dung

Dữ liệu sử dụng lấy ở đây.

Công cụ hình ảnh được sử dụng để so sánh hiệu quả phân loại của các mô hình ML có thể tham khảo từ bài viết có tên The prevalence of hepatitis E virus infections among swine, swine farmers and the general population in Guangdong Province, China.

#=================================================================================
#  Using caretEnsemble for Simultaneously Comparing Many Machine Learning Models
#=================================================================================

library(magrittr)
library(tidyverse)

# Đọc dữ liệu và bỏ các biến không cần thiết: 
breast <- read.csv("E:/R_project/w8_breast_cancer/data.csv") %>% 
  mutate(id = NULL, X = NULL)

# Hàm chuẩn hóa dữ liệu và sử dụng hàm: 
chuan_hoa_01 <- function(x) {(x - min(x)) / (max(x) - min(x))}
breast <- breast %>% mutate_if(is.numeric, chuan_hoa_01)


# Thực hiện phân chia dữ liệu: 

set.seed(1)
train <- breast %>% 
  group_by(diagnosis) %>% 
  sample_frac(0.8) %>% 
  ungroup()

test <- dplyr::setdiff(breast, train)

# Thiết lập các chế độ tinh chỉnh cho mô hình: 
library(caret)
set.seed(1)
control <- trainControl(method = "repeatedcv", 
                        number = 5, 
                        repeats = 10, 
                        classProbs = TRUE, 
                        savePredictions = "final", 
                        index = createResample(train$diagnosis, 50), 
                        summaryFunction = multiClassSummary, 
                        allowParallel = TRUE)

# Thiết lập chế độ tính toán song song: 
library(doParallel)
n_cores <- detectCores()
registerDoParallel(cores = n_cores - 1)

# Huấn luyện đồng thời 4  mô hình ML (mất khoảng 10 đến
# 20 phút tùy cấu hình của máy tính được sử dụng):  
library(caretEnsemble)

set.seed(1)
model_list1 <- caretList(diagnosis ~., 
                         data = train,
                         trControl = control,
                         metric = "Accuracy", 
                         methodList = c("rf", "adaboost", "knn", "svmRadial"))


# Đánh giá khả năng phân loại của 4 mô hình này trên 12 tiêu chí: 

total_df <- bind_rows(model_list1$rf$resample %>% 
                        select(-Resample) %>% 
                        mutate(Model = "RF"), 
                      model_list1$adaboost$resample %>% 
                        select(-Resample) %>% 
                        mutate(Model = "AdaB"), 
                      model_list1$knn$resample %>% 
                        select(-Resample) %>% 
                        mutate(Model = "KNN"), 
                      model_list1$svmRadial$resample %>% 
                        select(-Resample) %>% 
                        mutate(Model = "SVM"))


total_df %>% 
  select(-logLoss, -prAUC) %>% 
  gather(a, b, -Model) %>% 
  ggplot(aes(Model, b, fill = Model, color = Model)) + 
  geom_boxplot(show.legend = FALSE, alpha = 0.3) + 
  facet_wrap(~ a, scales = "free") + 
  coord_flip() + 
  labs(x = NULL, y = NULL)

# Viết hàm tạo Confusion Matrix: 

my_cm <- function(model) {
  pre <- predict(model, test %>% select(-diagnosis))
  cm <- confusionMatrix(pre, test$diagnosis)
  return(cm)
}


# So sánh khả năng dự báo của 4 mô hình bằng công cụ hình ảnh: 
library(vcd)

my_plot <- function(cm_for_model, model_name) {
  my_col <- c('#e41a1c','#377eb8')
  ten <- paste(model_name, "(", sep = " ")
    
  fourfoldplot(cm_for_model$table, 
             color = my_col, 
             conf.level = 0.95, 
             margin = 1, 
             main = paste(ten, round(cm_for_model$overall[1]*100, 2), "%)", sep = ""))
}




par(mfrow = c(2, 2))
par(bg = "grey90")

model_list1$rf %>% 
  my_cm() %>% 
  my_plot("Random Forest")

model_list1$adaboost %>% 
  my_cm() %>% 
  my_plot("AdaBoost")

model_list1$knn %>% 
  my_cm() %>% 
  my_plot("KNN")

model_list1$svmRadial %>% 
  my_cm() %>% 
  my_plot("SVM")

par(mfrow = c(1, 1))
par(bg = "white")