Unisquads
로그인
홈
이용약관·개인정보처리방침·콘텐츠정책·© 2026 Unisquads
이용약관·개인정보처리방침·콘텐츠정책
© 2026 Unisquads. All rights reserved.

교차 검증 (r1)

이 문서의 과거 버전 (r1)을 보고 있습니다. 수정일: 2026.02.12 06:28

교차 검증

한국어 명칭

교차 검증

영문 명칭

Cross-validation

분류

머신러닝 모델 평가 기법

핵심 목적

모델의 일반화 성능 추정 및 과적합 방지

주요 유형

k-겹 교차 검증, 리브-원-아웃, 계층적 k-겹 등

상세 정보

작동 원리

데이터셋을 학습용(Training set)과 검증용(Validation set)으로 반복적으로 분할하여 모델을 훈련하고 평가

k-겹 교차 검증 절차

1. 데이터를 k개의 부분집합(Fold)으로 나눔. 2. k-1개 폴드로 학습, 나머지 1개 폴드로 검증. 3. 이 과정을 k번 반복. 4. k개의 성능 지표 평균을 최종 성능으로 산출

장점

데이터를 효율적으로 활용, 과적합(Overfitting) 위험 감소, 모델 성능 추정의 신뢰도 향상

단점/한계

계산 비용이 높음(모델을 k번 훈련), 데이터 분포가 균일하지 않을 경우 편향 발생 가능

주요 활용 분야

하이퍼파라미터 튜닝, 모델 선택, 작은 데이터셋에서의 신뢰할 수 있는 평가

관련 개념

홀드아웃 검증, 부트스트랩, 과적합, 일반화 오차

계층적 k-겹 교차 검증

각 폴드 내에 클래스 비율이 원본 데이터셋과 유사하도록 유지하는 방식, 불균형 데이터셋에 유용

1. 개요

교차 검증은 머신러닝과 통계학에서 예측 모델의 성능을 평가하고 일반화 능력을 추정하기 위해 널리 사용되는 재표본추출 기법이다. 이 방법은 사용 가능한 데이터를 여러 번 반복하여 학습 세트와 검증 세트로 나누고, 각 반복에서 모델을 학습시킨 후 검증 세트로 평가하는 과정을 통해 단일 평가 결과보다 더 신뢰할 수 있는 성능 추정치를 제공한다.

기본적인 홀드아웃 검증은 데이터를 고정된 학습 세트와 테스트 세트로 한 번만 나누기 때문에 분할 방식에 따라 평가 결과가 크게 달라질 수 있는 변동성을 가진다. 교차 검증은 이러한 문제를 완화하며, 특히 데이터의 양이 제한적일 때 모든 데이터를 효과적으로 학습과 평가에 활용할 수 있게 한다. 이는 과적합을 탐지하고 모델이 새로운, 보지 못한 데이터에 대해 얼마나 잘 작동할지 예측하는 데 핵심적인 역할을 한다.

교차 검증의 가장 일반적인 형태는 K-Fold 교차 검증이다. 이 방법에서는 데이터를 k개의 동일한 크기의 부분 집합(폴드)으로 나눈다. 그런 다음 k번의 반복을 수행하며, 각 반복에서는 하나의 폴드를 검증 세트로, 나머지 k-1개의 폴드를 학습 세트로 사용한다. 최종 모델 성능은 k번의 검증 결과를 평균하여 계산한다. 이 외에도 데이터의 클래스 분포를 유지하는 Stratified K-Fold 교차 검증, 한 번에 하나의 샘플만을 검증 세트로 사용하는 Leave-One-Out 교차 검증 등 다양한 변형이 존재한다.

교차 검증은 모델 평가뿐만 아니라 하이퍼파라미터 튜닝이나 여러 모델 중 최적의 모델을 선택하는 모델 선택 과정에서도 표준적인 방법론으로 자리 잡았다. 이를 통해 학습 데이터에 지나치게 맞춰진 모델을 걸러내고, 최종적으로 선택된 모델의 성능을 보다 객관적으로 보고할 수 있다.

2. 교차 검증의 필요성

머신러닝 모델을 개발할 때, 단순히 훈련 데이터에 대한 성능만을 평가하는 것은 과적합의 위험을 내포합니다. 모델이 훈련 데이터에 지나치게 맞춰져 새로운, 보지 못한 데이터(테스트 데이터)에 대한 일반화 성능이 떨어질 수 있습니다. 따라서 모델의 진정한 성능을 객관적으로 평가하고 일반화 능력을 추정하기 위한 방법이 필요합니다.

이를 위해 데이터를 훈련 세트와 테스트 세트로 한 번 나누는 홀드아웃 검증을 사용할 수 있습니다. 그러나 이 방법은 데이터 분할 방식에 따라 평가 결과가 크게 달라질 수 있다는 문제가 있습니다. 특히 데이터 양이 적을 경우, 특정 분할에서 우연히 좋은(나쁜) 성능이 나올 수 있으며, 모든 데이터가 모델 학습과 평가에 공정하게 사용되지 못합니다.

교차 검증은 이러한 문제를 해결하기 위해 고안된 체계적인 평가 방법입니다. 제한된 데이터를 최대한 활용하면서도 평가 결과의 편향과 분산을 줄이는 것을 목표로 합니다. 동일한 데이터셋을 반복적으로 여러 번 다른 방식으로 나누어 훈련과 검증을 수행하고, 그 결과를 종합하여 모델 성능을 추정합니다. 이를 통해 단일 홀드아웃 검증보다 더 안정적이고 신뢰할 수 있는 성능 지표를 얻을 수 있습니다.

3. 교차 검증의 주요 유형

교차 검증은 단일 홀드아웃 검증의 한계를 극복하기 위해 다양한 방식으로 구현된다. 각 유형은 데이터 분할 전략과 검증 세트의 구성 방식에서 차이를 보이며, 데이터의 특성과 모델 평가 목적에 따라 선택된다.

가장 널리 사용되는 방법은 K-Fold 교차 검증이다. 이 방법은 전체 데이터셋을 k개의 동일한 크기의 부분집합(폴드)으로 무작위 분할한다. 이후 k번의 반복 학습을 수행하는데, 각 반복마다 하나의 폴드를 검증 세트로, 나머지 k-1개의 폴드를 훈련 세트로 사용한다. 최종 성능은 k번의 검증 결과를 평균하여 계산한다. 일반적으로 k 값은 5 또는 10을 사용한다.

유형

설명

주요 특징

K-Fold

데이터를 k개 폴드로 나누어 순차적으로 검증

계산 효율성이 좋으며 일반적인 선택지

Stratified K-Fold

각 폴드의 클래스 비율이 원본 데이터와 유사하도록 분할

불균형 데이터셋에 적합

Leave-One-Out (LOO)

k를 샘플 수(N)로 설정. 한 번에 하나의 샘플만을 검증 세트로 사용

계산 비용이 매우 높지만 편향이 낮음

Leave-P-Out (LPO)

한 번에 p개의 샘플을 검증 세트로 사용

LOO의 일반화 형태. 조합 수가 매우 많아질 수 있음

Shuffle Split

데이터를 무작위로 섞은 후, 지정된 비율로 훈련/검증 세트를 반복적으로 샘플링

각 반복 시 샘플이 중복 선택될 수 있음

분류 문제에서 클래스 불균형이 존재할 경우, Stratified K-Fold 교차 검증이 권장된다. 이 방법은 각 폴드가 전체 데이터셋의 클래스 분포를 대표하도록 보장하여, 특정 클래스가 검증 폴드에 전혀 포함되지 않는 상황을 방지한다. 극단적인 경우로, Leave-One-Out 교차 검증은 샘플 수(N)만큼의 폴드를 생성하여 N-1개의 샘플로 학습하고 1개의 샘플로 검증하는 과정을 N번 반복한다. 이 방법은 거의 모든 데이터를 학습에 사용하므로 추정자의 편향을 최소화하지만, 계산 시간이 매우 길고 결과의 분산이 커질 수 있다는 단점이 있다.

3.1. K-Fold 교차 검증

