ch0nny_log

[빅데이터분석] R _ 71. k-foldout 본문

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

[빅데이터분석] R _ 71. k-foldout

chonny 2024. 7. 30. 10:52

** training data → validation data(모의고사 문제) / test data(수능 문제)

 

◾K-foldout 실습
📌 실습. runif 함수를 이용한 데이터 분할

1. 데이터 로드
credit <- read.csv("c:\\data\\credit.csv")
nrow(credit)


2. runif 함수를 이용하여 데이터 분할
set.seed(10)
random_ids <- order(runif(1000))  # 난수를 1000개 생성
credit_train <- credit[random_ids[1:750], ]  # 훈련 데이터 75%
credit_test <- credit[random_ids[751:1000], ]  # 테스트 데이터 25%
nrow(credit_train) # 750
nrow(credit_test)  # 250


3. 데이터 비율 확인
table(credit$default)
prop.table(table(credit_train$default))
prop.table(table(credit_test$default))



실습. createDataPartition 함수를 이용한 데이터 분할
1. 데이터 로드
credit <- read.csv("c:\\data\\credit.csv")
nrow(credit)


2. createDataPartition 함수를 이용하여 데이터 분할

library(caret)
in_train <- createDataPartition(credit$default, p=0.75, list=FALSE)
credit_train <- credit[in_train, ]
credit_test <- credit[-in_train, ]
nrow(credit_train)  # 750
nrow(credit_test)   # 250

3. 데이터 비율 확인

prop.table(table(credit_train$default))
prop.table(table(credit_test$default))

⇒ runif 로 훈련과 테스트 데이터를 분할하는 것보다 createDataPartition 을 이용해서 데이터를 분할하는것이 더 정답을 비율에 맞춰서 잘 분할해주는 것을 알 수 있음.
실습. k-폴드 교차검증예제: 10-폴드 교차검증
1. 데이터 로드
credit <- read.csv("c:\\data\\credit.csv", stringsAsFactors=TRUE)

2. 10-폴드 교차검증을 위한 폴드 생성
folds <- createFolds(credit$default, k=10)
str(folds)

3. 1번 폴드를 검정 데이터로 사용하고 나머지를 훈련 데이터로 사용
credit01_test <- credit[folds$Fold01, ]
credit01_train <- credit[-folds$Fold01, ]
nrow(credit01_test)  # 100
nrow(credit01_train) # 900

4. 10개의 폴드를 교차검증하여 카파 지수 출력
library(caret)
library(C50) # 의사결정트리 모델 만들기 위해서 불러오기
#install.packages('irr')
library(irr) # createFolds 를 사용해서 반복적으로 모델 생성하기 위해서 불러오기

credit <- read.csv("c:\\data\\credit.csv", stringsAsFactors=TRUE)
folds <- createFolds(credit$default, k=10)

cv_results <- lapply(folds, function(x) {  
  credit_train <- credit[-x, ]
  credit_test  <- credit[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)
})

str(cv_results)
mean(unlist(cv_results))  # 카파 지수의 평균값


5. trials=100 설정으로 카파 지수 평균값 출력
cv_results <- lapply(folds, function(x) {  
  credit_train <- credit[-x, ]
  credit_test  <- credit[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)
})

mean(unlist(cv_results))  # 0.3346655 -> 카파 지수의 평균값

6. 정확도 평균값 출력 (trials=1)
cv_results <- lapply(folds, function(x) {  
  credit_train <- credit[-x, ]
  credit_test  <- credit[x, ]
  credit_model <- C5.0(default ~ ., data=credit_train)
  credit_pred <- predict(credit_model, credit_test)
  credit_actual <- credit_test$default
  accuracy <- sum(credit_actual == credit_pred) / length(credit_actual)
  return (accuracy)
})

mean(unlist(cv_results))  # 정확도의 평균값

7. 정확도 평균값 출력 (trials=100)
cv_results <- lapply(folds, function(x) {  
  credit_train <- credit[-x, ]
  credit_test  <- credit[x, ]
  credit_model <- C5.0(default ~ ., data=credit_train, trials=100)
  credit_pred <- predict(credit_model, credit_test)
  credit_actual <- credit_test$default
  accuracy <- sum(credit_actual == credit_pred) / length(credit_actual)
  return (accuracy)
})

mean(unlist(cv_results))  # 정확도의 평균값​
문제. 방금 수행한 trials=100 으로 수행하여 정확도를 확인하는 코드를 iris 의 품종을 분류하는 코드로 변경해서 10-fold 교차검증을 하고 평균 정확도를 출력하시오.
library(caret)
library(C50)
library(irr)

iris <- read.csv('c:\\data\\iris2.csv', stringsAsFactors = TRUE)
set.seed(1)
folds <- createFolds(iris$Species, k = 10)

credit01_test <- iris[folds$Fold01, ]
credit01_train <- iris[-folds$Fold01, ]
nrow(credit01_test)  # 100
nrow(credit01_train) # 900

cv_results <- lapply(folds, function(x) {  
  iris_train <- iris[-x, ]
  iris_test  <- iris[x, ]
  iris_model <- C5.0(Species ~ ., data=iris_train, trials = 100)
  iris_pred <- predict(iris_model, iris_test)
  iris_actual <- iris_test$Species
  accuracy <- sum(iris_actual == iris_pred) / length(iris_actual)
  return(accuracy) 
  })

mean(unlist(cv_results))  # 0.94 -> 카파 지수의 평균값​



◾교차검증 용어 정리

  • 홀드아웃
    • 학습 데이터: 모델 훈련 시에 사용하는 데이터
    • 검증 데이터: 학습 데이터로 만든 모델의 성능을 평가할 때 사용하는 데이터(훈련 데이터의 일부를 검증 데이터로 사용)
    • 평가용 데이터: 테스트 데이터
  • k-fold Cross validatation: 데이터를 k 개 나눠서 그 중 1개를 테스트 데이터로 사용하고 나머지를 훈련 데이터로 사용해서 모델의 성능을 확인