데이터 분석
[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
반응형