K-Fold 교차 검증은 가장 널리 사용되는 교차 검증 방법 중 하나이다. 이 방법은 전체 데이터셋을 k개의 동일한 크기의 부분 집합, 즉 '폴드'로 무작위 분할한다. 이후 k번의 반복 학습과 평가를 수행하는데, 각 반복마다 하나의 폴드를 검증 세트로 사용하고 나머지 (k-1)개의 폴드를 훈련 세트로 사용한다.

이 과정은 k번 반복되며, 각 폴드는 정확히 한 번씩 검증 세트의 역할을 맡게 된다. 최종적인 모델 성능은 k번의 평가에서 얻은 성능 지표(예: 정확도, F1 점수)의 평균값으로 계산된다. 일반적으로 k 값은 5 또는 10을 많이 사용하며, 데이터 크기가 매우 작을 경우에는 Leave-One-Out 교차 검증을 고려하기도 한다[1].

K-Fold 교차 검증의 주요 장점은 모든 데이터 포인트가 정확히 한 번은 평가에 사용되므로 데이터를 효율적으로 활용할 수 있다는 점이다. 또한, 단순한 홀드아웃 검증에 비해 성능 추정의 분산을 줄여 더 안정적인 평가 결과를 제공한다. 그러나 데이터 분포가 불균형할 경우, 특정 폴드에 클래스 샘플이 고르게 분포되지 않아 편향된 평가 결과를 초래할 수 있다는 단점이 있다. 이러한 경우 Stratified K-Fold 교차 검증이 대안으로 사용된다.

반복 횟수

훈련 세트 폴드

검증 세트 폴드

1

폴드 2, 3, 4, 5

폴드 1

2

폴드 1, 3, 4, 5

폴드 2

3

폴드 1, 2, 4, 5

폴드 3

4

폴드 1, 2, 3, 5

폴드 4

5

폴드 1, 2, 3, 4

폴드 5

3.2. Stratified K-Fold 교차 검증

K-Fold 교차 검증은 데이터를 무작위로 분할하기 때문에, 각 폴드에 속한 샘플의 클래스 비율이 원본 데이터셋의 클래스 분포와 크게 달라질 수 있다. 이는 특히 불균형 데이터셋에서 문제가 된다. 특정 클래스의 샘플이 적을 경우, 어떤 폴드에는 해당 클래스의 샘플이 전혀 포함되지 않아 검증이 제대로 이루어지지 않을 수 있다.

Stratified K-Fold 교차 검증은 이러한 문제를 해결하기 위해 고안된 방법이다. 이 방법은 각 폴드가 원본 데이터셋의 클래스 비율을 최대한 유지하도록 계층화(stratify)하여 데이터를 분할한다. 분류 문제에서 주로 사용되며, 회귀 문제에는 일반적으로 적용되지 않는다.

특징

설명

주요 목적

각 폴드의 클래스 분포를 원본 데이터셋과 유사하게 유지

적합한 문제

분류 문제, 특히 불균형 데이터셋

분할 방식

각 클래스별로 데이터를 K등분한 후, 각 폴드에 클래스별 조각을 하나씩 배치

장점

불균형 데이터에서도 안정적인 성능 평가 가능, 편향된 추정 방지

단점

회귀 문제에는 적용 어려움, 구현이 기본 K-Fold보다 다소 복잡

실제 적용 시, 사이킷런 라이브러리의 StratifiedKFold 클래스를 사용하여 쉽게 구현할 수 있다. 이 클래스는 cross_val_score 함수와 함께 사용되거나, 분할기를 직접 생성하여 사용자 정의 평가 루프에 통합될 수 있다.

3.3. Leave-One-Out 교차 검증

Leave-One-Out 교차 검증은 K-Fold 교차 검증의 극단적인 형태로, 폴드의 수 K를 전체 데이터 샘플의 수 N과 동일하게 설정하는 방법이다. 이는 각 반복에서 하나의 샘플만을 검증 세트로 사용하고, 나머지 N-1개의 샘플을 훈련 세트로 사용하는 것을 의미한다. 이 과정은 N개의 샘플 각각이 한 번씩 검증 세트가 될 때까지 총 N번 반복된다.

이 방법의 가장 큰 장점은 훈련에 가능한 최대한의 데이터를 사용한다는 점이다. 각 반복마다 단 하나의 샘플만을 제외하고 모든 데이터로 모델을 학습시키므로, 데이터가 극도로 부족한 상황에서도 안정적인 성능 평가를 기대할 수 있다. 또한, 편향이 매우 낮은 평가 결과를 제공한다는 특징이 있다. 그러나 N번의 모델 학습과 평가를 수행해야 하므로, 데이터셋의 크기가 커질수록 계산 비용이 매우 크게 증가한다는 심각한 단점이 존재한다.

따라서 Leave-One-Out 교차 검증은 주로 샘플 수가 매우 적은 소규모 데이터셋에 적용된다. 대규모 데이터셋에서는 K-Fold 교차 검증 (일반적으로 K=5 또는 K=10)이 계산 효율성과 성능 추정의 안정성 사이에서 더 나은 절충안으로 여겨진다. 또한, Leave-One-Out 방식은 각 반복의 훈련 세트가 매우 높은 중복도를 가지기 때문에, 평가 결과의 분산이 높아질 수 있다는 비판도 있다.

특징

설명

폴드 수

전체 샘플 수 N과 동일

훈련 세트 크기

N-1개 샘플

검증 세트 크기

1개 샘플

반복 횟수

N회

주요 장점

낮은 편향, 데이터 활용도 극대화

주요 단점

높은 계산 비용, 높은 분산 가능성

적합한 경우

데이터 샘플 수가 매우 적은 경우

3.4. Leave-P-Out 교차 검증

Leave-P-Out 교차 검증은 교차 검증의 한 유형으로, 데이터셋에서 *p*개의 샘플을 검증 세트로, 나머지 모든 샘플을 학습 세트로 사용하는 방법이다. 이 과정은 가능한 모든 *p*개 샘플의 조합에 대해 반복적으로 수행된다. Leave-One-Out 교차 검증은 이 방법에서 *p*가 1인 특수한 경우에 해당한다.

이 방법은 주로 샘플 수(*n*)가 매우 적은 소규모 데이터셋에서 모델의 성능을 정밀하게 평가할 때 사용된다. 모든 가능한 학습-검증 조합을 평가하기 때문에 데이터를 최대한 활용하여 안정적인 성능 추정치를 제공할 수 있다. 그러나 그 계산 비용은 매우 높은 편이다. 가능한 조합의 수는 이항 계수 *nCp*로 계산되며, 이는 *n*과 *p*가 커질수록 기하급수적으로 증가한다.

예를 들어, 데이터셋에 10개의 샘플이 있고 *p*를 2로 설정하면, 검증 세트로 사용될 2개 샘플의 가능한 조합은 총 45가지가 된다. 각 조합에 대해 모델을 학습하고 평가해야 하므로, 대규모 데이터셋에는 실용적이지 않다.

데이터 샘플 수(n)

p 값

가능한 조합 수 (nCp)

10

2

45

20

2

190

50

2

1225

10

3

120

이 방법은 특히 샘플 간의 독립성을 가정할 수 있고, 데이터의 모든 부분집합을 균등하게 평가하는 것이 중요한 연구 분야[2]에서 유용하게 적용된다. 최종 성능 지표는 모든 반복에서 얻은 검증 점수의 평균으로 계산된다.

3.5. Shuffle Split 교차 검증

Shuffle Split 교차 검증은 K-Fold 교차 검증의 변형으로, 데이터를 무작위로 섞은 후 반복적으로 훈련 세트와 검증 세트를 분할하는 방법이다. 고정된 폴드 구조를 사용하지 않고, 매 반복마다 독립적인 무작위 샘플링을 통해 데이터를 분할한다는 점이 특징이다. 이 방식은 데이터 분할에 더 많은 유연성을 제공하며, 특히 데이터셋의 크기가 크거나 K-Fold 교차 검증의 제약을 벗어나고자 할 때 유용하게 적용된다.

