now is better than never

9. 모델 성능 개선 본문

머신러닝 & 딥러닝

9. 모델 성능 개선

김초송 2023. 4. 5. 14:57

홀드아웃 (Hold Out)

  1. 홀드아웃 : 훈련 데이터와 테스트 데이터로 분할하는 것
  2. k-홀드 교차검정 (k-hold) : 훈련 데이터 일부를 검정 데이터로 사용하여 최적의 하이퍼 파라미터를 발견할 수 있도록 검정 데이터를 교차해서 검정하는 방법
    = 훈련 데이터 / 검정 데이터 / 테스트 데이터 3개로 분할
  • 훈련데이터 : 공부할 데이터 (기출)
  • 검정 데이터 : 훈련 데이터의 일부를 검정 데이터로 사용 (모의고사)
  • 테스트 데이터 : 시험 볼 데이터 (수능)

 

R 로 k-hold 교차 검증 구현

  1. 데이터 로드
  2. 전체 데이터의 일부를 테스트 데이터로 분리
  3. 훈련 데이터 전체에 대해서 10개의 교차검증을 위한 행번호 생성
  4. 하나의 폴드를 검정 데이터로 하고 나머지를 훈련 데이터로 생성
  5. 10개의 폴드를 교차검증해서 훈련 데이터에 대한 kappa 통계량을 출력
  6. 10개의 카파 통계량값의 평균값을 출력 
credit <- read.csv("C:/Data/credit.csv", stringsAsFactors = T)
head(credit)

library(caret)
split <- createDataPartition(credit$default, p=0.9, list=F)
train <- credit[split, ]
test <- credit[-split, ]
nrow(train)
nrow(test)

folds <- createFolds(train$default, k=10)  
str(folds) # 900 개 중에 랜덤으로 10 등분해서 90 개씩 접어놓음

train01 <- train[-folds$Fold01, ] # 훈련 데이터
test01 <- train[folds$Fold01, ] # 검정 데이터

nrow(train01)
nrow(test01)

install.packages("irr")
library(C50)
library(irr)

# 폴드 10 개 교차검증으로 카파통계량 출력
k_fold_func <- function(x){ 
  credit_train <<- train[-x, ]
  credit_test <<- train[x, ]
  credit_model <<- C5.0(default ~., data=credit_train)
  credit_pred <<- predict(credit_model, credit_test)
  credit_actual <<- credit_test$default
  kappa <<- kappa2(data.frame(credit_actual, credit_pred))$value
  return (kappa)} # 예측값과 정답과의 일치

# 10 개의 카파통계량의 평균값 출력
# 카파통계량이 1에 가까울 수록 성능이 좋은 모델

folds <- createFolds(train$default, k=10)
cv_result <- lapply(folds, k_fold_func)
cv_result

mean(unlist(cv_result)) # trials=1 일 때 성능 낮음

k_fold_func2 <- function(x){ 
  credit_train <<- train[-x, ]
  credit_test <<- train[x, ]
  credit_model <<- C5.0(default ~., data=credit_train, trials=100)
  credit_pred <<- predict(credit_model, credit_test)
  credit_actual <<- credit_test$default
  kappa <<- kappa2(data.frame(credit_actual, credit_pred))$value
  return (kappa)}

cv_result2 <- lapply(folds, k_fold_func2)
cv_result2
mean(unlist(cv_result2)) # 0.36

# test datat
credit_pred2 <- predict( credit_model, test )  # 모델예측
credit_actual2 <- test$default   # 테스트 데이터의 정답 데이터 구성
kappa2 <- kappa2( data.frame( credit_actual2, credit_pred2) )$value
kappa2
  • trials=100 : k-hold 교차검증
  • + 최적의 하이퍼 파라미터를 찾는 기능 추가해야 함 <- caret 패키지
set.seed(300)

model <- train(default ~., data=credit, method="C5.0")
model

result <- predict(model, credit[, -17])
table(credit$default, result)
  • train 함수 : 최적의 하이퍼 파라미터 찾아줌
Accuracy was used to select the optimal model using the largest value.
The final values used for the model were trials = 20, model = tree
 and winnow = FALSE.
 
      result
       no yes
  no  700   0
  yes   2 298
본 내용은 아이티윌 '빅데이터&머신러닝 전문가 양성 과정' 을 수강하며 작성한 내용입니다.