Machine Learning/통계이론 훑어보기

교차검증(Cross Validation)이란

Jay김 2020. 8. 10. 14:29

만약 우리에게 다음과 같은 정보 집합(dataset)이 주어졌다고 해보자. 우리는 주어진 데이터를 이용해 혈압, 혈중 콜레스테롤 수치, 혈당 같은 변수를 이용해 환자 중 누군가가 심장질환을 가지고 있는지 예상하고자 할 것이며 이를 위해서 모델을 만들 것이다. 그 뒤 데이터에 없었던 새로운 환자가 나타나면 같은 변수들의 수치를 모델에 넣어 그 환자가 심장질환을 가지고 있는지 예상하고자 할 것이다.

 

그렇다면 이때 어떤 기계학습 알고리즘을 이용해야하는지 결정을 내릴 수 있는 방법은 무엇일까? 우리에게 주어진 선택지는 다양하다. 로지스틱 회귀분석 일수도 있고, K 최근접 이웃일수도 있고, SVM 아니면 그 외 다양한 기계학습 알고리즘이 존재한다. 교차검증은 이 다양한 알고리즘들의 성능을 비교하고 실전에서 실제 성능이 어떨지 어리짐작할 수 있는 수단이다. 

보통 데이터가 주어졌을때 우리는 두 가지 작업을 실행한다.

1. 기계학습 알고리즘의 매개변수를 조정해주기. 기계학습에선 이것을 알고리즘을 훈련(training)시키는 과정이라고 한다. 만약 우리가 로지스틱 회귀분석을 하고 있다면 우리는 로지스틱 곡선의 모양을 예측하고 있을 것이다.

2. 기계학습 알고리즘이 얼마나 예측을 잘하는지 평가하기. 기계학습에선 이것을 알고리즘을 시험(testing)하는 과정이라고 한다. 다시 로지스틱 회귀분석의 예로 돌아가자면, 우리는 이것이 자료 집합을 얼마나 잘 분류(categorize)하나 식으로 평가할 것이다.

만약 우리가 데이터 전부를 훈련과정에 써버리면 시험에 쓸 수 있는 데이터가 하나도 안 남아있어 곤란할 것이다.

만약 훈련에 썻던 데이터를 또 시험에 써버린다면 알고리즘이 훈련을 받아본 적이 없는, 그러니까 전혀 본 적이 없는 관측(observation)을 상대로 성능이 어떨지 제대로 평가할 수 없다.

좀 더 나은 선택지는 데이터의 75%를 훈련과정에 쓰고 나머지 25%를 시험과정에 쓰는 것이다. 그리하여 우리는 여러 가지 기계학습 알고리즘들의 성능 비교를 할 수 있다. 그러나 여기서 한 가지 의문이 생길 것이다. 과연 75%가 최고의 선택일까? 25%만 훈련과정에 쓰는 건 어떨까? 중간에 있는 블록만 쓰면 안 될까? 교차검증은 이런 고민 없이 블록 전부를 한 번씩 써보는 방법이다.

예를 들자면 교차검증은 일단 처음 3개의 블럭을 훈련과정에 쓰고 나머지 한 개를 시험과정에 쓴 뒤 성능을 기록해둘 것이다.

그다음으로 블록 1, 2, 4번을 훈련과정에 쓰고 나머지 한 개를 시험과정에 쓴 뒤 성능을 기록해둘 것이다. 이런 식으로 모든 조합으로 성능을 전부 기록했다면 그 평균을 구하여 평균 정확도를 내놓아 교차 검증을 완료한다. 우리는 이 평균 정확도들을 비교해 최종적으로 제일 괜찮은 성능을 보이는 기계학습 알고리즘을 선택할 수 있는 참고 자료를 얻을 수 있다.

일단 여기서 우리는 데이터를 4개의 블럭 혹은 겹(fold)으로 나눴기에 네 겹 교차검증을 실행했다고 한다. 이 겹은 일반적으로 K라고 지칭하고 영문으로는 K-fold cross validation이라고 불린다. 여기서 4는 임의로 택한 수다. 제일 극단적인 경우에는 한 개의 관측(그러니까 우리의 예에서는 환자 한 명에 해당하는 데이터)을 겹으로 설정할 수 있다. 이는 단일 잔류 교차검증(Leave-One-Out Cross Validation, LOOCV)이라고 불린다. 실제로는 보통 K=10인 10겹 교차검증이 많이 사용된다. 

교차검증은 초매개변수(Hyperparameter) 조정에도 사용될 수도 있다. 예를 들어 능선 회귀(ridge regression) 분석의 람다(lambda) 변수 조정을 할 때 다른 람다 값들에 대한 교차검증을 실행해 제일 적합한 람다를 고를 수 있다.

[Copyright ⓒ 블로그채널 무단전재 및 재배포 금지]