이 방법의 핵심 매개변수는 반복 횟수(n_splits), 훈련 세트 비율(train_size), 검증 세트 비율(test_size)이다. 예를 들어, n_splits=5, train_size=0.7, test_size=0.3으로 설정하면, 전체 데이터를 무작위로 섞은 상태에서 70%를 훈련용, 30%를 검증용으로 선택하는 과정을 서로 다른 5번의 무작위 분할로 독립적으로 수행한다. 각 반복에서 선택된 샘플은 중복될 수 있으며, 이는 부트스트랩 샘플링과 유사한 효과를 낳는다.

특징

설명

분할 방식

매 반복마다 독립적인 무작위 샘플링

샘플 중복 가능성

서로 다른 반복에서 동일한 샘플이 훈련 또는 검증 세트에 중복되어 나타날 수 있음

유연성

훈련/검증 세트의 크기와 반복 횟수를 자유롭게 지정 가능

적합한 경우

대규모 데이터셋, K-Fold 교차 검증보다 더 많은 반복 평가가 필요할 때

이 방법은 과적합을 방지하고 모델의 일반화 성능을 더 안정적으로 추정하는 데 도움을 준다. 그러나 무작위성으로 인해 각 실행 시 결과가 약간 달라질 수 있으며, 특히 작은 데이터셋에서는 검증 세트의 클래스 분포가 불균형해질 위험이 있다. 따라서 Stratified K-Fold 교차 검증처럼 클래스 균형을 유지해야 하는 문제에는 적합하지 않을 수 있다.

4. 교차 검증 수행 절차

교차 검증 수행 절차는 일반적으로 체계적인 단계를 따라 진행된다. 이 과정은 데이터를 효과적으로 활용하여 모델의 일반화 성능을 신뢰성 있게 추정하는 것을 목표로 한다.

첫 번째 단계는 데이터 분할이다. 사용할 교차 검증 유형(예: K-Fold 교차 검증)에 따라 전체 데이터 세트를 K개의 부분집합(폴드)으로 나눈다. 이후 K번의 반복 실험을 수행하며, 각 반복마다 하나의 폴드를 검증 세트로, 나머지 K-1개의 폴드를 훈련 세트로 사용한다. 이 분할은 보통 무작위로 이루어지며, 계층적 샘플링이 필요한 경우 클래스 비율을 유지한다.

다음으로 모델 학습 및 검증 단계가 이어진다. 각 반복에서 훈련 세트를 사용하여 모델을 처음부터 학습(피팅)시킨다. 그런 다음, 해당 반복에서 따로 떼어 놓은 검증 세트를 사용하여 학습된 모델의 예측 성능을 평가한다. 이때 사용하는 평가 지표는 문제의 유형에 따라 달라지며, 정확도, 정밀도, 재현율, F1 점수, RMSE 등이 활용된다.

단계

주요 작업

출력/결과

데이터 분할

전체 데이터를 K개 폴드로 무작위 분할

훈련 세트와 검증 세트의 인덱스

모델 학습

훈련 세트 데이터로 모델 파라미터 학습

학습된 모델 객체

모델 검증

검증 세트로 모델 예측 및 평가 지표 계산

해당 폴드의 성능 점수 (예: 정확도 0.85)

마지막 두 단계는 성능 평가 지표 계산과 결과 평균화이다. K번의 반복이 모두 끝나면 각 검증 세트에서 계산된 성능 지표(예: 정확도)를 모두 수집한다. 최종적인 모델 성능 추정치는 이 K개의 개별 성능 점수의 평균값으로 계산한다. 또한, 이 점수들의 표준편차나 분산을 함께 보고하여 평가 결과의 안정성과 변동성을 함께 확인할 수 있다. 이 평균 성능 점수가 해당 모델의 예상 일반화 오차를 나타내는 지표로 사용된다.

4.1. 데이터 분할

데이터 분할은 교차 검증의 첫 번째 핵심 단계로, 전체 데이터셋을 학습용과 검증용 세트로 체계적으로 나누는 과정이다. 이 과정의 목표는 모델이 학습 과정에서 보지 못한 데이터에 대한 일반화 성능을 보다 신뢰성 있게 추정하는 것이다. 단순한 홀드아웃 검증과 달리, 교차 검증은 데이터를 여러 번 반복하여 분할하고 검증함으로써 평가 결과의 변동성을 줄인다.

가장 일반적인 K-Fold 교차 검증 방식에서는 전체 데이터를 k개의 비슷한 크기의 부분 집합, 즉 폴드로 무작위 분할한다. 이후 k번의 반복 실험을 수행하며, 각 반복마다 하나의 폴드를 검증 세트로, 나머지 (k-1)개의 폴드를 학습 세트로 사용한다. 이 과정은 각 폴드가 정확히 한 번씩 검증 세트의 역할을 할 때까지 계속된다. 분할 시 데이터의 순서가 성능에 영향을 미칠 수 있는 경우를 방지하기 위해, 데이터를 분할하기 전에 셔플링을 적용하는 것이 일반적이다.

분류 문제에서 클래스 불균형이 존재할 경우, 단순한 무작위 분할은 각 폴드 내의 클래스 비율이 원본 데이터셋과 크게 달라질 수 있다. 이를 해결하기 위해 Stratified K-Fold 교차 검증이 사용된다. 이 방법은 각 폴드가 전체 데이터셋의 클래스 분포를 대표하도록 보장한다. 예를 들어, 원본 데이터에서 클래스 A와 B의 비율이 7:3이라면, 각 폴드 내에서도 대략적으로 7:3의 비율을 유지하도록 데이터를 분배한다.

사용 가능한 데이터가 매우 적은 경우에는 Leave-One-Out 교차 검증이나 Leave-P-Out 교차 검증과 같은 exhaustive 방식을 고려할 수 있다. LOOCV는 n개의 샘플이 있을 때, 하나의 샘플을 검증 세트로, 나머지 n-1개를 학습 세트로 사용하는 과정을 n번 반복한다. 이는 가장 극단적인 형태의 k-폴드 교차 검증으로, k가 샘플 수 n과 동일한 경우에 해당한다. 데이터 분할 전략의 선택은 데이터의 크기, 분포, 그리고 해결하려는 문제의 특성에 따라 결정된다.

4.2. 모델 학습 및 검증

데이터가 학습 세트와 검증 세트로 분할되면, 각 폴드에 대해 모델 학습과 검증이 순차적으로 반복된다. 일반적으로 K번의 반복이 수행되며, 각 반복에서는 하나의 폴드가 검증 세트 역할을 하고 나머지 K-1개의 폴드가 학습 세트를 구성한다.

학습 단계에서는 학습 세트 데이터를 사용하여 모델의 매개변수를 추정하거나 의사결정나무의 구조를 결정하는 등의 작업이 이루어진다. 이때 모델은 검증 세트에 대한 정보를 전혀 사용하지 않는다. 검증 단계에서는 학습된 모델을 고정된 상태로 유지한 채, 검증 세트의 입력 데이터만을 모델에 입력하여 예측값을 생성한다. 이 예측값과 검증 세트의 실제 정답 레이블을 비교하여 해당 폴드의 성능 점수를 계산한다.

이 과정은 검증 세트로 지정되는 폴드가 한 번씩 순환될 때까지 계속된다. 예를 들어, 5-폴드 교차 검증에서는 총 5개의 독립적인 모델이 학습되고 각각 다른 1/5의 데이터로 검증을 받는다. 최종적으로는 K개의 서로 다른 검증 세트에서 얻은 성능 평가 결과가 얻게 된다.

단계

사용 데이터

목적

결과

학습

학습 세트 (K-1개 폴드)

모델 파라미터 학습 또는 적합

학습된 모델

검증

검증 세트 (1개 폴드)

학습된 모델의 일반화 성능 평가

해당 폴드의 성능 점수 (예: 정확도, RMSE)

이 방식은 모든 데이터 포인트가 정확히 한 번씩 검증 세트로 사용되도록 보장한다. 따라서 단일 홀드아웃 검증에 비해 데이터를 더 효율적으로 활용하며, 평가 결과의 변동성을 줄이는 데 기여한다.

4.3. 성능 평가 지표 계산

