# 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]]