# Cross-Validation
Cross-Validation(CV)은 기계학습에서 모델의 일반화 성능을 추정하기 위해 데이터셋을 여러 부분으로 나누고 순차적으로 학습과 평가를 수행하는 재샘플링(resampling) 기법이다. 이를 통해 학습 데이터에 대한 편향을 줄이고, 새로운 데이터에 대한 예측 성능을 더 안정적으로 추정할 수 있다.
## 정의
Cross-Validation은 데이터셋을 다수의 부분집합(folds)으로 나누고, 각 부분집합을 순회하며 남은 부분집합을 학습용(training) 데이터로, 해당 부분집합을 검증용(validation) 데이터로 활용하여 성능을 측정하는 절차이다. 일반적으로 각 반복에서 얻은 검증 성능을 평균 내어 모델의 일반화 오차를 추정한다. 수식으로 표현하면, k개의 폴드로 구성된 Cross-Validation의 평균 검정 오차는
\[
CV = \frac{1}{k} \sum_{i=1}^{k} e_i
\]
여기서 \(e_i\)는 i번째 폴드에서의 손실(loss) 또는 에러를 나타낸다. 회귀에서는 평균제곱오차(MSE)나 평균제곱근오차(RMSE), 분류에서는 정확도, 정밀도, 재현율, F1-score 등으로 표현될 수 있다. 이때 오차의 정의에 따라 $e_i$의 형태가 달라진다.
또한, 특정 상황에서 사용되는 시간 순서 데이터(Time-series)나 클래스 불균형 데이터에서는 일반적인 랜덤 분할이 바람직하지 않을 수 있으며, 이때는 Time-Series CV나 Stratified CV와 같은 변형이 필요하다.
## 주요 방법
- K-fold Cross-Validation
- 데이터셋을 서로 겹치지 않는 k개의Fold로 나누고, 각 Fold를 한 번씩 검증용으로 사용한다.
- 일반적으로 k=5 또는 k=10이 많이 사용된다.
- Leave-One-Out Cross-Validation (LOOCV)
- k가 데이터 포인트 수 n과 동일하게 설정되어 각 샘플을 한 번씩 검증용으로 사용하고, 나머지를 학습용으로 사용한다.
- 데이터가 작거나 모델의 편향을 최소화하고자 할 때 사용되지만, 계산 비용이 크게 증가하고 분산이 커질 수 있다.
- Stratified K-fold Cross-Validation
- 분류 문제에서 각 폴드가 전체 데이터의 클래스 분포를 대표하도록 샘플링한다.
- 클래스 불균형이 있는 데이터에서 성능 평가의 편향을 줄여준다.
- Repeated Cross-Validation
- 동일한 k-fold CV를 여러 번 반복하여 서로 다른 난수 시드로 폴드를 구성한 뒤, 결과를 평균하고 표준편차를 함께 제시한다.
- Time-Series Cross-Validation
- 시계열 데이터의 순서를 보존하면서 앞선 데이터로만 학습하고 미래 데이터를 검증에 사용한다.
- Forward chaining 또는 rolling forecast Origin 방식으로 구현할 수 있다.
- Nested Cross-Validation
- 하이퍼파라미터 튜닝이나 모델 선택을 일반화 오차 추정에서 분리하기 위한 방법이다.
- 바깥쪽 CV는 일반화 오차 추정을, 안쪽 CV는 하이퍼파라미터 최적화를 수행한다.
- Monte Carlo Cross-Validation (또는 Shuffle-Split CV)
- 데이터를 임의로 여러 번 섞어 학습 및 검증 세트를 무작위로 구성하는 방식이다.
- 샘플 수가 충분하면 안정적인 추정이 가능하지만, 특정 데이터 분할에 대한 의존성이 남을 수 있다.
## 절차 요약
1) 데이터셋 \(D\)를 선택한 Cross-Validation 전략으로 분할한다.
2) 각 폴드 \(j\)에 대해, 남은 폴드를 학습용으로 사용하고 \(j\) 폴드를 검증용으로 사용한다.
3) 폴드별 손실 \(e_j\)를 계산한다.
4) 전체 평균 또는 통계치를 통해 일반화 오차를 추정한다.
- 평균 오차: \(CV = \frac{1}{k} \sum_{j=1}^{k} e_j\)
- 신뢰구간 등 추가 통계량도 함께 제시 가능하다.
5) 필요 시, Nested CV를 활용하여 하이퍼파라미터 튜닝의 편향을 줄인다.
## 평가 지표와 수식
- 이진/다중 분류에서의 일반적 지표
- 정확도: \(Accuracy = \frac{TP+TN}{TP+TN+FP+FN}\)
- 정밀도: \(Precision = \frac{TP}{TP+FP}\)
- 재현율(민감도): \(Recall = \frac{TP}{TP+FN}\)
- F1-score: \(F1 = 2 \cdot \frac{Precision \cdot Recall}{Precision + Recall}\)
- AUROC 등 순위 기반 지표
- 회귀에서의 일반적 지표
- 평균제곱오차: \(MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2\)
- 루트평균제곱오차: \(RMSE = \sqrt{MSE}\)
- CV의 분산-편향 관점
- Cross-Validation은 일반화 오차의 편향과 분산 사이의 trade-off를 제어하는 도구이다. 일반적으로 더 큰 k는 분산을 감소시키지만 계산 비용이 증가하고, LOOCV는 분산이 커질 수 있다.
- 시간 순서 데이터의 특수성
- 시간 의존성을 보존해야 하므로, 앞의 데이터로만 학습하고 뒤의 데이터를 검증에 사용한다. 예를 들어, 초기 시점들로 학습하고 이후 시점으로 검증하는 구조가 필요하다.
## 실무 팁
- 데이터 분할의 RANDOM SEED 고정
- 재현 가능한 결과를 위해 시드(seed)를 고정하는 것이 좋다.
- Strata 유지
- 분류 문제에서는 Stratified CV를 사용하여 각 폴드가 원 데이터의 클래스 비율을 반영하도록 한다.
- 데이터 누출 방지
- 특성 공정(feature engineering)이나 스케일링은 폴드 간에 누출이 없도록 별도의 학습/검증 분리 내에서 수행해야 한다.
- 스케일링과 전처리
- 스케일링은 각 폴드에서 독립적으로 수행하거나, 학습 데이터의 통계치를 사용해 변환을 적용해야 한다.
- 하이퍼파라미터 튜닝의 편향 방지
- Nested CV를 사용하면 하이퍼파라미터 선택으로 인한 과최적화를 피할 수 있다.
- 신뢰구간과 불확실성 보고
- CV 에스티메이트의 표준편차나 신뢰구간을 함께 제시하면 일반화 성능의 불확실성을 이해하는 데 도움이 된다.
- 데이터셋 규모 고려
- 작은 데이터셋의 LOOCV는 편향이 적어 보일 수 있지만 분산이 커질 수 있다. 대체로 5- 또는 10-폴드 CV가 균형이 좋다.
## 실전 적용 사례
- 이진 분류에서 신용카드 사기 탐지와 같은 불균형 데이터에서 Stratified 5-fold CV를 사용하여 F1-score를 추정한다.
- 회귀 모델의 성능을 평가할 때 10-fold CV를 적용하고 각 폴드의 RMSE를 비교해 모델의 일반화 능력을 판단한다.
- 시간의존적 데이터의 가격 예측 문제에서 Time-Series CV를 적용하여 미래 데이터를 예측하는 데 필요한 일반화 능력을 평가한다.
- 하이퍼파라미터가 많은 모델에서 Nested CV를 사용해 최적의 파라미터 조합을 찾고, 외부 일반화 오차를 추정한다.
## 한계와 주의점
- 데이터 크기가 매우 작으면 CV의 분해가 과도하게 작아져 학습 데이터가 충분하지 못할 수 있다.
- 무작위 분할 방식은 데이터의 순서나 구조를 무시하므로, 특정 데이터 세트에 대해 과대평가되거나 과소평가될 수 있다.
- 다중 비교 문제를 다룰 때는 CV 결과에 대한 해석에 주의가 필요하다. 여러 모델 간의 비교에서 통계적 유의성도 함께 고려해야 한다.
---
관련 문서: [[다른 문서명]], [[다른 문서명2]], [[Cross-Validation 상세 가이드]], [[Nested Cross-Validation]], [[Time Series Cross-Validation]], [[Stratified K-Fold Cross-Validation]], [[Model Evaluation Metrics]]