codestates / codestates/ds-blog
[오예은] ROC curve와 AUC 이해하기
- Dominant language
- No language data
- Stars
- 2
- Forks
- 4
- PR merge metrics
- No merged PRs in 30d
Description
우리가 병원에 가서 어떤 질병에 관한 검사를 받았을 때, 의사 선생님이 내 검사 결과를 보고 양성으로 판단하는 기준은 어떻게 정할까요?
어떤 자료들을 통해서 특정 결과로 분류(예측)하는 일은 사람에게도 어렵지만, 최근 학습을 시작한 기계에게도 쉬운 일은 아닐 것입니다. 오늘은 기계학습(머신러닝)에서 이런 기준점을 찾아서 더 잘 분류하게끔 만드는 방법을 소개하고자 합니다.
바로 ROC curve를 활용하는 것입니다.
##
### ROC 란?
ROC는 Receiver Operating Characteristic의 약자입니다. 신호탐지이론에서 적중확률(Y축,True Positive Rate, Sensitivity) 대 오경보확률(X축, False Positive Rate, 1- Specificity)의 그래프를 말한다고 하는데, 우리는 이진분류기의 성능을 측정하는데 사용되는 ROC curve를 살펴보려고 합니다.
ROC curve를 이해하려면 몇 가지 개념을 알아야 합니다. Confusion matrix를 통해서 알아보겠습니다.
### Confusion Matrix
우리는 학습을 통해서 모델이 얼마나 예측을 잘 하는지 평가하기 위해 confusion matrix를 활용합니다.
Confusion matrix는 특히 이진분류 모델에서 자주 활용되고 있는데요,
예측값과 실제값을 비교해서 각 영역에 해당하는 비율이 어느정도 되는지를 보는 것입니다.

이 매트릭스에 표기된 TP / TN / FP / FN는 아래와 같은 의미를 뜻합니다.
- **True vs. False** : 예측값이 실제 값인지에 대한 여부 (맞췄으면 True! 틀렸으면 False..)
- **Positive vs. Negative** : 예측했던 값 (양성/긍정/해당이면 Positive, 음성/부정/미해당이면 Negative)
-> 따라서
**TP는 양성으로 예측하고 실제 양성일 때,
TN은 음성으로 예측했고 실제 음성일 때,
FP는 양성으로 예측했지만 실제 음성일 때,
FN은 음성으로 예측했지만 실제 음성일 때**를 의미한다고 볼 수 있습니다.
(TMI) 이를 가지고 precision(정밀도), recall(재현율)과 같은 성능평가지표도 구할 수 있습니다.
상황에 맞게 precision과 recall의 중요도(우선순위)를 조정하여 모델을 만들기도 하지요.
그렇다면 이번엔, 지금 알아본 Confusion Matrix에 등장한 개념들이 ROC에서 어떻게 쓰이는지 알아보도록 하겠습니다.
## ROC curve 이해하기(그래프)

