- [Machine Learning] 여러가지 모델 한번에 적용해서 분석하기2023년 05월 29일 09시 29분 40초에 업로드 된 글입니다.작성자: r-code-for-data-analysis
여러가지 머신 러닝 모델이 있다.
각각이 최적인 데이터가 있으므로 보통 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반응형'데이터 분석' 카테고리의 다른 글
R을 이용한 축구 데이터 분석 (MAP) (0) 2023.06.11 점탄성 특성 분석 (ANOVA, PCA분석) (0) 2023.05.30 Multi slit 구조에서 빛의 회절을 시뮤레이션 해 보기 (0) 2023.05.29 Optical Density(OD)에 따른 빛의 침투 깊이 시뮬레이션 (0) 2023.05.29 대한민국 인구분포 피라미드 그래프 그리기(pyramid) (0) 2023.05.29 댓글