교차 검증(Cross-validation)

Ryu Jihoon·2024년 9월 23일
post-thumbnail

교차 검증(Cross-validation)이란?

교차 검증(Cross-validation)은 모델의 성능을 평가하는 방법으로, 데이터를 훈련 데이터와 테스트 데이터로 여러 번 나누어 평가하는 기법입니다. 이를 통해 모델의 과적합을 방지하고, 모델이 새로운 데이터에 대해 얼마나 일반화할 수 있는지를 평가할 수 있습니다.


1. K-폴드 교차 검증(K-Fold Cross-validation)

K-폴드 교차 검증은 가장 널리 쓰이는 교차 검증 방법입니다. 데이터를 K개의 "폴드(fold)"로 나누고, 각 폴드에 대해 한 번씩 모델을 훈련 및 평가하여 K번의 평가 점수를 평균냅니다.

  • 과정:

    1. 데이터를 K개의 폴드로 나눕니다.
    2. 첫 번째 폴드를 테스트 세트로 사용하고, 나머지 K-1개의 폴드를 훈련 세트로 사용해 모델을 학습합니다.
    3. 나머지 폴드에 대해 이 과정을 반복합니다.
    4. K번의 평가 점수를 평균내어 최종 모델 성능으로 사용합니다.
  • 장점: 훈련/테스트 데이터 분할에 의한 편향을 줄일 수 있습니다.

  • 단점: K번 훈련과 평가를 해야 하므로 계산 비용이 증가할 수 있습니다.

K-Fold 교차 검증 예시 코드

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

# 모델과 데이터 준비
model = RandomForestClassifier()
X = your_features
y = your_labels

# K-Fold 교차 검증 실행 (기본적으로 K=5)
scores = cross_val_score(model, X, y, cv=5)

print(f"교차 검증 점수: {scores}")
print(f"평균 점수: {scores.mean()}")

2. Stratified K-Fold 교차 검증

Stratified K-Fold분류(classification) 문제에서 주로 사용됩니다. 이 방법은 각 폴드에 데이터가 동일한 비율로 분포되도록 하여 클래스 불균형 문제를 해결하는 데 효과적입니다.

  • 과정:
    • 데이터를 K개의 폴드로 나누되, 각 폴드에 동일한 클래스 비율을 유지합니다.
    • 각 폴드에서 교차 검증을 반복하면서 훈련 및 테스트를 진행합니다.
  • 장점: 불균형한 데이터셋에서도 각 폴드에 클래스가 고르게 분포되도록 할 수 있어, 평가가 더 정확합니다.
  • 사용 사례: 클래스가 불균형한 분류 문제에서 사용됩니다.

Stratified K-Fold 예시 코드

from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression

# 모델과 데이터 준비
model = LogisticRegression()
X = your_features
y = your_labels

# Stratified K-Fold 적용
strat_k_fold = StratifiedKFold(n_splits=5)

# 교차 검증 실행
scores = cross_val_score(model, X, y, cv=strat_k_fold)

print(f"교차 검증 평균 점수: {scores.mean()}")

3. Leave-One-Out 교차 검증 (LOO, Leave-One-Out Cross-validation)

Leave-One-Out(LOO) 교차 검증은 K-Fold 교차 검증에서 K를 데이터 샘플 수와 동일하게 설정한 경우입니다. 즉, 매번 하나의 샘플만 테스트 세트로 사용하고, 나머지 모든 샘플을 훈련 세트로 사용합니다.

  • 장점: 데이터가 매우 적을 때 적합한 방법입니다. 모든 데이터를 훈련에 사용할 수 있기 때문에 일반화 성능을 최대화할 수 있습니다.
  • 단점: 데이터의 샘플 수가 많을 경우 계산 비용이 매우 높아질 수 있습니다. 따라서 대규모 데이터셋에서는 사용하기 어려울 수 있습니다.

4. Time Series 교차 검증

시계열 데이터의 경우 시간적 순서가 있기 때문에 일반적인 교차 검증은 적합하지 않을 수 있습니다. 데이터를 섞어서 훈련 및 테스트를 진행할 경우, 시간 의존성이 깨져 성능 평가가 왜곡될 수 있습니다.

TimeSeriesSplit은 시간 순서를 보존하면서 데이터를 나누는 방법입니다. 이를 통해 훈련 데이터는 항상 테스트 데이터보다 시간상으로 앞선 데이터를 포함하게 됩니다.

TimeSeriesSplit 예시 코드

from sklearn.model_selection import TimeSeriesSplit

# 시계열 교차 검증
tscv = TimeSeriesSplit(n_splits=5)

for train_index, test_index in tscv.split(X):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
  • 사용 사례: 주로 시계열 데이터를 다루는 문제에서 사용됩니다. 예를 들어 주가 예측, 날씨 예측 등 시간 의존성이 있는 데이터에서 유용합니다.

5. Nested 교차 검증 (Nested Cross-validation)

Nested 교차 검증은 하이퍼파라미터 튜닝을 포함한 모델 평가를 할 때 사용됩니다. 하이퍼파라미터 최적화를 위해 내부적으로 또 다른 교차 검증을 수행한 후, 외부 교차 검증을 통해 모델 성능을 평가합니다.

Nested Cross-validation의 과정

  1. 외부 교차 검증을 사용하여 데이터를 나누고, 그중 하나의 폴드를 테스트 세트로 설정합니다.
  2. 내부 교차 검증에서 나머지 데이터를 훈련/검증 세트로 나누어, 최적의 하이퍼파라미터를 찾습니다.
  3. 외부 테스트 세트에 대해 성능을 평가합니다.
  4. 이 과정을 각 폴드에 대해 반복하여 최종 성능을 평가합니다.
  • 사용 사례: 모델 튜닝이 필요한 복잡한 문제에서 주로 사용되며, 하이퍼파라미터 최적화가 포함된 상황에서 신뢰할 수 있는 모델 성능 평가를 제공합니다.

6. 교차 검증의 장단점

장점

  • 훈련/테스트 분할에 따른 편향을 줄일 수 있습니다.
  • 모델의 성능을 더욱 안정적으로 평가할 수 있습니다.
  • 데이터셋이 작을 경우, 데이터를 최대한 효율적으로 사용할 수 있습니다.

단점

  • 계산 비용이 증가합니다. 특히 K-Fold 교차 검증의 경우 K번 모델을 학습시키고 평가해야 하므로 시간이 많이 걸릴 수 있습니다.
  • 시계열 데이터에는 일반적인 교차 검증 기법을 적용하기 어렵습니다. 이러한 경우 TimeSeriesSplit과 같은 방법을 사용해야 합니다.

7. 교차 검증 요약

교차 검증은 모델을 훈련하고 테스트할 때 과적합을 방지하고 일반화 성능을 평가하는 중요한 방법입니다. 데이터와 문제 특성에 맞는 교차 검증 기법을 선택하여 사용해야 합니다.

  • K-Fold 교차 검증: 데이터셋을 K개의 폴드로 나누어 평가.
  • Stratified K-Fold: 클래스 불균형 문제를 해결하기 위한 K-Fold 방식.
  • Leave-One-Out(LOO): 데이터가 적을 때 적합한 방식.
  • TimeSeriesSplit: 시계열 데이터에서 시간 순서를 유지하는 방식.
  • Nested 교차 검증: 하이퍼파라미터 튜닝을 포함한 모델 평가에 사용.
profile
CSE Junior

0개의 댓글