본문 바로가기

Machine Learning

머신 러닝 입문자를 위한 설명 - 교차 검증(K-Fold Cross Validation)

기계 학습(머신 러닝) 알고리즘은 '모델'이 학습 데이터(Training Data)를 통해 학습된 속성을 기반으로 결과를 예측하도록 합니다. 얼핏 생각하기에는 적합한 데이터를 이용하여 훈련시킨다면 다른 데이터에 대해서도 정확한 답을 내놓을 것 같지만, 실제로 시도해 보면 생각만큼 제대로 작동하지는 않습니다.

여기서는 그 원인들 중 하나인 Overfitting(이하 과적합) 문제에 대해 이야기해보고자 합니다.
과적합이란 '학습이 너무 잘 된 상태'를 의미합니다.
학습이 잘 이루어졌는데 어째서 문제가 발생하는지 궁금하신 분들을 위해 간단한 예시를 들겠습니다.

(이차 함수의) 그래프 예측

다음과 같이 붉은색의 예측한 그래프와 파란색의 원하는 결과 그래프가 상이한 상황을 볼 수 있습니다.
이처럼 과적합이란 "모델이 실제 변수들 간의 관계보다는 학습 데이터의 노이즈를 설명하게 되는 경우"를 말합니다.
이 문제가 발생했을 때, 모델은 훈련 데이터가 아닌 새로운 테스트 데이터에 대해서는 제대로 예측하지 못합니다.

어떻게 이러한 문제를 해결할 수 있을까요?
사실 가장 간단한 방법이 있습니다. 바로 (적합한) 학습 데이터의 양을 늘리는 것입니다.

(삼차 함수의) 그래프 예측

이처럼 점의 개수를 늘릴수록 점차 원하는 그래프 모양에 가까워지는 것을 확인할 수 있습니다.

하지만 비용 문제, 시간 문제 등으로 인해 학습 데이터의 양을 무작정 늘릴 수는 없습니다.
따라서 우리는 학습 데이터의 양이 충분하지 않을 때도 과적합을 방지할 수 있어야 합니다.

그렇다면 학습 데이터가 제한된 상황에서는 어떠한 해결책이 있을까요?
Regularization(정규화), Dropout 등이 존재하지만, 이 글에서는 앞선 포스트인 https://devkor.tistory.com/entry/Ensemble-Methods?category=730880 에서 소개한 Ensemble(앙상블)과도 연관된 Cross Validation(이하 교차 검증)의 k-Fold Cross Validation에 대해 다루어보고자 합니다.

Rotation estimation(회전 추정) 또는 out-of-sample testing(표본 외 검증)이라고도 불리는 교차 검증은 과적합 문제가 존재한다는 사실을 알아내는 등 모델을 평가하는 데 사용하는 방법입니다. 간단하게 설명하면, 정해진 답이 있는 데이터를 두 가지로 구분하고, 하나는 훈련 데이터로 이용하여 모델을 훈련시킨 다음 다른 하나는 검증 데이터로 이용하여 제대로 훈련이 이루어졌나 확인합니다.

굉장히 합리적인 것 같지만,

  • 전체 데이터를 모두 훈련에 이용할 수 없고,
  • 데이터를 나눌 때 노이즈 값이 큰 데이터들이 한 쪽에 쏠린다면 제대로 검증 및 훈련이 이루어질 수 없는

문제점을 안고 있기 때문에 한계가 존재합니다.

그렇다면 검증 데이터로 한 가지 뿐만이 아니라 가능한 모든 경우를 검증해 보면 되지 않을까요?
맞습니다. 이 방식은 Exhaustive Cross-validation(소모적 교차검증)이라고 불리며, 이론상으로는 굉장히 바람직합니다.
다만 머신 러닝에서 이용하는 데이터의 양은 굉장히 방대하며,
중복되는 데이터도 많다는 사실을 고려해 보면 굉장히 비효율적입니다.

위 방식과 대비되어, 일부 경우만 따지는 방식을 Non-exhaustive Cross-Validation(비소모적 교차검증)이라고 부르며
k-Fold 교차 검증은 여기에 포함됩니다.

k-Fold 교차 검증의 구체적인 방식은 다음 그림과 같습니다.

k-Fold 교차 검증 과정

각 단계에 대해 글로 설명드리면 다음과 같습니다.

  1. 데이터 집합을 k개의 데이터 Fold로 나눕니다.
    (k-1)개의 Fold는 훈련 Fold, 1개는 검증 Fold로 지정합니다.
  2. 훈련 Fold를 이용하여 모델을 훈련시키고, 검증 Fold를 이용하여 정확도를 측정합니다.
    동시에 훈련 과정에서 구한 parameter 값들을 저장합니다.
  3. 1-2번 과정을 k번 반복합니다.
    이 때, 한 번 선정한 검증 Fold를 중복하여 선택하지 않습니다.
  4. 전체 시험 정확도의 평균을 k에 대한 모델의 정확도로 이용합니다.
    이 때, 저장한 parameter 값들에 대한 평균을 내어 최종적인 매개 변수로 이용합니다.

이후 k 값을 변경해 가며, 정확도가 가장 높은 k를 이용하는 모델을 선택합니다.

여기에서 말하는 parameter 값은 모델을 훈련시킬 때 바꾸는 수치입니다.
다시 말해서, 모델을 훈련시키는 것은 훈련 데이터를 이용해서 이 값을 조절하는 과정이며,
모델을 검증하는 것은 이 변수를 이용해서 주어진 검증 데이터에 대한 결과를 예측하는 과정입니다.

 

k-Fold Cross Validation의 경우 한 번만 교차 검증하는 방법에 비해 시간이 오래 걸립니다.
하지만 데이터가 적을 경우 모든 데이터를 훈련 및 검증에 이용할 수 있기 때문에 굉장히 의미 있으며,
데이터가 충분할 경우에도 검증 데이터가 쏠리는 문제를 해결할 수 있습니다.

Python의 sklearn.model_selection 모듈에서는 K-Fold 교차 검증을 구현한 함수를 제공합니다.
아래는 교차 검증을 이용하는 cross_val_score 함수의 사용 예제입니다.

7-Fold 교차 검증 사용 코드 예시

 

이처럼 머신 러닝에서의 가장 큰 문제 중 하나인 과적합 문제와, 이를 해결하기 위한 여러 방법들 중 k-Fold 교차 검증에 대해 알아 보았습니다. 사실 이론상 이보다 더 좋은 방법도 많지만, 어마어마한 계산량을 요구하기 때문에 현실에서는 이 방법을 선택합니다. 혹시 획기적인 방법을 생각해 내신다면 댓글로 알려 주시면 감사하겠습니다 : )

이만 줄이겠습니다. 감사합니다.

 

이 글은 다음 문서를 참조하였습니다.