
AI모델이 발전하는 과정에서 일반적으로 처음으로 마주하는 테스크는 Classifier입니다. 그렇다면 분류기의 성능을 측정하는 방법과 그 방법들의 각각의 장단점을 알아보고자 합니다.
❓ 하나의 Class로 예측해서 99% 정확도를 가지는 모델(A)보다 여러 Class로 예측하지만 성능이 90%인 모델(B)이 있으면 A가 B보다 좋은게 아닌가요?
예를 들어 암이 있는 환자를 구분하는 모델을 만든다고 할때 99%가 정상환자의 데이터이고 1%가 암을 가진 환자라고 하면 A모델은 암을 가지고 있는 환자를 한명도 분류하지 못할 것입니다. 만약 B모델이 암을 가진 환자를 단 1명이라도 정확히 분류하면 A모델보다 가치가 큰 모델이라고 할 수 있습니다.
❓ False/True Negative/Positive가 먼가요?
예측을 4가지로 분류하여 예측한 값이 긍정인지 부정인지를 기준으로 Negative/ Positive를 구분합니다. 또한 해당 예측이 실제 값과 같으면 True 다르면 False로 구분할 수 있으며 이를 통해 모델의 예측을 4개로 분류하는 것입니다. 예를 들어 정상인 환자를 Positive라 할때 암 환자 분류기는 False Positive값을 줄이는 것이 가장 중요하다고 할 수있습니다.
Precision과 Recall의 조화 평균입니다.
그렇다면 왜 조화평균은 두 값의 비율을 고려한다고 할 수 있을까?
위와 같이 표현하면 조화 평균은 비율(r)이 1에 가까울 수록 a의 값이 클 수록 큰 값을 가짐을 확인하기 편합니다.
Receiver Operating Characteristic Curve - Area Under the Curve
True Positives Rate(Y축)와 False Postivs Rate(X축)를 그린 그래프에서 커브의 아래쪽 면적을 의미합니다.

샘플 코드
# 라이브러리 Import
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
# 예시 데이터셋 생성
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
# 데이터를 학습 세트와 테스트 세트로 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 로지스틱 회귀 모델 생성 및 학습
model = LogisticRegression()
model.fit(X_train, y_train)
# 테스트 데이터에 대한 예측 확률 계산
y_scores = model.predict_proba(X_test)[:, 1]
# ROC Curve 계산
fpr, tpr, thresholds = roc_curve(y_test, y_scores)
roc_auc = auc(fpr, tpr)
# ROC Curve 그리기
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot(fpr, thresholds, lw=2, label='thresholds')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic Example')
plt.legend(loc="lower right")
plt.show()
ROC 그리는 방법
그래프 해석
그래프 아래의 면적의 의미
1. AUC = 1: 완벽한 분류입니다. 모델이 모든 양성 샘플과 음성 샘플을 완벽하게 구분합니다.
2. **0.5 < AUC < 1**: 좋은 분류입니다. 값이 1에 가까울수록 모델의 성능이 더 좋다는 것을 의미합니다. 모델이 양성과 음성을 구분하는 데 있어서 일정 수준 이상의 성능을 보여줍니다.
3. **AUC = 0.5**: 무작위 추측입니다. 모델의 성능이 무작위로 양성 또는 음성을 선택하는 것과 동일한 수준입니다. 즉, 모델이 유용한 예측을 제공하지 못한다는 것을 의미합니다.
4. **AUC < 0.5**: 모델의 성능이 무작위 추측보다 나쁩니다. 이 경우 모델이 실제로 잘못된 예측을 하는 경향이 있음을 의미합니다.
ROC-AUC 직관적으로 이해하기
이해를 돕기 위해서 label이 종류가 2개이며 feature의 종류가 1개인 총 6개의 데이터 샘플로 예시를 만들었습니다
theshold 값에 따라 TPR, FPR을 구하면 다음과 같습니다
| Threshold 0.5 | Threshold 1.5 | Threshold 2.5 | Threshold 3.5 | Threshold 4.5 | Threshold 5.5 | Threshold 6.5 | |
|---|---|---|---|---|---|---|---|
| TPR | 1.00 | 1.00 | 1.00 | 0.67 | 0.67 | 0.33 | 0.00 |
| FPR | 1.00 | 0.67 | 0.33 | 0.33 | 0.00 | 0.00 | 0.00 |
threshold 값이 0.5일때는 모든 label을 postive라 예측하기 때문에 TPR, FPR이 1을 가집니다.
점점 threshold가 커지면서 negative로 예측하는 경우가 생기고 이때 자연럽게 FPR과 TPR이 낮아집니다. 이때 Negative 샘플에 대한 오답률(FPR)을 낮추는 동시에 Positive 샘플의 정답률(TPR)을 가능한 크게 유지하는 모델이 좋은 모델이라 할 수 있습니다.
위 조건에 가장 적합한 모델을 간단하게 판단하는 방법이 바로 ROC 커브의 아래 면적을 구하는 방법입니다.

