Basic

[Backend][Basic] 머신러닝/딥러닝 모델 성능 평가

천재단미 2025. 3. 25. 10:00
728x90
반응형

 

 

 

모델을 만들고 나면 가장 중요한 단계가 남아 있습니다.

바로 성능 평가입니다.

"모델이 잘 되네?"라는 직관적인 판단만으로는 부족합니다. 실제 데이터에 얼마나 잘 맞는지, 일반화할 수 있는지를 객관적인 지표로 확인해야 합니다.

이 글에서는 문제 유형별로 어떤 평가 지표(metric) 를 사용해야 하는지, 그리고 성능 평가를 어떻게 하면 더 신뢰도 있게 할 수 있는지 예시와 함께 정리합니다.

 


1. 회귀(Regression) 모델의 평가 지표

회귀 문제는 숫자 예측입니다. 예를 들어:

  • 집값 예측
  • 내일의 기온
  • 미래의 주식 가격 등

 

MSE (Mean Squared Error) 예측 오차의 제곱 평균. 큰 오차에 더 민감합니다. (y_pred - y_true)**2을 평균
RMSE (Root Mean Squared Error) MSE에 루트를 씌운 값. 단위가 원래 데이터와 같아 해석이 쉬움. np.sqrt(mse)
MAE (Mean Absolute Error) 절대 오차의 평균. 이상치에 덜 민감해서 안정적. np.abs(y_pred - y_true).mean()
R² Score (결정계수) 1에 가까울수록 설명력이 좋음. 0 이하면 모델이 의미 없음. r2_score(y_true, y_pred)

 

예시:

from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import numpy as np

y_true = [3, 5, 2.5, 7]
y_pred = [2.5, 5, 4, 8]

mse = mean_squared_error(y_true, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)


2. 분류(Classification) 모델의 평가 지표

분류는 카테고리 예측 문제입니다. 예:

  • 이메일이 스팸인지 아닌지
  • 사진 속 동물이 고양이인지 개인지
  • 금융 거래가 정상인지 사기인지

 

Accuracy (정확도) 전체 중 맞춘 비율. 데이터가 균형 잡혔을 때 유용. (TP + TN) / 전체
Precision (정밀도) "스팸이라고 한 것 중 실제 스팸은?" TP / (TP + FP)
Recall (재현율) "전체 스팸 중에 얼마나 잘 찾았나?" TP / (TP + FN)
F1 Score 정밀도와 재현율의 조화 평균. 둘 다 중요할 때 유용. 2 * (P * R) / (P + R)
AUC-ROC 임계값 변화에 따른 민감도 vs. 특이도 곡선의 면적. 1에 가까울수록 좋음. roc_auc_score() 사용

 

예시:

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score

y_true = [0, 1, 1, 0, 1]
y_pred = [0, 1, 0, 0, 1]

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


3. 클러스터링(Clustering) 모델의 평가 지표

클러스터링은 정답(label)이 없는 문제입니다. 그래서 내부 구조로 평가합니다.

 

Silhouette Score 클러스터 내는 가까이, 클러스터 간은 멀게. 1에 가까울수록 좋음. silhouette_score()
Calinski-Harabasz Index 클러스터 간 분리도 / 내부 밀집도. 값이 클수록 좋음. calinski_harabasz_score()
Davies-Bouldin Index 클러스터 간 유사도. 값이 작을수록 좋음. davies_bouldin_score()

 

예시:

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

X, _ = make_blobs(n_samples=300, centers=3, cluster_std=0.60)
model = KMeans(n_clusters=3)
labels = model.fit_predict(X)

sil_score = silhouette_score(X, labels)


4. 교차 검증(Cross-Validation)으로 신뢰도 높이기

단일 테스트셋으로 평가하면 결과가 불안정할 수 있습니다.

그래서 K-Fold 교차 검증을 사용합니다:

  • 데이터를 K개로 나눔
  • 매번 하나를 테스트셋, 나머지를 학습셋으로
  • K번 반복 후 평균 성능 측정

예시:

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

model = RandomForestClassifier()
scores = cross_val_score(model, X, y, cv=5)  # 5-Fold


실전 팁 요약

  • 분류 문제: 정확도만 보지 말고, F1AUC도 꼭 함께 보세요. 특히 데이터가 불균형할 때.
  • 회귀 문제: MAERMSE를 함께 보면 좋습니다. RMSE는 이상치에 민감합니다.
  • 모델 비교튜닝 전후: 반드시 교차 검증으로 안정성 확보하세요.
728x90
반응형
home top bottom
}