성능 평가 지표 계산 단계에서는 각 검증 세트에 대해 학습된 모델의 예측 성능을 정량적으로 측정합니다. 이를 위해 사전에 정의된 평가 지표를 사용하며, 문제의 유형(분류, 회귀 등)에 따라 적절한 지표가 선택됩니다. 예를 들어, 분류 문제에서는 정확도, 정밀도, 재현율, F1 점수, ROC-AUC 등을 사용할 수 있습니다. 회귀 문제에서는 평균 제곱 오차, 평균 절대 오차, 결정 계수 등이 일반적으로 활용됩니다.

계산 과정은 각 폴드에서 독립적으로 이루어집니다. 모델이 검증 세트의 샘플에 대해 예측을 수행하면, 이 예측값과 실제 정답 레이블을 비교하여 선택한 평가 지표의 값을 산출합니다. 이는 해당 폴드의 모델 성능을 대표하는 하나의 스칼라 값이 됩니다. 모든 폴드에 대해 동일한 평가 지표를 적용하여 일관된 비교가 가능하도록 합니다.

문제 유형

주요 평가 지표

간략한 설명

분류

정확도

전체 예측 중 올바른 예측의 비율

분류

F1 점수

정밀도와 재현율의 조화 평균

분류

ROC-AUC

다양한 임계값에서의 분류 성능을 종합한 면적

회귀

평균 제곱 오차

오차의 제곱에 대한 평균, 큰 오차에 민감

회귀

평균 절대 오차

오차의 절대값에 대한 평균, 직관적 해석 가능

회귀

결정 계수

모델이 설명하는 데이터 분산의 비율

이 단계의 결과는 K개의 폴드에서 나온 K개의 평가 점수 집합입니다. 예를 들어, 5-폴드 교차 검증을 정확도로 평가했다면, [0.82, 0.85, 0.80, 0.83, 0.84]와 같은 5개의 값이 얻어집니다. 이 값들은 다음 단계인 결과 평균화를 통해 모델의 전반적인 예측 성능과 그 변동성을 추정하는 데 사용됩니다.

4.4. 결과 평균화

교차 검증 과정에서 각 폴드는 독립적인 검증 세트로 사용되며, 이에 대한 성능 평가 지표(예: 정확도, 정밀도, 재현율, F1 점수, RMSE 등)가 계산된다. 결과 평균화는 이렇게 얻은 여러 개의 성능 지표 값을 하나의 대표값으로 종합하는 최종 단계이다.

가장 일반적인 방법은 각 폴드에서 계산된 성능 지표의 산술 평균을 구하는 것이다. 예를 들어, 5-폴드 교차 검증을 수행하여 각 폴드의 정확도가 [0.92, 0.89, 0.94, 0.90, 0.93]으로 나왔다면, 최종 보고되는 모델 성능은 (0.92+0.89+0.94+0.90+0.93)/5 = 0.916이 된다. 평균과 함께 표준 편차나 최소/최대값을 함께 보고하는 것이 일반적이다. 이는 모델 성능의 변동성과 안정성을 보여준다.

폴드 번호

검증 세트 정확도

1

0.92

2

0.89

3

0.94

4

0.90

5

0.93

평균 ± 표준편차

0.916 ± 0.019

평균화의 목적은 단일 훈련 세트와 테스트 세트 분할에 의존할 때 발생할 수 있는 우연적 편향을 줄이는 데 있다. 데이터 분할 방식에 따라 성능 평가가 크게 달라질 수 있으므로, 여러 번의 검증 결과를 평균함으로써 모델의 일반화 성능을 더 신뢰할 수 있게 추정한다. 회귀 문제에서는 평균 제곱 오차의 평균을, 불균형 데이터가 있을 경우에는 Stratified K-Fold 교차 검증 후 계산된 지표의 평균을 사용하는 등 문제 유형에 맞는 지표를 평균화한다.

5. 교차 검증의 장단점

교차 검증은 머신러닝 모델 평가의 신뢰성을 높이는 핵심 기법이지만, 명확한 장점과 함께 고려해야 할 단점 및 제약 사항을 가지고 있다.

주요 장점은 다음과 같다. 첫째, 과적합을 방지하고 모델의 일반화 성능을 보다 정확하게 추정할 수 있다. 단순히 훈련 세트와 테스트 세트를 한 번 나누는 홀드아웃 검증보다 데이터를 여러 번 다른 방식으로 나누어 평가하므로, 평가 결과의 변동성이 줄어들고 우연에 의한 좋은(혹은 나쁜) 평가를 받을 가능성이 낮아진다. 둘째, 제한된 데이터를 효율적으로 활용할 수 있다. 특히 데이터 샘플 수가 적을 때, 모든 데이터 포인트가 최소 한 번은 검증 세트로 사용되므로 데이터 낭비 없이 모델을 평가할 수 있다. 셋째, 하이퍼파라미터 튜닝이나 모델 선택 과정에서 모델 성능을 비교하는 객관적인 기준을 제공한다. 서로 다른 모델이나 파라미터 설정에 대해 동일한 교차 검증 절차를 적용하면 공정한 비교가 가능해진다.

반면, 교차 검증에는 몇 가지 단점과 주의사항이 존재한다. 가장 큰 단점은 계산 비용이 크게 증가한다는 점이다. 모델을 k번 학습하고 평가해야 하므로, 학습 시간이 오래 걸리는 복잡한 모델의 경우 실용적이지 않을 수 있다. 또한, 데이터 분할 방식에 따라 결과가 편향될 수 있다. 예를 들어, 데이터가 시간적 순서를 가지고 있거나(시계열 데이터), 특정 그룹으로 군집을 이루고 있을 경우, 무작위로 분할하는 일반적인 K-Fold 교차 검증은 비현실적인 평가 결과를 초래할 수 있다. 이런 경우 시간 기반 분할이나 그룹 정보를 고려한 그룹 K-Fold 교차 검증 등의 특수한 전략이 필요하다. 마지막으로, 교차 검증 자체가 테스트 세트의 역할을 대체하는 것은 아니다. 교차 검증은 모델 개발 과정(튜닝 및 선택) 내에서의 검증 세트 역할을 하며, 최종 모델의 성능을 보고하기 위해서는 교차 검증 과정에 전혀 사용되지 않은 완전히 독립적인 테스트 세트를 통해 최종 평가를 수행해야 한다[3]]을 사용하기도 함].

5.1. 장점

교차 검증은 단일 홀드아웃 검증에 비해 데이터를 더 효율적으로 활용한다는 핵심적 장점을 가집니다. 모든 데이터 포인트가 한 번씩은 검증 세트로 사용되므로, 특히 데이터가 부족한 상황에서도 안정적인 성능 평가가 가능해집니다. 이는 모델의 일반화 성능을 더 신뢰할 수 있게 추정하도록 돕습니다.

과적합을 탐지하는 데 유용한 도구로 작동합니다. 단순히 훈련 세트에 대한 오차가 낮고 테스트 세트에 대한 오차가 높은 패턴을 반복적으로 관찰함으로써, 모델이 훈련 데이터에 지나치게 맞춰져 있다는 사실을 확인할 수 있습니다. 또한, 하이퍼파라미터 튜닝이나 모델 선택 과정에서 서로 다른 모델이나 파라미터 설정을 공정하게 비교할 수 있는 기준을 제공합니다.

장점

설명

데이터 활용 효율성

제한된 데이터를 최대한 활용하여 더 안정적인 성능 추정이 가능합니다.

일반화 성능 추정의 신뢰도 향상

단일 분할에 의한 편향을 줄이고, 모델이 보지 못한 데이터에 대한 성능을 더 정확히 반영합니다.

과적합 탐지

일관되게 높은 훈련 정확도와 낮은 검증 정확도를 보여주면 과적합 가능성을 시사합니다.

모델/파라미터 비교의 공정성

동일한 교차 검증 절차를 적용하면 서로 다른 설정 간의 비교가 공정해집니다.

마지막으로, 교차 검증 결과는 단일 숫자가 아닌 성능 점수의 분포(예: 정확도의 평균과 표준편차)로 제공됩니다. 이를 통해 모델 성능의 변동성을 정량적으로 평가할 수 있어, 추정의 안정성에 대한 추가적인 통찰을 얻을 수 있습니다.

5.2. 단점 및 주의사항

