Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

천선생의 삶

모형 성능을 올려보자! : 교차검증(Cross Validation) 본문

Data Analysis/Statistics

모형 성능을 올려보자! : 교차검증(Cross Validation)

천선생 2020. 1. 21. 12:00

 안녕하세요. 천선생입니다.

 

 교차검증 (Cross Validation) 이라는 말, 한번쯤은 들어보신 적 있으실텐데요.

우리는 예측모형을 만들고 그 정확도를 측정하기 위해서 내부적인 검증데이터 (Validation Set)을 생성하게 됩니다.

이를 통하여 실제 예측하게 될 미래 데이터(Test Set)에 얼마나 근접하게 적합되었는지를 확인할 수 있습니다.

정확도 측정의 과정을 확인하시려면 이전의 포스팅 [Kaggle] 타이타닉 생존자 예측 3부 - Modeling 을 참조하세요!

 

[Kaggle] 타이타닉 생존자 예측 3부 - Modeling

안녕하세요. 천선생입니다. 1부와 2부를 순서대로 따라오셨다면 이제 이런 생각이 강하게 들 것이라고 생각합니다. '그래서 예측은 언제하는 데?' 이번 포스트는 바로 최종아닌 최종단계, Modeling에 대해 다루도..

cheon9.tistory.com

 

- 검증데이터만 만들면 되는거 아니야? (Validation Set의 맹점)

 실제로 이전 타이타닉 예측에서는 하나의 검증데이터를 생성했습니다.

# 이전 타이타닉 예측에서 사용한 검증데이터 생성방법
# Caret::createDataPartition을 통한 validation set 분할
#분할을 위한 인덱스를 지정합니다.
set.seed(1)
# createDataPartition은 난수를 통하여 분할을 진행합니다. 복원가능성을 위하여 시드를 설정합니다.
# 7:3의 비율로 분할하며, 생존여부의 비율을 맞추어 자동으로 분할합니다.
train_idx <- createDataPartition(train$Survived, p = 0.7, list = F)

#train_M 데이터와 val_M 데이터를 설정하겠습니다.
train_M <- train[train_idx, ]
val_M <- train[-train_idx, ]

 

Caret 패키지의 createDataPartition을 통하여 검증데이터를 생성하는 모습을 확인할 수 있습니다.

set.seed 명령을 통하여 난수 생성을 통제하고, 통제된 난수를 활용하여 3:7의 비율로 데이터를 쪼개는 모습입니다.

우리는 Test setTrain set이 유사한 분포를 지니고 있다는 가정 하에 이러한 시도를 하며,

이를 통해 Test set에 영향을 받지 않고 순수 Train set으로 모형의 정확도를 올리는 시도를 할 수 있었습니다.

 

그러나, 정확하다고 확신할 수 있을까요?

 만약 우연의 일치(마법같은 난수!)Test set과 정반대의 분포를 갖는 검증데이터가 추출되었다면?

혹은 적합된 모형과 지나치게 잘 맞는 (그러나 Test set과는 맞지않는) 검증데이터가 추출되었다면?

우리는 검증데이터의 예측지표로 적합된 모형의 정확도를 판단하기 때문에, 신뢰성이 떨어지게 됩니다.

이와같은 이유로, 우리는 교차검증을 활용하게 됩니다!

 

- 그래서 교차검증(Cross Validation)이 뭔데?

 우리는 우연에 기대한 예측지표가 아닌, 보편적이면서도 높은 예측지표를 찾기 위해서 교차검증을 사용하게 됩니다.

 

3-Fold Cross Validation

 

 그림을 통해 보니 교차 검증 이 합쳐진 모습이 쉽게 눈에 들어오실 것 같은데요!

3-Fold라 함은, 하나의 데이터를 3개의 검증데이터와 훈련데이터로 나누었음(일반적으로 난수를 활용)을 의미합니다.

이렇게 3번의 검증을 거치게 되면! 겹치지 않는 데이터들로 3번의 훈련과 평가를 거칠 수 있게 됩니다.

 

그렇다면, 이렇게 나뉜 3개의 훈련 및 평가셋은 정확하다고 확신할 수 있을까요?

 우리는 한번의 오류를 확인했기 때문에, 의심을 멈춰서는 안됩니다!

 

- Repeated K-Fold Cross Validation

 이름에서 느껴지듯이 위와같은 K-Fold Cross Validation을 반복해주는 것을 의미합니다!

예를들어 3-Repeated 5-Fold Cross Validation 을 시행하게 되면 5개의 분할된 검증데이터를 통한 평가를 3번,

총 15번의 평가를 진행할 수 있게 됩니다. (이때, Repeated Set은 각각 서로의 요소에 영향을 주지 않습니다.)

수많은 평가를 거칠수록 "Test Set에서도 근접한 예측력을 갖고 있다!"고 말할 수 있는 힘을 갖게 되는 것입니다.

 

- 마치며

 글을 읽으실 수록 '그래서 얼마나 어떻게 하는게 제일 좋은거야?' 라는 생각이 강하게 드실 것이라고 생각합니다.

정답은 없습니다!

최적화된 횟수가 있을 수는 있겠지만, 보편화 할 수는 없기 때문이죠.

하지만 몇가지 조건을 정한다면 이렇게 정리할 수 있을 것 같습니다.

1. 모형을 적합시키는데 있어서 지나치게 많은 시간을 소요하지 않게 하는 횟수

2. 정확한 예측지표를 찾아낼 수 있는 반복 수

3. 데이터의 형태에 알맞는 반복 수

(물론 캐글의 상위랭커들을 보면, 어느정도의 감을 잡으실 수 있을 것 같습니다! 그들 역시 경험을 통해 찾은 횟수겠죠?)

 

 학부생시절 기억에 남는 교수님의 말을 하나 꼽아보자면, 이 한마디를 꼽을 수 있을 것 같습니다.

"일정 수준을 넘어서면 통계학은 Art가 됩니다."

자신만의 Art를 찾아내시기를 바라겠습니다.

Comments