ch0nny_log

[빅데이터분석] R _ 72. 앙상블 본문

빅데이터 분석(with 아이티윌)/R

[빅데이터분석] R _ 72. 앙상블

chonny 2024. 7. 30. 10:56

실습. 60% 정확도를 보이는 모델들을 모아서 90% 가 넘는 모델을 생성하는 팀을 만들고 싶은데 그러면 60% 정확도를 보이는 모델들이 몇 개 필요할까?
# 1. 정확도 계산: 앙상블 모델의 필요 개수
ret_err <- function(n, err) {
  sum <- 0 
  for(i in floor(n/2):n) { 
    sum <- sum + choose(n,i) * err^i * (1-err)^(n-i)
  }
  sum
}

for(j in 1:60) {
  err <- ret_err(j, 0.4)
  cat(j, '--->', 1 - err, '\n') 
  if(1 - err >= 0.9) break
}

# 2. 앙상블을 사용하지 않은 의사결정트리 모델 생성
# 데이터 로드
iris <- read.csv("c:\\data\\iris2.csv", stringsAsFactors = TRUE)

# 훈련 데이터와 테스트 데이터 분리
library(caret)
set.seed(1)
in_train <- createDataPartition(iris$Species, p = 0.8, list = FALSE)
iris_train <- iris[in_train, ]
iris_test  <- iris[-in_train, ]

# 모델 생성
library(C50)
set.seed(1)
model <- C5.0(Species ~ ., data = iris_train)

# 모델 예측
result <- predict(model, iris_test)

# 모델 평가
accuracy <- sum(iris_test$Species == result) / length(iris_test$Species)
cat("Accuracy without ensemble:", accuracy, "\n")

# 3. 배경을 사용한 모델 생성
# 데이터 로드
iris <- read.csv("c:\\data\\iris2.csv", stringsAsFactors = TRUE)

# 훈련 데이터와 테스트 데이터 분리
set.seed(1)
in_train <- createDataPartition(iris$Species, p = 0.8, list = FALSE)
iris_train <- iris[in_train, ]
iris_test  <- iris[-in_train, ]

# 모델 생성
library(ipred)
set.seed(1)
my_bag <- bagging(Species ~ ., data = iris_train, nbagg = 25)

# 모델 예측
p_bag <- predict(my_bag, iris_test[, -5])

# 모델 평가
bagging_accuracy <- sum(iris_test$Species == p_bag) / length(iris_test$Species)
cat("Accuracy with bagging:", bagging_accuracy, "\n")​

실습. 부스팅 모델 생성
# 데이터 로드
iris <- read.csv("c:\\data\\iris2.csv", stringsAsFactors = TRUE)

# 훈련 데이터와 테스트 데이터 분리
set.seed(1)
in_train <- createDataPartition(iris$Species, p = 0.8, list = FALSE)
iris_train <- iris[in_train, ]
iris_test  <- iris[-in_train, ]

# 모델 생성
#install.packages('adabag')
library(adabag)
set.seed(1)
m_adaboost <- boosting(Species ~ ., data = iris_train, mfinal = 50) # 부스팅 단계수를 50으로 지정.

# 모델 예측
p_adaboost <- predict(m_adaboost, iris_test[, -5])

# 모델 평가
boosting_accuracy <- sum(iris_test$Species == p_adaboost$class) / length(iris_test$Species)
cat("Accuracy with boosting:", boosting_accuracy, "\n")​
문제. 위의 부스팅 모델의 성능을 높이기 위해 하이퍼 파라미터를 지정하고 모델을 생성하시오.
# 데이터 로드
iris <- read.csv("c:\\data\\iris2.csv", stringsAsFactors = TRUE)

# 훈련 데이터와 테스트 데이터 분리
set.seed(1)
in_train <- createDataPartition(iris$Species, p = 0.8, list = FALSE)
iris_train <- iris[in_train, ]
iris_test  <- iris[-in_train, ]

# 모델 생성
#install.packages('adabag')
library(adabag)
set.seed(1)
m_adaboost <- boosting(Species ~ ., data = iris_train)

# 모델 예측
p_adaboost <- predict(m_adaboost, iris_test[, -5])

# 모델 평가
boosting_accuracy <- sum(iris_test$Species == p_adaboost$class) / length(iris_test$Species)
cat("Accuracy with boosting:", boosting_accuracy, "\n")​

💡 마지막 문제. wine2.csv 데이터를 분류하는 앙상블 모델을 생성하시오. 부스팅 선택하여 모델 생성함.
# 데이터 로드
wine <- read.csv("c:\\data\\wine2.csv", stringsAsFactors = TRUE)

# 훈련 데이터와 테스트 데이터 분리
set.seed(1)
in_train <- createDataPartition(wine$Type, p = 0.9, list = FALSE)
wine_train <- wine[in_train, ]
wine_test  <- wine[-in_train, ]

# 모델 생성
#install.packages('adabag')
library(adabag)
set.seed(1)
m_adaboost <- boosting(Type ~ ., data = wine_train)

# 모델 예측
p_adaboost <- predict(m_adaboost, wine_test[, -1])

# 모델 평가
boosting_accuracy <- sum(wine_test$Type == p_adaboost$class) / length(wine_test$Type)
cat("Accuracy with boosting:", boosting_accuracy, "\n")​