기억의 기록(나의 기기)

[K-fold cross validation] 기법 설명 및 활용 본문

머신러닝

[K-fold cross validation] 기법 설명 및 활용

황경하 2024. 5. 10. 11:53
반응형

K-Fold Cross Validation

안녕하세요, 데이터과학을 전공하고 있는 황경하입니다.
원래는 머신러닝 워크플로우 순서대로 올리고 싶었으나 논문리뷰에서 이 기법이 사용되어 읽으시는 분들의

이해를 돕기 위해 먼저 쓰게 되었습니다. 바로 가시죠!

 

용어 정리

k-fold : k개로 나눈다.

cross: 교차

validation: 검증

 

→ k-fold cross validation: Data를 k개로 나누어 교차 검증을 시행한다.

K-fold cross validation? Why?

왜 K-fold cross Vadliation을 사용할까요? 데이터는 왜 나누어서 사용할까요? 이를 알기 위해선, 먼저 데이터의 분할을 이해해야 합니다. 일반적으로 데이터는 training data와 test data로 나눕니다. 그리고 다시 training data를 training data와 validation data로 나누죠. 용어가 혼용되어 이해하기 어려우실까 봐 아래 그림을 첨부했습니다.

출처: 위키독스 - pytorch로 시작하는 딥러닝 입문


그러면, 이제 본론으로 돌아가서 왜 k-fold cross validation 기법을 사용할까요? 그 이유는, Data의 수가 부족하기 때문입니다. 우리가 딥러닝을 배울 때 쓰는 MNIST 같은 큰 데이터셋도 있지만 실제로 우리가 데이터를 수집한다면, 그렇게 큰 데이터셋을 만들기란 매우 어렵습니다. training data와 test data를 나누기 어려울 정도로요. 이럴 때, k-fold cross validation 기법을 사용합니다. 이제 자세히, k-fold cross validation에 들어가 보겠습니다.

K-Fold Cross Validation


이 기법에 가장 큰 목적은 "적은 데이터로 훈련을 진행할 때에 over fitting이 일어날 수 있으니 데이터가 많은 것처럼 훈련을 하자"입니다. 우선, 전체 데이터를 k개로 나눕니다. 그러고 나서 test data를 몇 개로 할지는 사용자가 설정을 하는데 이를 n이라고 해보겠습니다. 그러면 훈련 데이터는 k-n개를 사용하고, n개는 test data로 사용을 하여 학습 및 평가를 k번 진행하게 됩니다.

 

위 그림을 보며 이해해 보죠. 우리에게 전체 데이터가 100개가 존재합니다. 우리는 이 데이터를 5(=k) 등분할 겁니다. 즉, 5-fold cross validation을 진행합니다. 그러면, 각 서브 데이터셋은 20개의 데이터가 있겠죠. 그리고, n(=테스트 데이터셋 수)을 1이라고 잡았다면, 20개의 데이터(=1개의 서브 데이터셋)는 test data로 사용하고 80개(=4개의 서브 데이터셋)의 데이터는 training data로 사용합니다. 그리고 그다음 시행에는 다른 서브 데이터셋을 테스트 데이터로 잡고 나머지를 training data로 잡는 방식으로 총 k번의 학습을 진행합니다. 그러면 우리는 100개의 데이터밖에 없지만, 사실은 5배 더 많이 데이터를 사용한 것처럼 학습을 진행하기 때문에 성능이 더 올라갑니다.

그러면, test data도 학습되지 않나요?

이 질문은 제가 처음 k-fold cross validation을 배울 때 들었던 의문입니다. 당연하겠지만, 딥러닝을 할 때에 절대 test data를 training 해서는 안 됩니다. 그렇게 되면, 마치 시험지를 보고 시험을 보는 것과 같은 것이니까요. 하지만, 위에서 보셨다시피, 이 기법은 k개로 나누어진 서브 데이터셋을 순차적으로(=교차) 학습하게 됩니다. 그러면, 뒤에서 진행하는 test data는 이미 앞에서 훈련한 data인 것이죠. 그래서 이 기법에서는 순차적으로 데이터셋을 바꿀 때마다 모델을 초기화하고 성능을 체크합니다. 5-fold validation 방법으로 예를 들어보겠습니다.

  • 결과를 담을 빈 리스트를 만듭니다.
  • 1번째 서브 데이터셋을 test data로 잡고 나머지를 training data로 잡고 성능을 체크한 후 결과를 만들어둔 리스트에 저장한 다음 모델을 초기화합니다.
  • 2번째 서브 데이터셋을 test data로 잡고 나머지를 training data로 잡고 성능 체크한 후 결과를 만들어 둔 리스트에 저장한 다음 모델을 초기화합니다.
  • 이 과정을 반복합니다.

그러면, 결과를 담는 리스트에는 총 5개의 결과가 담길 것입니다. 그리고 이 5개의 값을 평균내면 그것이 모델의 최종 성능이 되는 것이죠.

 

즉, 정확히 말하면 모델을 시행시마다 계속 초기화하기 때문에 Test Data는 학습되지 않습니다.

 

(최근에 회귀 분석을 공부하며 k-fold validation 기법을 직접 구현해 본 적이 있습니다. 시간이 날 때 포스팅 하겠습니다.)

활용

K-fold cross validation은 위에서 언급한 것처럼, 결국 데이터가 부족한 경우에 사용하는 기법입니다. 그리고 이 기법을 사용해 우리가 사용하고자 하는 모델들에 적합시킬 수 있죠. Kfold는 sklearn.model_selection.Kfold를 import 해서 파이썬에서 쉽게 구현할 수 있습니다. 이 함수에 인자로 shuffle이 있는데, default = False이지만, True로 변경해서 서브 데이터셋을 섞어서 학습할 수도 있습니다. 사실 실제로는 이 방법을 더 많이 씁니다. 데이터에 대한 편향성을 없애고, 일반화 성능을 올리기 위해서죠. 이 방법을  shuffle split cross validation이라고 합니다. 이외에도 cross validation 방법이 많지만, K-fold cross validation과 shuffle split cross validation을 많이 사용하기 때문에 이 정도로 마치겠습니다.

마치며..

오늘은 K-fold cross validation을 배워봤습니다. 저도 이 글을 작성하기 위해 공부를 다시 해봤는데, 제가 착각하고 있던 부분도 있더라고요. 이게 블로그를 쓰는 진정한 의미인 것 같습니다. 이 글은 저에게도 여러분에게도 의미가 있었던 포스팅이었던 것 같습니다. 앞으로도 더 많은 정보, 더 쉽게 전달하려 노력하겠습니다.

감사합니다.

반응형

'머신러닝' 카테고리의 다른 글

[pycaret] 예제를 통한 사용법 소개 및 설명  (0) 2024.05.29