
교차 검증(Cross-validation)은 모델의 성능을 평가하는 방법으로, 데이터를 훈련 데이터와 테스트 데이터로 여러 번 나누어 평가하는 기법입니다. 이를 통해 모델의 과적합을 방지하고, 모델이 새로운 데이터에 대해 얼마나 일반화할 수 있는지를 평가할 수 있습니다.
K-폴드 교차 검증은 가장 널리 쓰이는 교차 검증 방법입니다. 데이터를 K개의 "폴드(fold)"로 나누고, 각 폴드에 대해 한 번씩 모델을 훈련 및 평가하여 K번의 평가 점수를 평균냅니다.
과정:
장점: 훈련/테스트 데이터 분할에 의한 편향을 줄일 수 있습니다.
단점: K번 훈련과 평가를 해야 하므로 계산 비용이 증가할 수 있습니다.
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()}")
Stratified K-Fold는 분류(classification) 문제에서 주로 사용됩니다. 이 방법은 각 폴드에 데이터가 동일한 비율로 분포되도록 하여 클래스 불균형 문제를 해결하는 데 효과적입니다.
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()}")
Leave-One-Out(LOO) 교차 검증은 K-Fold 교차 검증에서 K를 데이터 샘플 수와 동일하게 설정한 경우입니다. 즉, 매번 하나의 샘플만 테스트 세트로 사용하고, 나머지 모든 샘플을 훈련 세트로 사용합니다.
시계열 데이터의 경우 시간적 순서가 있기 때문에 일반적인 교차 검증은 적합하지 않을 수 있습니다. 데이터를 섞어서 훈련 및 테스트를 진행할 경우, 시간 의존성이 깨져 성능 평가가 왜곡될 수 있습니다.
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]
Nested 교차 검증은 하이퍼파라미터 튜닝을 포함한 모델 평가를 할 때 사용됩니다. 하이퍼파라미터 최적화를 위해 내부적으로 또 다른 교차 검증을 수행한 후, 외부 교차 검증을 통해 모델 성능을 평가합니다.
교차 검증은 모델을 훈련하고 테스트할 때 과적합을 방지하고 일반화 성능을 평가하는 중요한 방법입니다. 데이터와 문제 특성에 맞는 교차 검증 기법을 선택하여 사용해야 합니다.