교차 검증은 일반화 성능을 평가하는 강력한 도구이지만, 몇 가지 단점과 적용 시 주의해야 할 사항이 존재한다.

가장 큰 단점은 계산 비용이 크게 증가한다는 점이다. K-Fold 교차 검증을 사용하면 모델을 K번 학습시켜야 하므로, 단순 홀드아웃 검증에 비해 학습 시간이 약 K배 증가한다. 이는 데이터셋 규모가 크거나 모델이 복잡할 경우 실질적인 문제가 될 수 있다. 또한, 교차 검증 과정에서 데이터를 반복적으로 분할하고 학습하므로, 하이퍼파라미터 튜닝과 같은 작업과 결합하면 전체 파이프라인의 복잡성이 증가한다.

적용 시 주의사항으로는 데이터의 독립성과 무작위성 가정이 있다. 시계열 데이터나 공간 데이터처럼 관측치 간에 상관관계가 존재하는 경우, 단순 무작위 분할은 미래 정보가 과거를 예측하는 데 누출될 수 있어 비현실적으로 낙관적인 성능 평가를 초래한다[4]. 이러한 경우 시간적 순서를 고려한 분할 전략이 필요하다. 또한, 데이터 분포가 불균형할 때는 Stratified K-Fold 교차 검증을 사용하지 않으면 특정 폴드에 소수 클래스가 포함되지 않아 편향된 평가 결과를 얻을 수 있다. 마지막으로, 교차 검증 결과는 최종 모델 성능 자체가 아니라, 해당 모델이 새로운 데이터에 대해 일반화될 것으로 기대되는 성능의 추정치라는 점을 명심해야 한다.

6. 교차 검증의 실제 적용

교차 검증은 단순한 성능 평가 도구를 넘어 머신러닝 모델 개발의 여러 실질적 단계에서 핵심적인 방법론으로 적용된다. 주된 활용 영역은 하이퍼파라미터 튜닝, 모델 선택, 그리고 과적합 방지이다.

하이퍼파라미터 튜닝 과정에서 교차 검증은 그리드 서치나 랜덤 서치와 결합되어 사용된다. 연구자는 탐색하고자 하는 하이퍼파라미터 조합의 그리드를 정의하면, 알고리즘은 각 조합에 대해 교차 검증을 수행하여 검증 세트의 평균 성능을 계산한다. 이를 통해 단일 검증 세트의 운에 의존하지 않고, 보다 일반화된 성능 지표를 바탕으로 최적의 하이퍼파라미터를 선정할 수 있다. 비슷한 원리로, 서로 다른 종류의 모델(예: 의사결정나무 대 서포트 벡터 머신)의 성능을 비교하는 모델 선택 단계에서도 교차 검증은 공정한 비교 기준을 제공한다.

교차 검증의 가장 중요한 실질적 효과는 과적합을 탐지하고 완화하는 데 있다. 훈련 데이터에 지나치게 맞춰진 모델은 새로운 데이터에 대한 예측 성능이 떨어지게 된다. 교차 검증은 모든 데이터 포인트가 한 번씩 검증 세트의 역할을 하도록 하여, 모델이 특정 데이터 분할에만 과적합되는 것을 방지한다. 만약 모델의 훈련 정확도는 매우 높지만 교차 검증 점수는 consistently 낮다면, 이는 명확한 과적합의 신호로 해석된다. 또한, K-폴드 교차 검증에서 각 폴드별 성능의 분산이 크다면, 이는 모델이 데이터의 특정 부분집합에 불안정하거나 데이터 자체가 불균일할 가능성을 시사한다.

적용 영역

주요 목적

일반적인 접근법

하이퍼파라미터 튜닝

최적의 매개변수 조합 찾기

그리드 서치 + 교차 검증

모델 선택

여러 알고리즘 중 최상의 모델 선택

각 모델의 교차 검증 점수 비교

과적합 방지

모델의 일반화 성능 평가 및 진단

훈련 점수와 검증 점수의 차이 분석

6.1. 하이퍼파라미터 튜닝

교차 검증은 하이퍼파라미터 튜닝 과정에서 모델의 일반화 성능을 안정적으로 추정하기 위한 핵심 기법으로 활용된다. 단순히 훈련 세트와 검증 세트를 한 번 나누어 사용하는 홀드아웃 검증은 데이터 분할에 따른 성능 추정의 변동성이 크고, 검증 세트에 과도하게 적합되는 위험이 있다. 교차 검증은 이러한 문제를 완화하며, 주어진 하이퍼파라미터 조합에 대한 모델 성능을 더욱 신뢰할 수 있는 방식으로 평가한다.

가장 일반적인 접근법은 그리드 서치나 랜덤 서치와 같은 자동화된 튜닝 알고리즘 내부에 K-Fold 교차 검증을 통합하는 것이다. 예를 들어, 5-폴드 교차 검증을 사용한 그리드 서치는 다음과 같은 절차로 진행된다. 먼저, 탐색할 하이퍼파라미터 조합의 그리드를 정의한다. 그 후, 각 조합에 대해 5-폴드 교차 검증을 수행하여 5개의 검증 폴드에서 얻은 성능 점수(예: 정확도, F1 점수)의 평균을 계산한다. 최종적으로, 이 평균 검증 성능이 가장 높은 하이퍼파라미터 조합을 최적의 설정으로 선택한다.

단계

설명

1. 파라미터 그리드 정의

튜닝할 하이퍼파라미터와 그 후보 값들의 조합을 정의한다.

2. 교차 검증 수행

각 후보 조합에 대해 K-폴드 교차 검증을 적용하여 모델을 반복적으로 학습 및 검증한다.

3. 성능 평균 계산

각 조합에 대해 K개의 검증 성능 지표를 평균내어 해당 조합의 일반화 성능 추정치를 산출한다.

4. 최적 조합 선택

평균 검증 성능이 가장 우수한 하이퍼파라미터 조합을 최종 모델의 설정으로 채택한다.

이 과정을 통해 선택된 하이퍼파라미터는 단일 검증 세트에 의존할 때보다 데이터의 특정 부분에 덜 민감하고, 과적합의 위험을 줄이며 보다 강건한 모델 구성을 가능하게 한다. 특히 지도 학습에서 분류나 회귀 모델의 복잡도를 조절하는 파라미터(예: 의사결정나무의 최대 깊이, 서포트 벡터 머신의 규제 파라미터 C)를 튜닝할 때 표준적인 방법으로 사용된다.

6.2. 모델 선택

교차 검증은 여러 후보 머신러닝 모델 중에서 가장 성능이 우수한 모델을 선택하는 객관적인 기준을 제공한다. 단순히 훈련 세트에 대한 성능만으로 모델을 선택하면 과적합된 모델을 선정할 위험이 크다. 교차 검증을 통해 각 모델의 일반화 성능을 반복적으로 평가함으로써, 보이지 않는 새로운 데이터에 대한 예측 능력이 가장 뛰어난 모델을 식별할 수 있다.

모델 선택 과정에서는 주로 K-Fold 교차 검증이 활용된다. 각 후보 모델에 대해 동일한 K-겹 분할을 적용하여 검증 성능을 측정하고, 그 평균을 비교한다. 이때 검증 성능의 분산도 함께 고려하여 성능이 안정적인 모델을 선호하는 것이 바람직하다. 예를 들어, 선형 회귀, 의사결정 나무, 랜덤 포레스트 모델을 비교할 때, 각 모델의 교차 검증 평균 점수를 표로 정리하면 명확하게 비교할 수 있다.

모델

평균 RMSE (교차 검증)

성능 표준편차

선형 회귀

4.23

0.15

의사결정 나무

3.98

0.45

랜덤 포레스트

3.65

0.12

위 표에서 랜덤 포레스트 모델이 가장 낮은 평균 RMSE와 작은 표준편차를 보여 가장 우수하고 안정적인 모델로 선택될 수 있다. 이 과정은 하이퍼파라미터 튜닝과 결합되어 최적의 모델 구성을 찾는 모델 선택의 핵심 단계가 된다.

6.3. 과적합 방지

