교차검증
데이터를 여러 부분으로 나누고 학습과 검증을 반복하여 모델의 예측 성능을 평가하는 방법입니다.
고객 1,000명의 데이터를 이용해 서비스 해지 여부를 예측하는 머신러닝 모델을 만들었다고 가정해 보겠습니다. 데이터를 학습용 800명과 평가용 200명으로 나누었더니 정확도가 90%로 나타났습니다. 이 결과만으로 새로운 고객에게도 90%의 정확도를 기대할 수 있을까요?
반드시 그렇지는 않습니다. 어떤 고객이 학습 데이터에 포함되고 어떤 고객이 평가 데이터에 포함되는지에 따라 결과가 달라질 수 있기 때문입니다. 우연히 예측하기 쉬운 고객들이 평가 데이터에 많이 포함되었다면 실제보다 좋은 성능이 나타날 수도 있습니다.
이러한 문제를 줄이기 위해 사용하는 대표적인 방법이 교차검증(Cross-Validation)입니다.
교차검증은 데이터를 여러 부분으로 나누고 학습과 검증을 반복하여 모델의 예측 성능을 평가하는 방법입니다. 한 번의 데이터 분할에서 얻은 점수만 확인하는 대신 여러 검증 결과를 종합하여 모델이 새로운 데이터에서도 얼마나 안정적으로 작동할지 판단하는 데 도움을 줍니다.
교차검증은 로지스틱 회귀, 의사결정나무, 랜덤 포레스트, 그래디언트 부스팅, 인공신경망(MLP) 등 다양한 예측모델에 적용할 수 있습니다. 또한 여러 알고리즘을 비교하거나 하이퍼파라미터를 선택할 때도 중요한 역할을 합니다.
이번 글에서는 교차검증의 기본 개념부터 K-Fold 교차검증, 층화·그룹·시계열 교차검증, 실제 분석 사례, 평가 지표, 데이터 누수, 모델 선택과 최종 성능 평가 방법까지 살펴보겠습니다.
교차검증이란 무엇이며, 왜 필요한가요?
교차검증은 데이터를 여러 개의 부분으로 나누어 모델 학습과 성능 검증을 반복하는 방법입니다.
일반적인 머신러닝에서는 데이터를 학습 데이터(Training Data)와 평가 데이터(Test Data)로 나눕니다. 학습 데이터로 모델을 만들고 평가 데이터에서 새로운 사례를 얼마나 잘 예측하는지 확인합니다.
하지만 한 번의 분할 결과는 어떤 관측값이 평가 데이터에 포함되었는지에 영향을 받을 수 있습니다. 특히 데이터가 적거나 특정 범주의 관측값이 적은 경우에는 분할에 따른 성능 차이가 커질 수 있습니다. 교차검증은 이 문제를 완화하기 위해 여러 번의 학습과 검증을 수행합니다.
예를 들어 데이터를 다섯 부분으로 나누었다면 네 부분으로 학습하고 나머지 한 부분으로 검증합니다. 이후 검증에 사용하는 부분을 바꾸어 같은 과정을 반복합니다. 이렇게 하면 각각의 관측값이 검증에 사용되는 기회를 가질 수 있으며, 여러 번 측정한 예측 성능을 종합할 수 있습니다.
교차검증의 핵심은 하나의 모델을 한 번 평가하는 대신, 같은 학습 절차를 여러 데이터 구성에서 반복하여 예측 성능과 그 변동을 확인하는 것입니다.
교차검증은 왜 필요한가요?
교차검증이 필요한 가장 큰 이유는 예측 성능이 데이터 분할 방식에 영향을 받을 수 있기 때문입니다.
예를 들어 고객 이탈 예측모델을 만들고 데이터를 무작위로 나누어 평가했다고 가정해 보겠습니다. 첫 번째 분할에서는 정확도가 92%, 두 번째 분할에서는 86%, 세 번째 분할에서는 89%로 나타날 수 있습니다. 사용한 알고리즘과 설정은 같지만 학습에 포함된 고객과 검증에 포함된 고객이 달라졌기 때문입니다.
이처럼 한 번의 분할에서 얻은 점수만 보고 모델의 성능을 판단하면 우연히 좋은 결과를 선택할 위험이 있습니다. 교차검증을 사용하면 여러 분할에서 나타난 성능을 비교하여 특정 분할에 지나치게 의존하지 않는지 확인할 수 있습니다.
또한 교차검증은 여러 알고리즘을 비교할 때도 유용합니다. 로지스틱 회귀와 랜덤 포레스트를 같은 교차검증 분할에서 평가하면 두 알고리즘의 성능 차이를 보다 일관된 조건에서 비교할 수 있습니다.
다만 교차검증도 미래 데이터에서의 성능을 완벽하게 보장하지는 않습니다. 학습 데이터와 실제 운영 환경의 데이터 분포가 다르거나 데이터 누수가 존재한다면 교차검증 점수 역시 실제 성능과 차이가 날 수 있습니다.
K-Fold 교차검증은 어떻게 진행되나요?
가장 대표적인 방법은 K-Fold Cross-Validation(K겹 교차검증)입니다.
K-Fold는 전체 데이터를 K개의 부분으로 나눈 뒤 K번의 학습과 검증을 반복하는 방법입니다. 예를 들어 K=5라면 데이터를 다섯 부분으로 나누고, 한 번에 네 부분을 학습에 사용하며 나머지 한 부분을 검증에 사용합니다. 각 부분이 한 번씩 검증 데이터가 되도록 총 다섯 번 반복합니다.
5번의 검증이 끝나면 각 회차에서 계산한 성능 지표를 종합합니다. 예를 들어 5개 폴드에서 정확도가 각각 85%, 87%, 86%, 89%, 88%로 나타났다면 평균 정확도는 87%입니다. 각 회차의 정확도 차이를 살펴보면 데이터 분할에 따라 예측 성능이 얼마나 달라지는지도 확인할 수 있습니다.
다만 K-Fold의 검증 점수는 각각의 학습 데이터가 상당 부분 겹치기 때문에 서로 완전히 독립적인 측정값은 아닙니다. 따라서 폴드 점수의 표준편차를 곧바로 모집단 일반화 성능의 신뢰구간으로 해석해서는 안 됩니다.
실제로 교차검증은 어떻게 진행되나요?
고객 1,000명의 데이터를 이용해 서비스 해지 여부를 예측한다고 가정해 보겠습니다.
이 중 800명은 모델 개발에 사용하고, 200명은 최종 평가를 위해 별도로 보관합니다. 개발용 데이터 800명에 5-Fold 교차검증을 적용하면 각 폴드의 검증 데이터에는 160명이 포함됩니다. 매 회차에서는 640명으로 모델을 학습하고 나머지 160명으로 성능을 계산합니다.
| 회차 | 학습 데이터 | 검증 데이터 |
|---|---|---|
| 1회차 | 640명 | 160명 |
| 2회차 | 640명 | 160명 |
| 3회차 | 640명 | 160명 |
| 4회차 | 640명 | 160명 |
| 5회차 | 640명 | 160명 |
이 과정에서 모델은 총 다섯 번 새롭게 학습됩니다. 첫 번째 회차에서 학습한 모델을 그대로 두 번째 회차의 검증에 사용하는 것이 아닙니다. 각 회차마다 지정된 학습 데이터로 모델을 새로 만들고, 해당 회차의 검증 데이터에서 점수를 계산합니다.
다섯 번의 검증이 끝나면 평균 점수와 회차별 성능 차이를 확인할 수 있습니다. 이후 모델과 설정을 선택했다면 개발용 데이터 800명 전체를 이용해 최종 모델을 다시 학습할 수 있습니다.
그리고 처음부터 따로 보관한 200명에게 최종 모델을 적용하여 모델 개발 과정에 사용되지 않은 데이터에서 성능을 확인합니다.
이처럼 교차검증은 모델 개발 과정에서 성능을 비교하는 역할을 하고, 별도의 최종 평가 데이터는 선택된 모델의 일반화 성능을 확인하는 역할을 합니다.
K값은 몇으로 설정해야 하나요?
K-Fold 교차검증에서 K는 데이터를 몇 개의 부분으로 나눌지 결정하는 값입니다.
실무에서는 5-Fold와 10-Fold가 널리 사용됩니다. K를 작게 설정하면 한 번의 검증에 상대적으로 많은 데이터가 포함되지만, 각 회차의 학습에 사용되는 데이터는 줄어듭니다.
반대로 K를 크게 설정하면 한 번의 학습에 더 많은 데이터를 사용할 수 있지만, 검증 데이터의 크기는 작아지고 모델을 학습하는 횟수도 증가합니다.
| 설정 | 특징 |
|---|---|
| 3-Fold | 학습 횟수가 적어 계산 비용이 비교적 낮음 |
| 5-Fold | 성능 평가와 계산 비용 사이의 균형을 고려할 때 자주 사용 |
| 10-Fold | 각 회차에서 더 많은 데이터를 학습에 활용 |
| LOOCV | 관측값 하나씩 검증하며 총 N번 학습 |
일반적으로 5-Fold나 10-Fold를 먼저 고려할 수 있지만, 모든 데이터에 동일한 K값이 가장 적합한 것은 아닙니다. 특히 데이터가 매우 적거나 계산 비용이 큰 모델에서는 K값 선택의 영향이 커질 수 있습니다.
또한 클래스 불균형이 심한 분류 문제에서는 단순히 K값을 크게 설정하는 것보다 각 검증 폴드에 관심 범주의 관측값이 충분히 포함되는지가 중요합니다. 따라서 K값은 표본 수와 범주 분포, 학습 시간, 분석 목적 등을 함께 고려하여 결정해야 합니다.
층화 교차검증(Stratified K-Fold)이란 무엇인가요?
층화 교차검증은 각 폴드에서 결과 범주의 비율이 전체 데이터와 비슷하게 유지되도록 데이터를 나누는 방법입니다.
예를 들어 고객 1,000명 중 100명이 서비스를 해지하고 900명이 유지했다고 가정해 보겠습니다. 전체 해지율은 10%입니다.
일반적인 무작위 K-Fold에서는 어떤 검증 폴드에 해지 고객이 상대적으로 적게 포함될 수 있습니다. 특히 해지 고객 자체가 매우 적다면 특정 폴드에 양성 사례가 거의 없거나 아예 없을 수도 있습니다.
층화 5-Fold를 적용하면 각 폴드에 해지 고객 약 20명과 유지 고객 약 180명이 포함되도록 나눌 수 있습니다.
| 폴드 | 해지 고객 | 유지 고객 | 해지율 |
|---|---|---|---|
| 1 | 20 | 180 | 10% |
| 2 | 20 | 180 | 10% |
| 3 | 20 | 180 | 10% |
| 4 | 20 | 180 | 10% |
| 5 | 20 | 180 | 10% |
이렇게 하면 특정 폴드에서 관심 범주의 비율이 지나치게 달라지는 문제를 줄일 수 있습니다. 층화 교차검증은 고객 이탈, 신용위험, 부정거래 등 범주 비율이 불균형한 분류 문제에서 유용합니다. 다만 관심 범주의 관측값이 K개보다 적다면 모든 폴드에 해당 범주를 포함시키는 것이 불가능합니다.
또한 층화는 범주 비율을 맞추는 방법일 뿐, 실제 운영 환경과의 차이나 고객별 반복 기록에 따른 데이터 누수를 해결하는 방법은 아닙니다.
반복 교차검증(Repeated K-Fold)이란 무엇인가요?
일반적인 K-Fold 교차검증은 한 번 만들어진 폴드 구성을 이용해 K번의 학습과 검증을 수행합니다.
하지만 폴드 구성을 만드는 과정에서도 우연한 차이가 발생할 수 있습니다. 반복 교차검증은 데이터 분할을 여러 번 새롭게 생성하여 K-Fold 검증을 반복하는 방법입니다. 예를 들어 5-Fold 교차검증을 3번 반복하면 총 15번의 학습과 검증이 이루어집니다.
각 반복에서는 서로 다른 무작위 분할을 사용하므로 여러 데이터 구성에서 성능을 확인할 수 있습니다.
| 설정 | 총 학습·검증 횟수 |
|---|---|
| 5-Fold × 1회 | 5회 |
| 5-Fold × 3회 | 15회 |
| 5-Fold × 5회 | 25회 |
| 10-Fold × 3회 | 30회 |
반복 교차검증은 한 번의 폴드 분할에서 얻은 결과가 우연한 구성에 크게 영향을 받는지 확인하는 데 도움이 됩니다. 다만 반복 횟수가 증가하면 학습 시간도 늘어납니다.
또한 반복된 폴드의 결과들은 서로 독립적이지 않으므로, 검증을 30번 수행했다고 해서 30개의 독립적인 외부 평가 데이터를 확보한 것으로 해석해서는 안 됩니다.
그룹 교차검증(Group K-Fold)이란 무엇인가요?
그룹 교차검증은 같은 그룹에 속한 관측값이 학습 데이터와 검증 데이터에 동시에 포함되지 않도록 나누는 방법입니다.
예를 들어 고객 500명의 이용 기록을 수집했는데 고객마다 여러 개의 거래 기록이 존재한다고 가정해 보겠습니다.
같은 고객의 거래 기록은 서로 독립적이지 않을 수 있습니다. 일반적인 무작위 K-Fold를 적용하면 한 고객의 일부 거래 기록이 학습 데이터에 들어가고 나머지 거래 기록은 검증 데이터에 들어갈 수 있습니다.
이 경우 모델이 같은 고객의 특성을 이미 학습했기 때문에 새로운 고객에 대한 예측 성능보다 낙관적인 결과가 나타날 가능성이 있습니다. Group K-Fold는 고객 ID를 기준으로 데이터를 나누어 동일 고객의 기록이 학습과 검증에 동시에 포함되지 않도록 합니다. 이 방법은 다음과 같은 데이터에서 유용합니다.
- 동일 고객의 반복 거래 기록
- 동일 환자의 여러 검사 결과
- 동일 학생의 반복 평가 점수
- 동일 기업의 여러 관측값
- 동일 장비에서 수집한 반복 측정값
다만 그룹 교차검증은 어떤 새로운 상황을 평가하려는지에 따라 적용 여부가 달라집니다. 예를 들어 이미 알고 있는 고객의 미래 거래를 예측하려는 문제와 완전히 새로운 고객을 예측하려는 문제는 서로 다른 평가 설계가 필요할 수 있습니다.
따라서 그룹을 분리한다는 사실 자체보다 실제 예측 환경을 반영하도록 데이터를 나누는 것이 중요합니다.
시계열 교차검증(Time Series Cross-Validation)이란 무엇인가요?
시간 순서가 중요한 데이터에서는 일반적인 무작위 교차검증이 적절하지 않을 수 있습니다.
예를 들어 2023년부터 2026년까지의 월별 매출 데이터를 이용해 다음 달 매출을 예측한다고 가정해 보겠습니다. 무작위로 데이터를 나누면 2026년의 데이터로 모델을 학습하고 2024년의 데이터를 검증하는 상황이 발생할 수 있습니다.
하지만 실제 예측에서는 미래 데이터를 이용해 과거를 예측하는 것이 아니라 과거 데이터를 이용해 미래를 예측합니다. 따라서 시간 순서를 유지한 교차검증이 필요합니다.
확장 창 방식에서는 학습에 사용하는 과거 데이터가 점차 늘어납니다. 반면 이동 창(Rolling Window) 방식에서는 학습 데이터의 기간을 일정하게 유지하면서 시간에 따라 창을 이동시킵니다.
| 방식 | 특징 |
|---|---|
| 확장 창 | 과거 학습 데이터를 누적하여 사용 |
| 이동 창 | 최근 일정 기간의 데이터만 사용 |
| 시계열 분할 | 시간 순서를 유지하고 미래 구간에서 검증 |
어떤 방식이 적절한지는 데이터의 특성에 따라 달라집니다. 예를 들어 과거의 오래된 정보도 유용하다면 확장 창 방식을 고려할 수 있습니다. 반대로 시장 환경이 자주 바뀌고 최근 데이터가 더 중요하다면 이동 창 방식이 적절할 수 있습니다.
또한 예측 목표가 여러 기간에 걸쳐 있거나 관측값의 정보 기간이 겹치는 경우에는 학습과 검증 구간 사이에 간격을 두어 누수를 방지해야 할 수 있습니다.
LOOCV(Leave-One-Out Cross-Validation)란 무엇인가요?
LOOCV는 관측값 하나만을 검증 데이터로 사용하고 나머지 모든 관측값으로 모델을 학습하는 방법입니다.
예를 들어 데이터가 100개라면 첫 번째 회차에서는 99개로 학습하고 1개로 검증합니다. 두 번째 회차에서도 다른 관측값 1개를 검증에 사용하며, 이 과정을 총 100번 반복합니다. LOOCV는 매 회차에서 대부분의 관측값을 학습에 사용할 수 있다는 장점이 있습니다.
하지만 데이터가 많거나 학습 비용이 큰 모델에서는 계산 시간이 상당히 증가할 수 있습니다. 또한 LOOCV가 반드시 일반적인 5-Fold나 10-Fold보다 안정적인 성능 추정값을 제공하는 것은 아닙니다.
특히 회차별 검증 데이터가 하나이므로 개별 회차의 정확도나 재현율 같은 분류 지표는 해석하기 어렵거나 계산할 수 없는 경우가 있습니다. 따라서 LOOCV는 표본이 적고 학습 비용이 충분히 낮은 상황에서 고려할 수 있지만, 모든 문제에서 우선적으로 사용할 방법은 아닙니다.
실제 사례: 로지스틱 회귀와 랜덤 포레스트를 비교한다면?
한 구독 서비스 기업에서 고객 5,000명의 데이터를 이용해 다음 달 서비스 해지 여부를 예측한다고 가정해 보겠습니다.
전체 고객 중 650명은 서비스를 해지했고, 나머지 4,350명은 서비스를 유지했습니다. 해지율은 13%입니다. 모델 개발에는 4,000명의 데이터를 사용하고, 나머지 1,000명은 최종 평가를 위해 별도로 보관했습니다.
두 알고리즘을 비교하기 위해 개발용 데이터에 층화 5-Fold 교차검증을 적용했다고 가정하겠습니다. 평가 지표는 클래스 불균형을 고려하여 PR-AUC를 선택했습니다.
교차검증 결과
| 폴드 | 로지스틱 회귀 PR-AUC | 랜덤 포레스트 PR-AUC |
|---|---|---|
| 1 | 0.40 | 0.48 |
| 2 | 0.44 | 0.51 |
| 3 | 0.42 | 0.46 |
| 4 | 0.38 | 0.49 |
| 5 | 0.41 | 0.50 |
| 평균 | 0.41 | 0.488 |
이 결과에서 로지스틱 회귀의 평균 PR-AUC는 0.41, 랜덤 포레스트는 약 0.49로 나타났습니다. 동일한 폴드에서 평가했을 때 랜덤 포레스트가 다섯 번 모두 더 높은 PR-AUC를 기록했습니다.
따라서 이 예시에서는 랜덤 포레스트가 로지스틱 회귀보다 고객 해지 여부를 구분하는 데 유용한 예측 순위를 제공했다고 볼 수 있습니다. 하지만 다섯 개 폴드에서 모두 높은 점수를 얻었다고 해서 다른 모집단이나 미래 고객에게서도 반드시 더 높은 성능이 나타난다고 보장할 수는 없습니다.
최종 모델을 선택한 뒤에는 별도로 보관한 평가 데이터에서 성능을 확인해야 합니다.
교차검증 결과와 평가 지표는 어떻게 해석하나요?
교차검증 결과를 보고할 때는 평균 점수뿐 아니라 폴드별 성능의 차이도 함께 확인하는 것이 좋습니다.
예를 들어 두 모델의 검증 정확도가 다음과 같이 나타났다고 가정해 보겠습니다.
| 폴드 | 모델 A 정확도 | 모델 B 정확도 |
|---|---|---|
| 1 | 90% | 87% |
| 2 | 80% | 88% |
| 3 | 95% | 86% |
| 4 | 75% | 89% |
| 5 | 90% | 90% |
| 평균 | 86% | 88% |
모델 A는 평균 정확도가 86%지만 폴드에 따라 정확도가 75%에서 95%까지 크게 달라졌습니다. 반면 모델 B는 평균 정확도가 88%이고, 폴드별 정확도도 86%에서 90% 사이로 상대적으로 일정했습니다.
이 결과에서는 모델 B가 해당 교차검증 분할에서 더 높은 평균 성능과 작은 점수 변동을 보였다고 설명할 수 있습니다. 하지만 폴드별 점수 차이가 작다고 해서 모든 환경에서 모델이 안정적이라고 단정할 수는 없습니다.
각 폴드가 비슷한 데이터 분포를 가지고 있다면 실제 운영 환경에서 발생하는 변화를 충분히 반영하지 못할 수도 있습니다. 또한 교차검증 점수의 표준편차는 폴드 사이의 점수 변동을 보여주는 값이지, 최종 모델의 예측 오차에 대한 엄밀한 신뢰구간과 동일하지 않습니다.
따라서 평균과 표준편차는 함께 참고하되 실제 데이터 구조와 평가 목적을 고려하여 해석해야 합니다.
교차검증에서는 어떤 평가 지표를 사용하나요?
교차검증 자체가 특정한 성능 지표를 의미하는 것은 아닙니다.
교차검증은 모델을 학습하고 검증하는 방법이며, 각 회차에서 어떤 점수를 계산할지는 분석 목적에 따라 결정합니다.
분류 문제의 평가 지표
| 지표 | 의미 |
|---|---|
| 정확도(Accuracy) | 전체 예측 중 올바르게 분류한 비율 |
| 정밀도(Precision) | 양성으로 예측한 사례 중 실제 양성의 비율 |
| 재현율(Recall) | 실제 양성 사례 중 찾아낸 비율 |
| F1 점수 | 정밀도와 재현율의 조화평균 |
| ROC-AUC | 양성과 음성을 구분하는 순위 성능 |
| PR-AUC | 정밀도와 재현율 관계를 요약 |
| 로그 손실(Log Loss) | 예측 확률과 실제 범주의 차이를 평가 |
고객 이탈이나 부정거래처럼 관심 사건의 비율이 낮다면 정확도만 사용하는 것은 적절하지 않을 수 있습니다. 이러한 경우에는 PR-AUC와 정밀도, 재현율 등을 함께 확인하는 것이 좋습니다.
회귀 문제의 평가 지표
| 지표 | 의미 |
|---|---|
| MAE | 절대오차의 평균 |
| MSE | 제곱오차의 평균 |
| RMSE | 평균제곱오차의 제곱근 |
| R² | 예측값이 실제값의 변동을 얼마나 설명하는지 평가 |
예를 들어 고객의 구매 금액을 예측한다면 RMSE를 기준으로 교차검증을 수행할 수 있습니다. 다만 RMSE나 R²처럼 비선형 변환이나 분모에 영향을 받는 지표는 각 폴드의 평균값과 모든 검증 예측을 모아서 계산한 값이 서로 다를 수 있습니다.
따라서 보고서에서는 폴드별 점수를 평균한 것인지, 전체 검증 예측을 통합하여 계산한 것인지 구분하는 것이 좋습니다.
교차검증에서 데이터 누수는 어떻게 발생하나요?
교차검증은 모델 평가의 신뢰성을 높이는 데 도움이 되지만, 전처리를 잘못하면 데이터 누수가 발생할 수 있습니다.
예를 들어 고객 데이터에서 결측값을 평균으로 대체한 뒤 5-Fold 교차검증을 수행한다고 가정해 보겠습니다. 전체 데이터의 평균을 먼저 계산하면 각 검증 폴드의 정보가 해당 폴드의 학습 과정에 반영될 수 있습니다. 표준화와 변수 선택도 마찬가지입니다.
전체 데이터에서 변수의 평균과 표준편차를 계산하거나 전체 데이터로 중요한 변수를 선택한 뒤 교차검증을 수행하면 검증 데이터가 완전히 독립적인 상태로 유지되지 않습니다. 따라서 올바른 교차검증에서는 각 회차마다 학습 데이터에 대해서만 전처리 기준을 추정해야 합니다.
잘못된 순서
전체 데이터 전처리 → 교차검증 분할 → 모델 학습 → 검증
올바른 순서
교차검증 분할 → 각 학습 폴드에서 전처리 기준 추정 → 학습 폴드에 모델 학습 → 검증 폴드에 동일한 전처리 적용 → 성능 계산
이러한 과정을 일관되게 처리하기 위해 전처리와 모델을 하나의 파이프라인(Pipeline)으로 구성하는 방법이 널리 사용됩니다. 특히 결측값 대체, 표준화, 원-핫 인코딩, 변수 선택, 차원 축소, 재표본추출 등을 사용하는 경우에는 교차검증 내부에서 각 절차가 학습되도록 구성해야 합니다.
하이퍼파라미터 튜닝과 중첩 교차검증
교차검증은 모델 성능을 평가하는 데 사용되지만, 하이퍼파라미터를 선택하는 과정에도 활용됩니다.
하이퍼파라미터는 모델 학습을 시작하기 전에 지정하는 설정값입니다. 예를 들어 랜덤 포레스트에서는 나무 수와 최대 깊이, 최소 리프 표본 수 등이 하이퍼파라미터에 해당합니다. 이러한 설정을 바꿔 가면서 교차검증 점수를 비교하면 어떤 조합이 더 좋은 검증 성능을 보이는지 확인할 수 있습니다.
하이퍼파라미터별 교차검증 예시
| 최대 깊이 | 5-Fold 평균 ROC-AUC |
|---|---|
| 3 | 0.79 |
| 5 | 0.83 |
| 8 | 0.85 |
| 12 | 0.84 |
| 제한 없음 | 0.81 |
이 결과에서는 최대 깊이 8일 때 평균 ROC-AUC가 0.85로 가장 높게 나타났습니다. 따라서 개발용 데이터의 교차검증 결과를 기준으로 최대 깊이 8을 선택할 수 있습니다. 하지만 교차검증 점수가 가장 높다는 이유만으로 해당 설정의 실제 일반화 성능이 정확히 0.85라고 보장되는 것은 아닙니다.
여러 설정을 비교하는 과정에서 우연히 검증 데이터에 잘 맞는 조합이 선택될 수 있기 때문입니다. 따라서 하이퍼파라미터 선택에 사용한 교차검증 점수와 최종 일반화 성능 평가는 구분해야 합니다.
중첩 교차검증(Nested Cross-Validation)이란 무엇인가요?
중첩 교차검증은 모델 설정을 선택하는 과정과 최종 성능을 추정하는 과정을 분리하기 위한 평가 방법입니다.
일반적으로 내부 교차검증(Inner Cross-Validation)과 외부 교차검증(Outer Cross-Validation)의 두 단계로 구성됩니다. 내부 교차검증에서는 하이퍼파라미터를 선택합니다. 외부 교차검증에서는 내부 과정에서 선택된 모델이 새로운 데이터에 얼마나 잘 적용되는지 평가합니다.
예를 들어 외부 5-Fold와 내부 3-Fold를 사용하는 경우를 생각해 보겠습니다. 먼저 외부 데이터의 네 부분을 모델 개발에 사용하고 나머지 한 부분을 평가에 사용합니다. 개발용 네 부분 안에서 다시 3-Fold 교차검증을 수행하여 가장 적절한 설정을 선택합니다.
그다음 선택된 설정으로 외부 학습 데이터를 다시 학습하고, 외부 평가 폴드에서 성능을 계산합니다. 이 과정을 외부 폴드마다 반복합니다. 중첩 교차검증은 여러 하이퍼파라미터를 비교하는 과정에서 발생할 수 있는 선택 편향을 줄여 모델 선택 절차의 일반화 성능을 추정하는 데 도움이 됩니다.
다만 계산 비용이 높아질 수 있으며, 외부 평가 폴드에서 얻은 점수도 동일한 모집단에서의 성능을 정확하게 보장하는 것은 아닙니다. 또한 실제 운영을 위해 최종 모델 하나를 만드는 경우에는 중첩 교차검증으로 평가한 뒤 전체 개발 데이터에서 설정을 다시 선택하고 모델을 학습하는 과정이 필요할 수 있습니다.
최종 평가 데이터와 결과 해석 시 주의사항
교차검증 결과가 좋다고 해서 반드시 별도의 평가 데이터가 필요 없는 것은 아닙니다.
교차검증을 이용해 여러 모델과 설정을 비교했다면 그 과정에서 얻은 점수는 모델 선택에 활용된 검증 성능입니다. 최종 평가 데이터는 선택된 모델이 개발 과정에서 사용하지 않은 데이터에 얼마나 잘 적용되는지 확인하는 데 유용합니다. 예를 들어 다음과 같은 결과가 나타났다고 가정해 보겠습니다.
| 평가 단계 | ROC-AUC |
|---|---|
| 개발 데이터의 교차검증 평균 | 0.86 |
| 별도 최종 평가 데이터 | 0.82 |
이 결과에서 최종 평가 점수는 교차검증 평균보다 0.04 낮게 나타났습니다. 이러한 차이는 데이터 구성의 우연한 변동, 모델 선택 과정, 학습 데이터의 크기 또는 실제 데이터 분포의 차이 등 여러 요인으로 발생할 수 있습니다.
다만 교차검증 평균이 최종 평가 점수보다 높다는 사실만으로 데이터 누수나 과적합이 반드시 존재한다고 단정할 수는 없습니다. 교차검증을 적절하게 설계했다면 별도의 최종 평가 데이터 없이도 성능을 추정하는 접근이 가능하며, 특히 데이터가 적은 연구에서는 중첩 교차검증 등을 활용할 수 있습니다.
중요한 것은 모델을 선택하는 데 사용한 데이터와 선택된 모델의 성능을 평가하는 데이터를 구분하는 것입니다.
교차검증 결과를 해석할 때 주의해야 할 점
교차검증은 머신러닝에서 중요한 평가 방법이지만 몇 가지 한계를 이해해야 합니다.
폴드 수가 많다고 반드시 좋은 것은 아닙니다.
K값을 크게 설정하면 각 회차의 학습 데이터가 많아지지만 검증 데이터는 작아지고 계산 비용은 증가합니다. 특히 희소한 범주를 예측하는 분류 문제에서는 검증 폴드에 관심 사건이 충분히 포함되는지 확인해야 합니다.
평균 점수만으로 성능의 안정성을 판단해서는 안 됩니다.
동일한 평균 점수를 보인 모델도 폴드별 점수의 변동이 다를 수 있습니다. 따라서 평균 점수와 함께 회차별 점수, 표준편차, 데이터 구성 등을 확인하는 것이 좋습니다.
관측값의 독립성을 고려해야 합니다.
같은 고객이나 환자, 기업에서 반복적으로 수집한 데이터는 서로 관련되어 있을 수 있습니다. 이러한 구조를 무시하고 일반적인 무작위 K-Fold를 적용하면 실제보다 낙관적인 성능이 나타날 수 있습니다. 필요에 따라 그룹 기준 교차검증을 사용해야 합니다.
시간 순서를 무시해서는 안 됩니다.
미래 결과를 예측하는 문제에서는 과거 데이터를 학습하고 이후 데이터를 검증하는 방식이 실제 운영 상황에 더 적합할 수 있습니다. 특히 금융, 매출, 수요 예측처럼 시간에 따른 변화가 중요한 문제에서는 시계열 교차검증을 고려해야 합니다.
교차검증도 데이터 누수에 영향을 받습니다.
결측값 대체, 표준화, 변수 선택 등을 전체 데이터에 먼저 적용하면 검증 데이터의 정보가 학습 과정에 반영될 수 있습니다. 따라서 전처리는 각 학습 폴드 안에서 수행해야 합니다.
교차검증은 실제 운영 환경의 변화를 완전히 예측하지 못합니다.
학습 데이터와 검증 데이터가 비슷하더라도 실제 운영에서는 고객 행동, 시장 상황, 상품 구성 등이 달라질 수 있습니다. 따라서 모델을 실제로 사용한 이후에도 예측 성능을 지속적으로 확인할 필요가 있습니다.
교차검증 결과 보고와 활용 방법
교차검증 결과를 보고할 때는 사용한 데이터와 알고리즘, 교차검증 방식, 폴드 수, 평가 지표, 평균 성능, 점수의 변동 등을 함께 제시하는 것이 좋습니다.
고객 이탈 예측 사례를 이용하면 다음과 같이 작성할 수 있습니다.
결과 보고 예시
고객의 다음 달 서비스 해지 여부를 예측하기 위해 로지스틱 회귀와 랜덤 포레스트를 비교하였다. 전체 5,000명의 고객 중 4,000명을 모델 개발에 사용하고, 나머지 1,000명은 최종 평가를 위해 별도로 보관하였다. 모델 개발 과정에서는 해지 고객의 비율을 고려하여 층화 5-Fold 교차검증을 수행하였다. 교차검증 결과 로지스틱 회귀의 평균 PR-AUC는 0.41, 랜덤 포레스트는 약 0.49로 나타났다. 이 예시에서는 랜덤 포레스트가 모든 검증 폴드에서 더 높은 PR-AUC를 기록하여, 해당 개발 데이터에서 상대적으로 우수한 예측 성능을 보였다.
실제 분석에서는 평균 점수뿐 아니라 폴드별 성능의 변동과 최종 평가 데이터의 결과도 함께 제시하는 것이 좋습니다. 또한 교차검증에 사용한 난수 시드, 데이터 분할 방식, 주요 전처리 절차, 하이퍼파라미터 선택 기준 등을 기록하면 분석의 재현성을 높일 수 있습니다.
특히 그룹 또는 시계열 교차검증을 사용했다면 그룹을 어떻게 정의했는지, 학습과 검증 기간을 어떻게 나누었는지 명확하게 설명해야 합니다.
교차검증은 어디에 활용할 수 있나요?
교차검증은 특정한 알고리즘에만 적용되는 분석이 아닙니다.
모델의 예측 성능을 평가하거나 여러 설정을 비교해야 하는 다양한 머신러닝 분석에서 활용됩니다.
분류모형 평가
로지스틱 회귀, 의사결정나무, 랜덤 포레스트, 그래디언트 부스팅, MLP 등의 분류 성능을 비교할 수 있습니다.
회귀모형 평가
선형회귀, 릿지, 라쏘, 엘라스틱넷, 랜덤 포레스트 회귀, MLP 회귀 등의 예측 오차를 비교할 수 있습니다.
하이퍼파라미터 선택
나무의 깊이, 규제 강도, 은닉층 구조, 학습률 등 여러 설정의 성능을 비교하여 적절한 조합을 선택할 수 있습니다.
변수 선택
서로 다른 변수 조합을 평가하여 어떤 변수를 사용하는 것이 새로운 데이터에서 더 좋은 예측 성능을 보이는지 비교할 수 있습니다. 이때 변수 선택 과정 역시 교차검증 내부에서 수행해야 합니다.
모델 비교 및 자동화된 머신러닝
여러 알고리즘과 설정을 자동으로 평가하는 AutoML에서도 교차검증을 활용할 수 있습니다. 다만 모든 알고리즘에 동일한 교차검증 방식이 적절한 것은 아닙니다. 데이터의 독립성, 시간 구조, 범주 분포 등을 고려하여 평가 방식을 선택해야 합니다.
교차검증은 한 번의 점수가 아니라 반복된 평가로 모델을 판단하는 방법입니다.
교차검증은 데이터를 여러 부분으로 나누고 모델의 학습과 검증을 반복하여 예측 성능을 평가하는 방법입니다.
가장 대표적인 방법은 K-Fold 교차검증이며, 데이터의 특성에 따라 층화 교차검증, 반복 교차검증, 그룹 교차검증, 시계열 교차검증 등을 사용할 수 있습니다.
교차검증을 활용하면 하나의 데이터 분할에서 얻은 결과에 지나치게 의존하지 않고 여러 검증 점수를 비교할 수 있습니다. 또한 다양한 머신러닝 알고리즘의 성능을 비교하거나 적절한 하이퍼파라미터를 선택하는 데 도움이 됩니다.
하지만 교차검증을 수행했다는 사실만으로 모델의 성능이 신뢰할 수 있게 되는 것은 아닙니다. 데이터의 구조에 맞는 분할 방법을 사용하고, 전처리 과정에서 데이터 누수를 방지하며, 모델 선택과 최종 평가를 구분해야 합니다.
특히 같은 고객의 반복 관측값이나 시간 순서가 있는 데이터에서는 일반적인 무작위 K-Fold를 그대로 적용하지 않도록 주의해야 합니다.
교차검증의 핵심은 모델이 학습 데이터에서 얼마나 높은 점수를 얻었는지가 아니라, 학습에 사용하지 않은 여러 데이터에서도 얼마나 일관된 예측 성능을 보이는지 확인하는 데 있습니다.