Feture Selection / Engineering for Machine Learning Models

R for Pleasure

Nguyen Chi Dung

library(magrittr)
library(tidyverse)
breast <- read.csv("E:/R_project/w8_breast_cancer/data.csv")

# Bỏ biến không cần thiết: 
breast %<>% mutate(id = NULL, X = NULL)

# Hàm kiểm tra dữ liệu thiếu: 
rate_na <- function(x) {100*sum(is.na(x)) / length(x)}

# Sử dụng hàm: 
breast %>% summarise_all(rate_na)
##   diagnosis radius_mean texture_mean perimeter_mean area_mean
## 1         0           0            0              0         0
##   smoothness_mean compactness_mean concavity_mean concave.points_mean
## 1               0                0              0                   0
##   symmetry_mean fractal_dimension_mean radius_se texture_se perimeter_se
## 1             0                      0         0          0            0
##   area_se smoothness_se compactness_se concavity_se concave.points_se
## 1       0             0              0            0                 0
##   symmetry_se fractal_dimension_se radius_worst texture_worst
## 1           0                    0            0             0
##   perimeter_worst area_worst smoothness_worst compactness_worst
## 1               0          0                0                 0
##   concavity_worst concave.points_worst symmetry_worst
## 1               0                    0              0
##   fractal_dimension_worst
## 1                       0
# Kiêm tra kiểu dữ liệu cho biến mục tiêu: 
breast$diagnosis %>% class()
## [1] "factor"
# Bộ dữ liệu nguyên bản: 
breast_origin <- breast

# Bộ dữ liệu bỏ đi các biến tương quan cao trên 0.8: 
input_df <- breast %>% select(-diagnosis)

library(caret)
tuong_quan_cao <- findCorrelation(cor(input_df), cutoff = 0.8)

# Số lượng các biến số sẽ bị loại: 
length(tuong_quan_cao)
## [1] 16
# Loại các biến tương quan cao này và lấy lại biến mục tiêu: 
breast_remove_cor <- input_df %>% 
  select(-tuong_quan_cao) %>% 
  mutate(diagnosis = breast$diagnosis)

# Bộ dữ liệu bỏ tương quan cao và dữ liệu được chuẩn hóa 0 1: 
chuan_hoa_01 <- function(x) {(x - min(x)) / (max(x) - min(x))}
breast_scaled <- breast_remove_cor %>% mutate_if(is.numeric, chuan_hoa_01)


# Lựa chọn biến theo Recursive Feature Elimination: 

set.seed(1)
control <- rfeControl(functions = rfFuncs, 
                      method = "repeatedcv", 
                      number = 5, 
                      repeats = 5, 
                      allowParallel = TRUE)


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

# Thực hiện thuật toán chọn biến: 
set.seed(1)
results <- rfe(breast %>% select(-diagnosis), 
               breast$diagnosis, 
               sizes = c(1:30), 
               rfeControl = control)


# Số lượng biến tối ưu: 
results$bestSubset
## [1] 13
# Tên các biến đó là: 
var_names <- predictors(results)
var_names
##  [1] "area_worst"           "concave.points_worst" "perimeter_worst"     
##  [4] "radius_worst"         "concave.points_mean"  "texture_worst"       
##  [7] "area_se"              "concavity_worst"      "texture_mean"        
## [10] "concavity_mean"       "smoothness_worst"     "area_mean"           
## [13] "perimeter_mean"
# Hình ảnh hóa chất lượng dự báo khi số lượng biến được chọn thay đổi: 
theme_set(theme_minimal())
results$results %>% 
  select(Variables, Accuracy, Kappa) %>% 
  gather(a, b, -Variables) %>% 
  ggplot(aes(Variables, b)) + 
  geom_line() + 
  geom_point() + 
  facet_wrap(~ a, scales = "free") + 
  labs(x = NULL, y = NULL, 
         title = "Model Performance vs Number of Variables Selected Based on RFE Algorithm")

# Chỉ chọn các biến có danh sách ở trên: 
breast_rfe <- breast %>% select(c("diagnosis", var_names))

