Data Analysis/머신러닝

K-폴드 교차

subinz 2026. 7. 31. 17:19

K-폴드 교차 검증이란?

K-폴드 교차 검증(K-Fold Cross Validation)은 데이터를 K개의 구간으로 나누고, 학습과 검증을 반복하여 모델의 성능을 평가하는 방법이다.

한 번만 학습·검증 데이터를 나누는 방식보다 데이터 분할에 따른 우연을 줄이고, 모델의 일반화 성능을 더 안정적으로 확인할 수 있다.


K-폴드 진행 방식

데이터를 5개 구간으로 나누는 5-Fold를 예로 들면 다음과 같다.

1회차: 1번 검증 / 나머지 학습
2회차: 2번 검증 / 나머지 학습
3회차: 3번 검증 / 나머지 학습
4회차: 4번 검증 / 나머지 학습
5회차: 5번 검증 / 나머지 학습
 

각 구간이 한 번씩 검증 데이터로 사용되며, 마지막에는 5번의 평가 점수를 평균 내어 최종 성능으로 사용한다.


장점

  • 모든 데이터를 학습과 검증에 활용할 수 있음
  • 데이터 분할에 따른 성능 편차를 줄일 수 있음
  • 모델 간 성능 비교와 하이퍼파라미터 튜닝에 유용함

단점

  • 모델을 K번 반복 학습하므로 시간이 오래 걸림
  • K값이 커질수록 계산량이 증가함
  • 시계열 데이터에는 일반 K-Fold를 그대로 사용하기 어려움

분류 문제에서는 Stratified K-Fold

분류 데이터의 클래스 비율이 불균형하다면 일반 K-Fold보다 Stratified K-Fold를 사용하는 것이 좋다.

Stratified K-Fold는 각 폴드에서 타깃 클래스의 비율이 원본 데이터와 비슷하게 유지되도록 분할한다.

예를 들어 전체 데이터의 결제 고객 비율이 10%라면, 각 폴드에서도 결제 고객 비율이 약 10%가 되도록 나눈다.


파이썬 예시

 
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(
    random_state=42
)

scores = cross_val_score(
    model,
    X,
    y,
    cv=5,
    scoring="f1"
)

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

K값 선택 시 고려사항

K값은 일반적으로 5 또는 10을 많이 사용한다.

K값특징
K가 작음 학습 데이터가 줄어 평가 편향이 커질 수 있지만 계산 속도가 빠름
K가 큼 더 많은 데이터를 학습에 사용해 안정적인 평가가 가능하지만 계산량이 증가함

데이터가 충분히 많다면 보통 K=5를 사용하고, 데이터가 비교적 적고 더 안정적인 평가가 필요하다면 K=10을 고려할 수 있다.

다만 K가 너무 크면 각 폴드의 검증 데이터가 지나치게 적어지고 학습 시간이 길어질 수 있다. 특히 데이터 수만큼 폴드를 나누는 Leave-One-Out 방식은 계산 비용이 매우 크고 평가 결과의 변동성도 커질 수 있다.

분류 문제에서는 K값뿐 아니라 각 폴드에 모든 클래스가 충분히 포함되는지도 확인해야 한다. 예를 들어 소수 클래스 데이터가 5개뿐이라면 K=10은 사용할 수 없으며, K는 소수 클래스의 데이터 수보다 크지 않게 설정해야 한다.


주의할 점

교차 검증 과정에서도 결측치 대체, 스케일링, 인코딩 같은 전처리는 각 학습 폴드에서만 학습해야 한다.

전체 데이터를 먼저 전처리하면 검증 데이터의 정보가 학습 과정에 포함되는 데이터 누수가 발생할 수 있다.

이 문제를 방지하려면 Scikit-learn의 Pipeline을 사용하는 것이 좋다.

 


정리

K-폴드 교차 검증은 데이터를 K개로 나누어 학습과 검증을 반복하고, 여러 평가 점수의 평균으로 모델 성능을 판단하는 방법이다.

일반적인 분류 문제에서는 클래스 비율을 유지하는 Stratified K-Fold를 자주 사용한다.

'Data Analysis > 머신러닝' 카테고리의 다른 글

부스팅  (0) 2026.07.31
결정트리  (0) 2026.07.31
편향과 분산  (0) 2026.07.31
손실함수  (0) 2026.07.31
지도학습과 비지도학습  (0) 2026.07.31