교차 검증은 과적합을 탐지하고 완화하는 핵심적인 도구이다. 단순히 훈련 세트와 테스트 세트를 한 번 나누어 평가하는 홀드아웃 검증은 특정 분할에 의해 우연히 좋은 성능이 나오거나, 데이터 분할이 모델 평가에 편향을 줄 수 있다. 교차 검증은 데이터를 여러 번 반복하여 분할하고 평가함으로써, 모델이 훈련 데이터에만 지나치게 맞춰지는 현상을 보다 일반화된 방식으로 진단할 수 있게 한다.

교차 검증을 통해 과적합을 방지하는 메커니즘은 주로 두 가지 측면에서 작동한다. 첫째, 검증 과정 자체가 과적합에 대한 조기 경보 역할을 한다. 만약 K-Fold 교차 검증에서 각 폴드마다 모델 성능의 변동이 매우 크다면, 이는 모델이 특정 훈련 데이터 하위 집합에 과도하게 의존하고 있음을 시사한다. 둘째, 교차 검증의 결과로 얻은 여러 성능 지표의 평균값은 단일 홀드아웃 검증 결과보다 훨씬 신뢰할 수 있는 일반화 성능 추정치를 제공한다. 이 추정치를 바탕으로 모델의 복잡도를 조절하거나 정규화 강도를 조정하는 등의 결정을 내릴 수 있다.

교차 검증 지표

과적합 탐지 신호

폴드 간 성능 변동(분산)이 큼

모델이 데이터의 특정 부분에 과도하게 적합되었을 가능성

훈련 점수는 높지만 검증 점수가 현저히 낮음

명확한 과적합 발생

평균 검증 점수가 지속적으로 낮음

과소적합이거나 모델 자체의 한계

실제 적용에서는 교차 검증을 하이퍼파라미터 튜닝과 결합하여 사용한다. 예를 들어, 그리드 서치나 랜덤 서치를 수행할 때 내부적으로 교차 검증을 사용하면, 튜닝 과정이 검증 세트에 대한 과적합을 유발하는 것을 방지할 수 있다. 이렇게 선택된 최적의 하이퍼파라미터를 가진 모델은 보지 못한 새로운 데이터(테스트 세트)에 대해서도 더 견고한 성능을 발휘할 가능성이 높아진다.

7. 교차 검증과 관련된 개념

교차 검증은 홀드아웃 검증이나 부트스트랩과 같은 다른 검증 기법들과 비교되거나 함께 사용된다. 또한, 더 엄격한 검증을 위해 중첩 교차 검증과 결합되기도 한다.

홀드아웃 검증은 데이터를 학습 세트와 테스트 세트로 한 번만 나누는 가장 간단한 방법이다. 이 방법은 구현이 쉽고 계산 비용이 낮지만, 데이터 분할의 무작위성에 따라 성능 평가 결과가 크게 변동할 수 있다는 단점이 있다. 특히 데이터 양이 적을 경우 이 변동성이 더 커진다. 반면, 교차 검증은 데이터를 여러 번 반복하여 나누고 검증하므로, 평가 결과의 편향과 분산을 줄여 더 안정적이고 신뢰할 수 있는 성능 추정을 제공한다.

부트스트랩은 주로 통계적 추정의 불확실성을 측정하는 데 사용되는 재표본추출 기법이다. 원본 데이터셋에서 중복을 허용하여 무작위로 샘플을 추출하여 여러 개의 부트스트랩 샘플을 생성하고, 각 샘플에 대해 모델을 학습 및 평가한다. 이 방법은 특히 작은 데이터셋에서 유용하며, 모델 성능 추정의 신뢰 구간을 계산할 수 있다는 장점이 있다. 그러나 부트스트랩은 교차 검증에 비해 계산 비용이 더 높을 수 있으며, 중복 샘플로 인한 과적합 위험이 존재한다.

개념

주요 특징

주요 용도

홀드아웃 검증

단순한 일회성 분할, 빠른 실행

대용량 데이터의 초기 빠른 평가

K-Fold 교차 검증

데이터를 k개 그룹으로 나누어 순차 검증

일반적인 모델 성능 평가 및 비교

부트스트랩

중복 허용 재표본추출, 신뢰 구간 추정

작은 데이터셋, 성능 추정의 불확실성 측정

중첩 교차 검증은 교차 검증을 두 겹으로 적용하는 고급 기법이다. 바깥쪽 루프에서 모델의 일반화 성능을 평가하고, 안쪽 루프에서 하이퍼파라미터 튜닝을 수행한다. 이 방식은 튜닝 과정 자체가 테스트 데이터에 대한 정보 누설을 일으켜 낙관적인 평가를 초래할 수 있는 문제를 방지한다. 따라서 모델 선택과 최종 성능 보고를 위한 가장 엄격하고 편향되지 않은 방법 중 하나로 간주된다[5].

7.1. 홀드아웃 검증

홀드아웃 검증은 머신러닝 모델의 성능을 평가하는 가장 기본적이고 직관적인 방법 중 하나이다. 이 방법은 전체 데이터셋을 학습용 세트와 검증용 세트, 두 부분으로 단 한 번 분할하여 사용한다. 일반적으로 데이터의 70-80%는 훈련 데이터로, 나머지 20-30%는 테스트 데이터로 할당하는 것이 일반적이다[6].

이 방법의 가장 큰 장점은 구현이 간단하고 계산 비용이 낮다는 점이다. 모델은 훈련 세트로 한 번 학습한 후, 보지 못한 테스트 세트에 대해 한 번만 평가하면 된다. 따라서 대규모 데이터셋이나 복잡한 모델을 빠르게 평가할 때 유용하다. 또한 최종 모델 성능을 보고하는 용도로도 자주 사용된다.

그러나 홀드아웃 검증에는 몇 가지 명확한 단점이 존재한다. 평가 결과가 단일한 무작위 분할에 크게 의존한다는 점이 가장 큰 문제이다. 분할이 어떻게 되었는지에 따라 성능 추정치의 분산이 매우 커질 수 있다. 특히 데이터의 양이 적을수록 이 변동성은 더욱 심해진다. 또한 테스트 세트에 할당된 데이터는 모델 학습 과정에서 전혀 사용되지 않아, 가용 데이터를 완전히 활용하지 못한다는 비효율성도 있다.

이러한 한계 때문에 홀드아웃 검증은 주로 초기 프로토타이핑이나 데이터 양이 매우 많은 경우에 간편한 검증 방법으로 사용된다. 보다 신뢰할 수 있는 성능 평가를 위해서는 데이터를 여러 번 반복하여 샘플링하고 평가하는 K-Fold 교차 검증과 같은 방법이 일반적으로 선호된다.

7.2. 부트스트랩

부트스트랩은 통계학에서 표본 데이터로부터 반복적으로 재표본을 추출하여 통계량의 분포를 추정하는 재표집 방법이다. 이 방법은 머신러닝과 통계적 추론에서 모델의 성능이나 매개변수의 불확실성을 평가하는 데 널리 사용된다. 부트스트랩의 핵심은 주어진 원본 데이터셋에서 중복을 허용한 무작위 복원 추출을 통해 여러 개의 새로운 표본(부트스트랩 표본)을 생성하는 것이다. 각 부트스트랩 표본은 원본 데이터셋과 동일한 크기를 가지지만, 일부 데이터는 여러 번 포함되고 일부는 전혀 포함되지 않을 수 있다.

부트스트랩은 교차 검증과 유사하게 데이터의 효율적 활용과 성능 평가를 목표로 하지만, 그 접근 방식에서 차이를 보인다. 교차 검증이 데이터를 중복 없이 분할하여 검증하는 반면, 부트스트랩은 중복을 허용한 재표집을 통해 여러 평가를 생성한다. 이 방법의 주요 장점은 특히 작은 데이터셋에서도 안정적인 추정치를 제공할 수 있다는 점이다. 또한, 표준 오차, 신뢰 구간과 같은 통계량의 불확실성을 계산하는 데 유용하게 적용된다.

특성

부트스트랩

K-Fold 교차 검증

데이터 사용 방식

중복 허용 복원 추출

중복 없이 분할

반복 횟수

사용자가 자유롭게 설정 (일반적으로 1000회 이상)