# Loại biến theo Genetic Algorithm (GA):

# set.seed(1)
# control_ga <- gafsControl(functions = rfGA,
#                           method = "repeatedcv",
#                           number = 5,
#                           repeats = 5,
#                           allowParallel = TRUE)
# 
# set.seed(1)
# results_ga <- gafs(breast %>% select(-diagnosis),
#                    breast$diagnosis,
#                    gafsControl = control_ga)
# results_ga$ga$final



# Thiết lập Cross - Validation và các thống kê đánh giá mô hình: 

set.seed(1)
control <- trainControl(method = "repeatedcv", 
                        number = 5, 
                        repeats = 10, 
                        classProbs = TRUE, 
                        summaryFunction = multiClassSummary, 
                        allowParallel = TRUE)

# Huấn luyện mô hình SVM trên bốn bộ số liệu: 

set.seed(1)
svm_1 <- train(diagnosis ~ ., 
               data = breast_origin, 
               method = "svmLinear", 
               metric = "Accuracy",
               trControl = control)


set.seed(1)
svm_2 <- train(diagnosis ~ ., 
               data = breast_remove_cor, 
               method = "svmLinear", 
               metric = "Accuracy",
               trControl = control)


set.seed(1)
svm_3 <- train(diagnosis ~ ., 
               data = breast_scaled, 
               method = "svmLinear", 
               metric = "Accuracy",
               trControl = control)

set.seed(1)
svm_4 <- train(diagnosis ~ ., 
               data = breast_rfe, 
               method = "svmLinear", 
               metric = "Accuracy",
               trControl = control)


# So sánh bằng hình ảnh: 
all_df <- bind_rows(svm_1$results, 
                    svm_2$results, 
                    svm_3$results, 
                    svm_4$results)

all_df %<>% mutate(Method = c("All", "Cor", "CorS", "RFE"))

all_df %>% 
  select(AUC, Accuracy, Kappa, F1, Method) %>% 
  gather(a, b, -Method) %>% 
  ggplot(aes(Method, b, color = a)) + 
  geom_point(show.legend = FALSE, size = 3) + 
  facet_wrap(~ a, scales = "free") + 
  labs(x = NULL, y = NULL, 
       title = "Model Performance Based on Four Feature Selection Techniques", 
       subtitle = "Model Used: Support Vector Machine")

# Huấn luyện mô hình Random Forest trên bốn bộ số liệu: 

set.seed(1)
rf_1 <- train(diagnosis ~ ., 
              data = breast_origin, 
              method = "rf", 
              metric = "Accuracy",
              trControl = control)


set.seed(1)
rf_2 <- train(diagnosis ~ ., 
              data = breast_remove_cor, 
              method = "rf", 
              metric = "Accuracy",
              trControl = control)


set.seed(1)
rf_3 <- train(diagnosis ~ ., 
              data = breast_scaled, 
              method = "rf", 
              metric = "Accuracy",
              trControl = control)

set.seed(1)
rf_4 <- train(diagnosis ~ ., 
              data = breast_rfe, 
              method = "rf", 
              metric = "Accuracy",
             trControl = control)


# So sánh bằng hình ảnh: 

all_df <- bind_rows(rf_1$resample %>% select(-Resample) %>% summarise_all(funs(mean)), 
                    rf_2$resample %>% select(-Resample) %>% summarise_all(funs(mean)), 
                    rf_3$resample %>% select(-Resample) %>% summarise_all(funs(mean)), 
                    rf_4$resample %>% select(-Resample) %>% summarise_all(funs(mean)))


all_df %<>% mutate(Method = c("All", "Cor", "CorS", "RFE"))

all_df %>% 
  select(AUC, Accuracy, Kappa, F1, Method) %>% 
  gather(a, b, -Method) %>% 
  ggplot(aes(Method, b, color = a)) + 
  geom_point(show.legend = FALSE, size = 3) + 
  facet_wrap(~ a, scales = "free") + 
  labs(x = NULL, y = NULL, 
       title = "Model Performance Based on Four Feature Selection Techniques", 
       subtitle = "Model Used: Random Forest")