머신 러닝 모델의 성능을 객관적으로 측정하고 비교하는 과정에서 사용
이를 통해 모델의 강점과 약점을 파악
성능 평가에 사용되는 지표를 metric이라고 함
Metric에는 다양한 종류가 있으며
각각의 지표가 제공하는 정보가 다름
• 목적에 맞는 올바른 metric을 선택해야 함
• 또는 해석이 잘 되는 metric!
풀고자 하는 문제에 딱 맞는 metric이 존재하지만
적지 않은 경우로 적절한 metric이 없을 수 있음
• 예를 들어, 고객이 만족하는 텍스트 prompt 기반 이미지 생성 모델의 성능은???
• 특히 비지도 학습의 경우 문제의 목적에 딱 fit한 metric을 찾기 어려움
원초적이지만 시각화도 좋은 방법!
분류 문제에서 모델의 성능을 이해하고 해석하기 위한 중요한 도구
실제 레이블과 예측 레이블을 비교해 모델의 성능을 시각적으로 표현한 행렬

이진 분류 문제에서 널리 사용되는 모델 성능 측정 도구
양성(positive)과 음성(negative)를 나누는 임계값의 변화에 따른 성능을 시각화 한 그래프
• 성능은 아래의 두 파라미터를 사용



ROC커브의 아래쪽 면적을 AUC 라고한다.

음성과 양성을 잘 구분할수록 좋은 분류기!


아래와 같은 분류기를 만들었다고 하자

이후 Confusion Matrix를 만들어줌.
from sklearn.metrics import confusion_matrix
y_pred = logistic_reg.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
# 혼동 행렬 시각화
plt.figure(figsize=(6, 6))
plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)
plt.colorbar()
tick_marks = np.arange(2)
plt.xticks(tick_marks, ['Predicted Negative', 'Predicted Positive'])
plt.yticks(tick_marks, ['Actual Negative', 'Actual Positive'])
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.title('Confusion Matrix with Labels')
labels = ['TN', 'FP', 'FN', 'TP']
label_values = [cm[0, 0], cm[0, 1], cm[1, 0], cm[1, 1]]
label_colors = ['white', 'black', 'black', 'white']
indices = [(0, 0), (0, 1), (1, 0), (1, 1)]
for label, value, color, (i, j) in zip(labels, label_values, label_colors, indices):
plt.text(j, i, f'{label}\n{value}', ha='center', va='center', color=color)
plt.show()
from sklearn.metrics import roc_curve
# 각 데이터가 양성일 확률, 양성만 취할 예정이므로 1 위치의 값만 가져옴
y_pred_proba = logistic_reg.predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
# ROC 커브 시각화
plt.plot(fpr, tpr, color='orange', label=f'ROC curve')
plt.plot([0, 1], [0, 1], color='navy', linestyle='--') # y=x 직선
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.show()

잘만들어진 모습을 볼 수 있다.
이제 여기서 제일 괜찮은 스레쉬 홀드 위치를 찾자면!
# 최적 threshold 위치 찾기
# tpr은 크고 fpr은 작아야하므로 아래와 같은 코드로 위치를 선정
closest_leftupper_conner = np.argmin(np.abs(tpr - 1) + fpr)
optimal_threshold = thresholds[closest_leftupper_conner]
print(f'가장 좌측 상단에 위치한 포인트의 threshold 값 : {optimal_threshold}')
출력값:
가장 좌측 상단에 위치한 포인트의 threshold 값 : 0.6006122864959837
AUC또한 구해볼 수 있음.
from sklearn.metrics import auc
roc_auc = auc(fpr, tpr)
print(f'ROC 커브로부터 구한 AUC : {roc_auc}')
출력값:
ROC 커브로부터 구한 AUC : 0.9768
회귀 모델의 성능을 평가하는 통계적 지표
• 결정 계수(Coefficient of Determination)라고도 함



R^2값은 클 수록 좋음.
하지만! 과적합의 위험성을 주의해야 함

모델에 아래와 같은 회귀선을 그었다.

from sklearn.metrics import r2_score
r2 = r2_score(y, y_pred)
print(f'R² 값 : {r2:.4f}')
출력값:
R² 값 : 0.8278
즉, 아래의 평균선 대비 설명력이 어느정도 있는지 수치화.