`[이미지: https://www.statisticshowto.com/wp-content/uploads/2016/08/ROC-curve.png]`
ROC 곡선 그래프는 위에서 언급했던 것처럼 True Positive Rate를 Y축, False Positive Rate를 X축으로 하여 모델이 양성/긍정으로 예측했을 때 얼마나 잘 맞추고 있는지를 설명한 것입니다. 우리는 ROC 곡선을 통해 모델의 성능을 평가하거나 최적의 분류기준(threshold)을 찾을 수 있습니다.
그래프에서 왼쪽 하단(0,0)은 모두 0(음성/부정)이라고 예측한 경우, 오른쪽 상단(1,1)은 모두 1(양성/긍정)이라고 예측한 경우를 말하며, 그래프의 왼쪽 상단(0,1)은 잘못 예측한 것(FPR) 없이 모두 맞춘경우로 완벽한 모델인 경우를 말합니다.
그래프를 보시면, 중앙을 가로지르는 쭉 뻗은 직선 위쪽으로 곡선 2개가 있는 것이 보이는데 중앙의 검정색 직선이 랜덤하게 추정한 선을 의미합니다. 그리고 파란선, 빨간 선이 각 모델에 대한 예측결과를 표시한 선인데 서로 휘어짐 정도가 다른 것을 볼 수 있습니다. 어떤 것이 더 성능이 좋을까요?
네, 앞에 설명했던 것처럼 왼쪽 상단에 더 가까이 가 있는 파란색 선이 더 잘 예측하는 모델이라고 볼 수 있습니다.
이 그래프에서 예측 성능을 알아보기 위한 다른 방법으로는 AUC라는 지표가 있는데요, AUC가 무엇인지 알아보겠습니다.
### AUC란?
AUC는 Area under the Curve의 약자로 ROC curve 아래쪽의 면적을 말하는데, 판정선이 얼마나 민감한지(신뢰할만한지/안정적인지)를 나타냅니다. 앞서 ROC curve가 왼쪽 상단(0,1) 방향으로 더 휘어질 수록 예측성능이 뛰어난 모델이라고 얘기했는데, 이는 곧 AUC가 클 수록 예측을 잘하는 모델이라는 말과 일맥상통합니다.
그렇다면, ROC curve가 어떻게 그려지는지 실제 데이터를 통해 봅시다.
### ROC curve 이해하기(예시)
- 본 예시는 파이썬과 사이킷런에서 제공하는 roc_curve, roc_auc_score 라이브러리를 활용하였습니다.
#### 1. 예측한 모델의 예측률을 산출하여 오름차순으로 정렬합니다.
```py
# 파이프라인 만들고 학습
pipe = make_pipeline(
OrdinalEncoder(),
SimpleImputer(),
RandomForestClassifier(n_estimators=estimator[i], random_state=10, max_depth=14, n_jobs=-1, oob_score=True)
) model = pipe.fit(X_train, y_train)
y_pred = model.predict(X_val)
# 예측률 예산
y_pred_proba = pipe.predict_proba(X_val)[:, 1]
# 실제값과 예측률 DataFrame 만들고 오름차순 정렬
pred_proba = pd.DataFrame({
'y_val': y_val,
'pred_proba': y_pred_proba})
pred_proba.sort_values(by='pred_proba', ascending=True)
```

pred_proba라는 데이터 프레임을 통해 실제 값과 모델이 예측했던 예측률을 비교할 수 있습니다.
표의 일부만 출력되어 양 극단의 데이터만 표시되었지만, 상단부에 보면 예측률(pred_proba)이 0.004 이하일때 실제값이 모두 0이었으며, 예측률이 0.92이상일 경우 실제값이 1이라는 것을 알 수 있습니다.
#### 2. 이 예측률 데이터를 가지고 ROC curve 그래프를 그립니다.
```py
from sklearn.metrics import roc_curve, roc_auc_score
import numpy as np
# roc_curve(타겟값, prob of 1) 그래프 그리기
fpr, tpr, thresholds = roc_curve(y_val, y_pred_proba)
roc = pd.DataFrame({
'FPR(Fall-out)': fpr,
'TPRate(Recall)': tpr,
'Threshold': thresholds
})
plt.scatter(fpr, tpr)
plt.title('model 1 ROC curve')
plt.xlabel('FPR(Fall-out)')
plt.ylabel('TPR(Recall)');
optimal_idx = np.argmax(tpr - fpr)
optimal_threshold = thresholds[optimal_idx]
```

그래프의 파란 점들이 이루는 선이 ROC curve입니다.
#### 3. 최적의 threshold를 확인해보고, AUC가 얼마나 되는지 구합니다.
```py
# 최적의 threshold 구하기
print('idx:', optimal_idx, ', threshold:', optimal_threshold)
# AUC 면적 구하기
auc_score = roc_auc_score(y_val, y_pred_proba)
print('AUC:', auc_score)
```

최적의 threshold를 구해보니 0.251을 경계로 0과 1, 즉 양성(긍정)과 음성(부정)을 나눌 때 모델이 가장 잘 예측할 수 있다고 나왔습니다. 그렇게 했을 때 이 모델의 AUC는 85%정도로 어느정도 괜찮은 예측 성능을 보인다고 할 수 있겠습니다.
마지막으로 ROC curve에 대해서 한장으로 잘 요약해준 그림을 보여드리며 마무리 하겠습니다.
#### 참고) ROC curve에 대한 한장 요약 그림

`[이미지: https://storage.ning.com/topology/rest/1.0/file/get/1341805045?profile=RESIZE_710x]`
#### 참고사이트
- [위키백과](https://ko.wikipedia.org/wiki/%EC%88%98%EC%8B%A0%EC%9E%90_%EC%A1%B0%EC%9E%91_%ED%8A%B9%EC%84%B1)
- [공돌이의 수학정리노트](https://angeloyeo.github.io/2020/08/05/ROC.html)
- [Statistics How To](https://www.statisticshowto.com/receiver-operating-characteristic-roc-curve)
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.