데이터 분석

[Machine Learning] 여러가지 모델 한번에 적용해서 분석하기

r-code-for-data-analysis 2023. 5. 29. 09:29

여러가지 머신 러닝 모델이 있다. 

각각이 최적인 데이터가 있으므로 보통 5가지 정도를 넣어 돌려보고 가장 적합한 것을 선택한다. 

물론 각각 하이퍼 파라미터값을 바꾸면 최적화 정도가 다르겠지만 

간단히 돌려보는 예제를 해 보려고 한다. 

 

 

사용하는 모델은 아래 다섯가지다. 

 

1. 결과 보기 : 대부분은 랜덤포레스트가 가장 좋은 경우가 많다. 

2. R^2 을 찾아서 예측력을 보는 것도 중요하지만, 각각의 모델이 어떤 변수들을 중요하게 생각하는 중요도 분석을 함께 하는 것이 좋다. 

 

3. 코드 분석

 

#패키지 불러오기
library(tidyverse)
library(dplyr)
library(caret)
library(ModelMetrics)
library(randomForest)
library(stringr)
library(xgboost)  # for fitting GBMs
library(ranger)   # for fitting random forests
library(rpart) 
library(patchwork)
library(DataExplorer)
#GITHUB에서 데이터 파일 불러와서 필요없는 열 제거하기
df <- read.delim("https://raw.githubusercontent.com/waterfirst/regression_refractive_index/main/data.csv", stringsAsFactors=T)
head(df)
str(df)
summary(df)
df <- df[,-c(1,2)]
## 훈련/검증 데이터 나누기

idx <- createDataPartition(df$REFIDX_R, p=0.7, list=F)
train <- df[idx,]
test <- df[-idx,]
str(train)

# na 가 있는 열 확인하기
colSums(is.na(train))
colSums(is.na(test)) 

train_r <- train %>% select(-c(2,3,4))
train_g <- train %>% select(-c(1,3,4))
train_b <- train %>% select(-c(1,2,4))


test_r <- test %>% select(-c(2,3,4))
test_g <- test %>% select(-c(1,3,4))
test_b <- test %>% select(-c(1,2,4))


str(train_r)
#모델 만들기
str(train_r)

m1<-train(REFIDX_R~., data=train_r, method="glm") #로지스틱 회귀 모델
m2<-randomForest(REFIDX_R~., data=train_r, ntree=100) #랜덤포레스트 모델

# Fit a single regression tree
tree <- rpart(REFIDX_R ~ ., data = train_r)

# Fit a random forest
set.seed(101)
rfo <- ranger(REFIDX_R ~ ., data = train_r, importance = "impurity")

# Fit a GBM
set.seed(102)
bst <- xgboost(
  data = data.matrix(subset(train_r, select = -REFIDX_R)),
  label = train_r$REFIDX_R, 
  objective = "reg:linear",
  nrounds = 100, 
  max_depth = 5, 
  eta = 0.3,
  verbose = 0  # suppress printing
)


# VI plot for single regression tree
vi_tree <- tree$variable.importance
barplot(vi_tree, horiz = TRUE, las = 1)

# VI plot for RF
vi_rfo <- rfo$variable.importance %>% sort()
barplot(vi_rfo, horiz = TRUE, las = 1)

# VI plot for GMB
library(Ckmeans.1d.dp)
vi_bst <- xgb.importance(model = bst)
xgb.ggplot.importance(vi_bst)
#각 모델별 중요도 보기

library(vip)
i1 <- vip(m1) + ggtitle("Logistic regression")
i2 <- vip(m2)+ ggtitle("Random Forest")
i3 <- vip(tree)+ ggtitle("Descision tree")
i4 <- vip(rfo)+ggtitle("Fast Random Forest")
i5 <- vip(bst)+ggtitle("XGBoost")

i3+i1+i5+i2+i4
#예측하기

p1<-predict(m1, test_r)
p2<-predict(m2, test_r)
p3<-predict(tree, test_r)
p4<- predict(rfo, data = test_r, predict.all = TRUE)
p4 <- p4$predictions[,2]

p5<-predict(bst, data.matrix(test_r[,-1]))
#평가하기

r1 <- caret::R2(test_r$REFIDX_R, p1) #로지스틱 회귀분석
r2 <- caret::R2(test_r$REFIDX_R, p2) #랜덤포레스트
r3 <- caret::R2(test_r$REFIDX_R, p3) #의사결정나무
r4 <- caret::R2(test_r$REFIDX_R, p4) #ranger
r5 <- caret::R2(test_r$REFIDX_R, p5) #xgboost

name <- c("Logistic regression", "Random Forest", "Descision tree", "Fast Random Forest","XGBoost")
r_squre <- round(c(r1,r2,r3,r4,r4),2)
v <- as.data.frame(cbind(name, r_squre) )

v %>% 
  mutate(name = fct_reorder(name,desc(r_squre))) %>% 
  ggplot(aes(name, r_squre, fill=name))+geom_col() + 
  geom_text(data = v, aes(label = paste("R2=",r_squre)), y = r_squre, size=5)+
  ggtitle("Refractive index prediction of various molucules")+
  labs(y="R^2", x="M/L Models",subtitle="data by Yoo Pro")+
  theme_bw()+
  theme(axis.text.y = element_text(size=12), 
        axis.text.x = element_text(size=12))+
  theme(legend.position="none")

 

728x90
반응형