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
실전 팁 요약
- 분류 문제: 정확도만 보지 말고, F1과 AUC도 꼭 함께 보세요. 특히 데이터가 불균형할 때.
- 회귀 문제: MAE와 RMSE를 함께 보면 좋습니다. RMSE는 이상치에 민감합니다.
- 모델 비교나 튜닝 전후: 반드시 교차 검증으로 안정성 확보하세요.
728x90
반응형
'Basic' 카테고리의 다른 글
[Backend][Basic] AWS에서 서비스 배포 및 관리: Lambda, EC2, RDS, S3와 Auto Scaling, ELB 활용 (0) | 2025.03.31 |
---|---|
[Backend][Basic] 과적합으로 인한 성능 저하? 오차 줄이는 실전 전략 (0) | 2025.03.25 |
[Backend][Basic] 자바 메모리 구조와 가비지 컬렉션 완벽 정리 (0) | 2025.03.24 |
[Backend][Basic] 대규모 언어 모델(LLM) 완벽 가이드 (0) | 2025.03.21 |
[Backend][Basic] REST API와 JWT 인증, AWS EC2를 이용한 배포 과정 완벽 가이드 (2) | 2025.03.19 |