본문 바로가기
정보/IT 지식 정보

교차 검증과 혼동 행렬이란? 모델 성능을 제대로 평가하는 법 [1편]

by 안다니. 2026. 3. 31.
반응형
 
교차검증

 

 

K-겹 교차 검증부터 오차 행렬 해석까지, 분류 모델 평가의 기초를 코드로 익힙니다

왜 모델 평가가 중요한가?

머신러닝 모델 개발에서 정확한 성능 평가는 선택이 아닌 필수입니다. 훈련 데이터에서 높은 정확도를 보이는 모델도 실제 테스트 데이터에서는 형편없을 수 있기 때문입니다. 이를 '과적합(Overfitting)'이라 합니다.

💡 핵심 개념

훈련 정확도 ≠ 테스트 정확도. 실제 성능은 '본 적 없는 데이터'에서의 정확도로 평가해야 합니다.

이를 해결하기 위해 우리는 데이터를 여러 번 나누어 검증하고, 다양한 성능 지표를 활용합니다.

파이프라인 설계 전략

머신러닝 프로젝트의 첫 번째 단계는 데이터 전처리부터 모델 학습까지의 전체 흐름을 하나의 파이프라인으로 구성하는 것입니다. 이렇게 하면 각 단계가 체계적으로 진행되고, 모델 평가도 정확해집니다.

Wisconsin Breast Cancer 데이터셋을 기반으로 다음 파이프라인을 구성했습니다:

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline

pipe_lr = make_pipeline(
    StandardScaler(),
    PCA(n_components=2),
    LogisticRegression(random_state=1)
)

파이프라인의 각 단계:

  • StandardScaler: 특성을 표준화하여 스케일 통일
  • PCA: 차원 축소로 계산 효율성 증대
  • LogisticRegression: 이진 분류 모델

K-겹 교차 검증 실전

K-겹 교차 검증(K-Fold Cross-Validation)은 데이터를 K개의 동일한 부분으로 나누어, 각각을 한 번씩 테스트 세트로 사용하는 검증 기법입니다. 이렇게 하면 모든 데이터를 최대한 활용하면서도 검증의 신뢰도를 높일 수 있습니다.

StratifiedKFold로 수동 구현

먼저 K-겹 교차 검증의 원리를 이해하기 위해 수동으로 구현해봅시다:

from sklearn.model_selection import StratifiedKFold
import numpy as np

kfold = StratifiedKFold(n_splits=10).split(X_train, y_train)
scores = []

for k, (train, test) in enumerate(kfold):
    pipe_lr.fit(X_train[train], y_train[train])
    score = pipe_lr.score(X_train[test], y_train[test])
    scores.append(score)
    print(f'Fold {k+1}: {score:.3f}')

cross_val_score로 간단히 구현

실무에서는 sklearn의 cross_val_score를 사용하면 훨씬 간편합니다:

from sklearn.model_selection import cross_val_score

scores = cross_val_score(
    estimator=pipe_lr,
    X=X_train,
    y=y_train,
    cv=10,
    n_jobs=-1
)

print('CV 정확도: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))

🔍 출력 예시

CV 정확도: 0.962 +/- 0.014

10개 폴드에서 평균 96.2% 정확도, 표준편차는 1.4%

혼동 행렬 해석하기

혼동 행렬(Confusion Matrix)은 분류 모델이 예측한 결과를 실제 값과 비교하여 4가지 경우를 나타내는 표입니다:

  • TP (True Positive): 양성을 양성으로 올바르게 예측
  • TN (True Negative): 음성을 음성으로 올바르게 예측
  • FP (False Positive): 음성을 양성으로 잘못 예측 (거짓 양성)
  • FN (False Negative): 양성을 음성으로 잘못 예측 (거짓 음성)
from sklearn.svm import SVC
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

pipe_svc = make_pipeline(StandardScaler(), SVC(random_state=1))
pipe_svc.fit(X_train, y_train)
y_pred = pipe_svc.predict(X_test)

confmat = confusion_matrix(y_true=y_test, y_pred=y_pred)
print(confmat)

# 행렬 시각화
ConfusionMatrixDisplay.from_estimator(pipe_svc, X_test, y_test)

💡 해석 팁

혼동 행렬의 대각선 원소(TP, TN)가 클수록 좋고, 비대각선 원소(FP, FN)가 작을수록 좋습니다. 특히 의료 진단처럼 거짓 음성이 위험한 경우, FN을 최소화하는 것이 중요합니다.

정밀도, 재현율, F1 점수

혼동 행렬에서 도출되는 주요 성능 지표들입니다:

  • 정밀도(Precision) = TP / (TP + FP): 양성으로 예측한 것 중 실제 양성의 비율
  • 재현율(Recall) = TP / (TP + FN): 실제 양성 중 올바르게 예측한 비율
  • F1 점수: 정밀도와 재현율의 조화평균
from sklearn.metrics import precision_score, recall_score, f1_score

precision = precision_score(y_true=y_test, y_pred=y_pred)
recall = recall_score(y_true=y_test, y_pred=y_pred)
f1 = f1_score(y_true=y_test, y_pred=y_pred)

print('정밀도: %.3f' % precision)
print('재현율: %.3f' % recall)
print('F1: %.3f' % f1)

📌 이번 포스트의 핵심 요약

  • K-겹 교차 검증으로 모델의 일반화 능력 평가
  • 혼동 행렬로 분류 오류의 유형 파악
  • 정밀도와 재현율로 비즈니스 목표에 맞는 모델 선택

📚 시리즈 네비게이션

현재 글: 1편 - 교차 검증과 혼동 행렬

2편 - ROC 곡선과 PR 곡선 →

3편 - GridSearchCV와 하이퍼파라미터 튜닝 →

시리즈명: 머신러닝 실전 완전 정복

반응형

댓글