[[K-Fold 교차 검증

평가 샘플

각 반복에서 추출되지 않은 아웃 오브 백 샘플

미리 정해진 검증 폴드

주요 용도

불확실성 추정, 신뢰 구간 계산

모델 성능의 일반화 오차 추정

부트스트랩의 한계는 계산 비용이 높을 수 있다는 점이다. 수백에서 수천 번의 반복이 필요하기 때문에 대규모 데이터셋이나 복잡한 모델에서는 실행 시간이 길어질 수 있다. 또한, 부트스트랩 표본들이 원본 데이터의 분포를 완벽하게 대표하지 못할 위험이 항상 존재한다. 이 방법은 로버스트 통계 기법으로 분류되며, 앙상블 학습의 배깅 같은 알고리즘의 이론적 기반을 제공하기도 한다.

7.3. 중첩 교차 검증

중첩 교차 검증은 하이퍼파라미터 튜닝과 모델 선택 과정에서 발생할 수 있는 낙관적 편향을 줄이기 위해 설계된 교차 검증 기법이다. 이 방법은 두 개의 교차 검증 루프를 중첩하여 사용한다. 내부 루프는 모델의 하이퍼파라미터를 선택하거나 튜닝하는 데 사용되고, 외부 루프는 튜닝된 모델의 성능을 공정하게 평가하는 데 사용된다.

일반적인 단일 K-Fold 교차 검증을 사용해 하이퍼파라미터를 튜닝하고 동일한 데이터로 성능을 평가하면, 모델이 검증 세트에 과적합되어 최종 성능 추정치가 지나치게 낙관적으로 나타나는 문제가 있다. 중첩 교차 검증은 이 문제를 해결한다. 외부 루프에서 데이터를 훈련 세트와 테스트 세트로 나눈 후, 훈련 세트만을 사용해 내부 루프를 실행한다. 내부 루프에서 최적의 하이퍼파라미터를 찾으면, 그 파라미터로 전체 외부 훈련 세트를 다시 학습시켜 별도로 떼어놓은 외부 테스트 세트에서 성능을 측정한다. 이 과정을 외부 루프의 모든 폴드에 대해 반복한다.

단계

설명

외부 루프 (성능 평가)

데이터를 K개의 폴드로 나눈다. 각 폴드를 한 번씩 테스트 세트로 사용하고, 나머지 K-1개 폴드를 훈련 세트로 사용한다.

내부 루프 (모델 선택/튜닝)

외부 루프의 훈련 세트를 다시 M개의 폴드로 나눈다. 이를 통해 그리드 서치 등의 방법으로 최적의 하이퍼파라미터를 선택한다.

최종 평가

내부 루프에서 선택된 최적 하이퍼파라미터로 외부 훈련 세트 전체를 재학습시킨 모델을, 외부 테스트 세트로 평가한다.

이 방법은 계산 비용이 매우 크다는 단점이 있다. 외부와 내부 루프를 모두 교차 검증으로 수행하면 모델 학습 횟수가 폭발적으로 증가하기 때문이다. 그러나 과적합을 방지하고 모델 성능을 보다 신뢰할 수 있게 추정할 수 있어, 최종 모델 평가나 학술 논문의 실험 설계에서 중요한 방법론으로 여겨진다.

8. 주요 라이브러리 구현

Scikit-learn은 파이썬의 대표적인 머신러닝 라이브러리로, 다양한 교차 검증 전략을 쉽게 구현할 수 있는 도구를 제공한다. 이 라이브러리의 model_selection 모듈에는 검증 절차를 자동화하는 고수준 함수와 분할 방식을 직접 제어할 수 있는 저수준 클래스가 포함되어 있다.

가장 간단한 방법은 cross_val_score 함수를 사용하는 것이다. 이 함수는 추정기, 특성 데이터, 타겟 데이터, 교차 검증 전략, 평가 지표를 인자로 받아 각 폴드의 검증 점수를 계산하고 리스트로 반환한다. 사용자는 반환된 점수들의 평균을 최종 성능 지표로 활용한다. 예를 들어, 5-폴드 교차 검증을 통해 정확도를 평가하는 코드는 다음과 같이 간결하게 작성된다.

```python

from sklearn.model_selection import cross_val_score

from sklearn.ensemble import RandomForestClassifier

scores = cross_val_score(estimator=RandomForestClassifier(),

X=X_data, y=y_target,

cv=5, scoring='accuracy')

mean_score = scores.mean()

```

보다 세밀한 제어가 필요할 때는 KFold, StratifiedKFold, LeaveOneOut, ShuffleSplit 같은 분할기 클래스를 직접 사용한다. 이 클래스들의 객체를 생성한 후 split 메서드를 호출하면 학습용과 검증용 인덱스를 생성할 수 있으며, 이를 이용해 수동으로 학습과 평가 루프를 구성한다. StratifiedKFold는 특히 분류 문제에서 각 폴드의 클래스 비율이 원본 데이터셋과 유사하도록 보장한다.

클래스/함수

주요 용도

특징

cross_val_score

일반적인 교차 검증 점수 계산

사용이 간편하며, 검증 루프를 자동화한다.

KFold

기본 K-폴드 분할

데이터를 순차적으로 분할한다.

StratifiedKFold

계층화 K-폴드 분할

분류 문제에서 클래스 분포를 유지하며 분할한다.

LeaveOneOut

LOOCV 구현

한 샘플만을 검증 세트로 사용하는 극단적인 경우이다.

ShuffleSplit

무작위 반복 분할

매 반복 시 데이터를 무작위로 섞고 분할한다.

사용자는 특정 문제에 맞춰 사용자 정의 분할 전략을 구현할 수도 있다. BaseCrossValidator를 상속받거나, (train_indices, validation_indices) 생성자를 가진 이터레이터를 반환하는 사용자 정의 함수를 만들어 cv 매개변수에 전달하면 된다. 이를 통해 시계열 데이터의 시간적 순서를 고려한 분할이나, 그룹화된 데이터에서 동일 그룹이 학습과 검증 세트에 동시에 나타나지 않도록 하는 그룹 K-폴드 같은 복잡한 검증도 가능해진다.

8.1. Scikit-learn의 cross_val_score

cross_val_score 함수는 사이킷런 라이브러리에서 제공하는 가장 기본적이고 널리 사용되는 교차 검증 유틸리티이다. 이 함수는 사용자가 지정한 평가 지표를 사용하여 K-겹 교차 검증 또는 기타 교차 검증 전략을 간편하게 수행하고, 각 검증 폴드에서 얻은 성능 점수의 배열을 반환한다. 내부적으로 데이터 분할, 모델 학습, 예측, 평가의 전체 과정을 자동화하여 반복적인 코드 작성을 줄여준다.

함수의 주요 매개변수는 다음과 같다.

매개변수

설명

estimator

평가할 머신러닝 모델 객체 (예: RandomForestClassifier())

X

특성 데이터

y

타겟 레이블 데이터

scoring

사용할 평가 지표 (예: 'accuracy', 'f1', 'roc_auc')

cv

교차 검증 전략 (정수 k를 지정하면 KFold, KFold 또는 StratifiedKFold 객체도 가능)

n_jobs

병렬 처리에 사용할 CPU 코어 수

기본 사용 예시는 다음과 같다. cv=5를 지정하면 5-겹 교차 검증을 수행한다.

```python

from sklearn.model_selection import cross_val_score

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier()

scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')

print("각 폴드 점수:", scores)

print("평균 점수:", scores.mean())

```

cross_val_score는 내부적으로 fit과 score 메서드를 가진 모든 사이킷런 추정기와 호환된다. scoring 매개변수에 문자열 또는 호출 가능 객체를 전달하여 다양한 평가 지표를 활용할 수 있으며, 분류, 회귀, 클러스터링 작업에 맞는 지표를 선택해야 한다. 또한 cv 매개변수에 사용자 정의 교차 검증 분할기 객체를 전달하여 계층적 K-겹 교차 검증이나 셔플 분할 등의 복잡한 전략도 적용 가능하다.

8.2. Scikit-learn의 KFold 및 StratifiedKFold

Scikit-learn 라이브러리는 KFold와 StratifiedKFold 클래스를 제공하여 각각 기본적인 K-Fold 교차 검증과 계층화된 K-Fold 교차 검증을 손쉽게 구현할 수 있게 한다. 이 클래스들은 데이터를 분할하는 인덱스 생성기 역할을 하며, 주로 cross_val_score 함수나 사용자 정의 루프와 함께 사용된다.

KFold 클래스는 데이터를 단순히 k개의 폴드로 무작위 또는 순차적으로 분할한다. 주요 매개변수로는 폴드 수(n_splits), 데이터를 섞을지 여부(shuffle), 그리고 난수 시드(random_state)가 있다. 데이터를 섞는 것은 샘플 순서에 의존성을 제거하고 평가 결과의 편향을 줄이는 데 도움이 된다. 사용 예시는 다음과 같다.

```python

from sklearn.model_selection import KFold

kf = KFold(n_splits=5, shuffle=True, random_state=42)

for train_index, val_index in kf.split(X):

X_train, X_val = X[train_index], X[val_index]

y_train, y_val = y[train_index], y[val_index]

# 모델 학습 및 평가 수행

```

반면, StratifiedKFold 클래스는 분류 문제에서 특히 중요하다. 이 클래스는 각 폴드가 전체 데이터셋의 클래스 비율을 최대한 유지하도록 분할한다. 이는 소수 클래스가 특정 폴드에 집중되지 않도록 하여 검증 신뢰도를 높인다. 사용법은 KFold와 유사하지만, split 메서드에 특성 데이터 X와 함께 레이블 데이터 y를 반드시 제공해야 한다.

```python

from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

for train_index, val_index in skf.split(X, y):

X_train, X_val = X[train_index], X[val_index]

y_train, y_val = y[train_index], y[val_index]

# 모델 학습 및 평가 수행

```

두 클래스의 선택 기준은 문제의 유형에 달려 있다. 일반적인 회귀 문제나 데이터의 클래스 분포가 균일한 경우에는 KFold를 사용해도 무방하다. 그러나 불균형한 클래스 분포를 가진 분류 문제에서는 StratifiedKFold를 사용하는 것이 표준적인 방법이다. 이를 통해 각 폴드에서 얻은 성능 평가 지표의 분산을 줄이고, 모델의 일반화 성능을 더 안정적으로 추정할 수 있다.

8.3. 사용자 정의 교차 검증 전략

사용자 정의 교차 검증 전략은 Scikit-learn과 같은 머신러닝 라이브러리가 제공하는 기본 교차 검증 방법 외에, 연구자나 실무자가 특정 문제나 데이터의 고유한 특성에 맞춰 검증 절차를 직접 설계하는 것을 의미한다. 이는 데이터의 시간적 의존성, 계층적 구조, 불균형 분포 등 일반적인 방법으로 처리하기 어려운 복잡한 시나리오에서 필요하다.

사용자 정의 전략을 구현하는 일반적인 방법은 sklearn.model_selection 모듈의 BaseCrossValidator 클래스를 상속하여 새로운 검증기(validator) 클래스를 만드는 것이다. 사용자는 get_n_splits와 split 메서드를 반드시 구현해야 한다. split 메서드는 학습용 인덱스와 검증용 인덱스를 순차적으로 생성(yield)하는 제너레이터여야 한다. 예를 들어, 시계열 데이터의 경우 시간 순서를 유지하면서 과거 데이터로 학습하고 미래 데이터로 검증하는 롤링 윈도우 방식의 검증기를 직접 구현할 수 있다.

다른 접근법으로는, 라이브러리의 유연한 클래스를 조합하여 전략을 구성하는 방법이 있다. PredefinedSplit이나 TimeSeriesSplit을 활용하거나, KFold의 분할 방식을 제어하는 함수를 cv 매개변수에 직접 전달할 수 있다. 또한, 데이터 그룹 간의 누수를 방지하기 위해 그룹 K-Fold 교차 검증을 사용하거나, 동일한 환자의 데이터가 훈련 세트와 테스트 세트에 동시에 나타나는 것을 막기 위해 그룹 정보를 기반으로 분할할 수 있다.

구현 방식

설명

주요 활용 사례

BaseCrossValidator 상속

split 및 get_n_splits 메서드를 직접 구현.

시계열 롤링 윈도우, 복잡한 공간 데이터 분할

기존 검증기 조합/활용

PredefinedSplit, TimeSeriesSplit, 사용자 정의 분할 함수 사용.

사전 정의된 분할 사용, 시간 의존성 반영

그룹 기반 분할

GroupKFold, GroupShuffleSplit 또는 사용자 정의 그룹 로직 사용.

의료 데이터(동일 환자 데이터 분리), 여러 샘플을 가진 실험 데이터

이러한 사용자 정의 전략을 통해 모델 평가의 신뢰성을 높이고, 데이터의 본질적인 구조를 반영한 보다 정확한 성능 추정이 가능해진다.

9. 여담

교차 검증은 엄격한 평가 방법론이지만, 실제 적용 과정에서 직면할 수 있는 실용적 고려사항이나 덜 알려진 측면들이 존재한다.

데이터의 크기와 특성은 교차 검증 전략 선택에 큰 영향을 미친다. 매우 큰 데이터셋의 경우, 단순한 홀드아웃 검증으로도 안정적인 성능 추정이 가능할 수 있으며, 교차 검증의 높은 계산 비용을 정당화하기 어려울 때가 있다. 반대로 데이터 샘플 수가 극도로 적은 경우, Leave-One-Out 교차 검증이 유일한 합리적 선택처럼 보일 수 있지만, 이 방법은 분산이 매우 높을 수 있고 계산 시간이 길어질 수 있다는 점을 인지해야 한다. 또한, 시계열 데이터처럼 독립 동일 분포(i.i.d.) 가정을 만족하지 않는 데이터를 다룰 때는 일반적인 K-Fold 교차 검증을 그대로 적용하면 미래 정보를 이용해 과거를 예측하는 데이터 누출이 발생할 수 있다. 이를 방지하기 위해 시간 순서를 고려한 특수한 교차 검증 방법(예: 시간序列 교차 검증)이 필요하다.

교차 검증의 결과는 단순한 평균 점수 이상의 정보를 제공할 수 있다. 각 폴드별 성능 점수의 표준 편차나 최소/최대값을 살펴보면 모델 성능의 안정성을 가늠할 수 있다. 어떤 폴드에서 극단적으로 낮은 성능을 보인다면, 해당 폴드의 데이터 분포가 특이하거나 모델이 특정 데이터 패턴을 학습하지 못했음을 시사한다. 또한, 교차 검증 과정에서 각 폴드별로 선택된 최적의 하이퍼파라미터가 크게 다르다면, 모델이 데이터의 작은 변화에 매우 민감하거나, 사용한 하이퍼파라미터 탐색 공간이 적절하지 않을 수 있다는 신호로 해석할 수 있다.

교차 검증은 모델 평가의 표준 도구이지만, 그 자체가 목적이 되어서는 안 된다. 교차 검증 점수를 높이는 데만 집중하다 보면, 교차 검증 세트 자체에 대한 과적합이 발생할 위험이 있다. 특히 하이퍼파라리터 튜닝과 모델 선택을 반복적으로 수행할 때 이 위험이 커진다. 최종 모델의 일반화 성능을 진정으로 평가하려면, 교차 검증 과정을 통해 선택된 모델을 완전히 독립된 테스트 세트에서 최종 한 번 평가하는 절차가 반드시 필요하다.

10. 관련 문서

  • Wikipedia - 교차 검증 (통계학))

  • Scikit-learn 공식 문서 - 교차 검증: 모델 성능 평가하기

  • Google Developers - 머신러닝 단기집중과정: 검증 세트

  • Towards Data Science - 교차 검증에 대한 이해

  • KDnuggets - 교차 검증의 종류와 설명

  • Machine Learning Mastery - Python에서 k-겹 교차 검증을 사용하는 간단한 방법

  • STATQUEST with Josh Starmer - 교차 검증, 1부: 개요

리비전 정보

버전r1
수정일2026.02.12 06:28
편집자unisquads
편집 요약AI 자동 생성