logo

교차검증 📂머신러닝

교차검증

모델 검증

데이터 분석을 해서 얻은 모델은 그 퍼포먼스가 적절한지 확인하는 과정이 필요하다. 주어진 데이터만 잘 설명하고 실전에서 전혀 힘을 쓰지 못하면 분석을 하는 의미가 없기 때문이다. 이를 위해서 전체 데이터를 모델을 얻는데 사용할 데이터셋과 그 모형의 퍼포먼스를 평가할 데이터셋으로 쪼갠다.

20190128\_103954.png

모델을 얻겠다는 것은 주어진 데이터를 이용해 다른 데이터도 설명해보겠다는 의미다. 이러한 의미에서 ‘주어진 데이터’를 트레이닝 데이터training Data라 한다. 머신러닝 등의 분야에서 ‘학습’한다는 말과 맥락을 같이 한다. 그리고 ‘다른 데이터’를 테스트 데이터test Data라 한다. 엄밀히 말해 테스트 데이터는 ‘실제 테스트’를 하기 위해서 만들어진 것은 아니지만, 모델 입장에서 보면 새로운 데이터기 때문에 퍼포먼스를 확인하는데 쓰일 수 있는 것이다.

여기까지가 ‘모델을 검증한다’는 아이디어다. 분석이 제대로 된 것인지 확인하기 위해 다양한 검정이 있듯 그렇게 얻은 모델이 실제로 쓸모가 있는지 확인하는 것이다. 이러한 관점에서 보았을 때 무슨 회귀계수가 유의하냐, 변수가 너무 많은 것은 아니냐, 적합도 검정을 통과 했느냐 하는 것은 검증의 관심사가 아니다.

20190128\_104359.png

트레이닝 데이터로 얻은 모델이 테스트 데이터에 대해서도 괜찮은 퍼포먼스를 보인다면 다른 데이터에 대해서도 좋은 퍼포먼스를 낼 수 있을 것으로 생각할 수 있다. 우리가 수능 공부를 하는 과정이 트레이닝이라면, 모의고사가 바로 테스트다. 이러한 모의고사를 반복함으로써 우리가 수능에서 적절한 퍼포먼스를 낼 수 있을지 계속해서 확인하는 것이다.

그런데 어떤 학생이 수능을 앞두고 친 9모평 수학영역만 반복해서 공부했다고 생각해보자. 처음에 15점을 맞았다고 할지라도 같은 문제를 반복해서 풀고 답을 외울 수준으로 공부한다면 당연히 100점을 맞을 수밖에 없을 것이다. 하지만 이 학생이 수능에서 성적이 오르기를 기대하기는 힘들다. 이러한 현상을 과적합overfitting이라 한다. 너무 한정된 문제에만 최적화되었기 때문에 어떤 문제가 나올지 모르는 수능에는 대응할 수 없는 것이다.

하지만 이 학생이 재수를 해서 과거 10개년 수능과 6모평, 9모평을 반복해서 공부했다고 생각해보자. 이 모든 시험에서 100점을 받는 것은 어려울테지만 수능 성적은 분명히 올라갈 것이다. ‘많은’ ‘노력’을 ‘반복’했기 때문에 당연한 일이다. 이것이 우리가 알고 있는 공부의 정체다.

$k$-폴드

20190128\_114441.png 과적합을 발견하거나 회피할 때 쓸 수 있는 방법이 바로 교차검증cross Validation이다. 데이터를 딱 두 개로만 쪼갤 것이 아니라 다양한 상황을 만들어내서 가장 유연하게 데이터를 학습한 모델을 선택하는 것이다. 데이터를 쪼갤 땐 랜덤이기 때문에 어쩌다 정말 운이 좋아서 굉장히 퍼포먼스가 좋은 모델이 있을 수 있다. 이때 교차검증을 해보고 그 모델만 너무 압도적으로 퍼포먼스가 좋다면 과적합을 의심해볼 수 있다.

20190128\_114751.png 데이터B는 분명 데이터E를 테스트 데이터로 두었을 때 트레이닝 데이터로 쓰였지만, 반대로 데이터B가 테스트 데이터로써 쓰이지 못할 이유는 전혀 없다. 테스트 데이터를 돌려가면서 퍼포먼스를 확인하는 게 가능한 것이다. 특히 이렇게 쪼개는 갯수를 $k$ 개로 두고 하는 교차검증을 $k$-fold Cross Validation이라 한다.

만약 $k=n$ 인 경우, 그러니까 전체 데이터에서 하나씩만을 빼서 교차검증을 할 땐 잭 나이핑jackknifing이라 부르기도 한다.