언제 사용하면 좋을까?
클래스 불균형이 있는 경우
: 사기 탐지나 질병 진단과 같은 문제에서 양성 샘플(사기, 질병 양성)이 상대적으로 드물 경우, ROC-AUC는 모델이 어떻게 양성과 음성 샘플을 구분하는지 정확하게 평가하는 데 도움이 됩니다.
임계값의 변화에 강건한 성능 측정이 필요한 경우
:특정 임계값에 대한 성능보다 모델의 전반적인 성능을 이해하고 싶을 때 유용합니다.
진단 검사와 같이 민감도와 특이도가 모두 중요한 경우
: 의료 진단과 같은 상황에서는 양성 케이스를 놓치는 것(민감도)과 건강한 사람을 잘못 진단하는 것(특이도) 모두 중요합니다. ROC-AUC는 민감도(진짜 양성률)와 1-특이도(거짓 양성률) 사이의 관계를 종합적으로 평가합니다.
비교적 단순한 이진 분류 문제
: ROC-AUC는 이진 분류 문제에서 가장 잘 작동합니다. 다중 클래스 분류 문제에서는 일반적으로 ROC-AUC를 각 클래스에 대해 별도로 계산하거나 다른 방법을 사용해야 합니다.
그러나 모든 상황에서 ROC-AUC만을 사용하는 것은 권장되지 않습니다. 예를 들어, 거짓 양성과 거짓 음성 중 하나가 훨씬 더 큰 비용을 수반하는 경우, 또는 특정 임계값에서의 성능이 중요한 경우, ROC-AUC 외에 다른 성능 지표(예: 정밀도, 재현율, F1 점수)를 함께 고려해야 합니다.
Positive와 Negative를 설정할 때는 주어진 문제와 목표에 따라 결정됩니다. 일반적으로 양성 클래스는 주요 관심이 있는 클래스이며, 음성 클래스는 그 외의 클래스입니다. 여러 요소를 고려하여 Positive와 Negative를 선택할 수 있습니다
비즈니스 목표 및 우선순위:
분류 모델을 사용하는 목적에 따라 어떤 클래스를 양성으로 취급할지 결정할 수 있습니다. 어떤 클래스가 높은 우선순위를 가지는지 고려하고 해당 클래스를 양성으로 선택합니다.
클래스의 불균형성:
데이터셋이 양성과 음성 클래스 간에 불균형이 있을 경우, 더 적은 수의 클래스를 양성으로 선택하는 것이 좋을 수 있습니다. 이렇게 하면 정확도가 높아지지만, 클래스 불균형으로 인한 문제를 고려해야 합니다.
비용과 이익:
각각의 오류에 대한 비용이나 이익이 다를 수 있습니다. 양성과 음성의 오분류에 대한 비용을 고려하여 어떤 클래스를 양성으로 설정할지 결정할 수 있습니다.
도메인 지식:
특정 도메인에서는 특정 클래스를 양성으로 설정하는 것이 더 의미 있을 수 있습니다. 도메인 전문가의 의견을 듣고 해당 클래스를 양성으로 선택할 수 있습니다.
모델 성능 관점:
모델이 어떤 클래스를 양성으로 인식하는 것이 모델의 성능을 높이는 데 도움이 되는지 고려합니다. Precision, Recall, F1 Score 등의 metric을 통해 모델의 성능을 평가하고 적절한 클래스를 양성으로 설정할 수 있습니다.
ROC-AUC와 F1 Score에 관련된 내용은 기술 면접에서 받았던 기억이 있다. 그당시 당황해서 ROC-AUC에 대해서 대답을 못하였고 사실 대답할 정도로 심도있게 이해하려 했던 경험이 없었던 것 같다.