본문 바로가기
프로그래밍/Scikit-Learn

[Scikit-Learn] 22. ROC 곡선과 AUC (feat. roc_score, RocCurveDisplay, roc_auc_score, auc)

by 부자 꽁냥이 2023. 2. 2.

ROC(Receiver Operating Characteristic) 곡선과 AUC(Area Under the Curve)은 2 분류 예측 모형의 성능을 평가할 때 사용된다. Scikit-Learn(sklearn)에서는 ROC 곡선을 그리고 AUC 값을 계산할 수 있는 함수를 제공하는데 roc_score, RocCurveDisplay, roc_auc_score, auc, 가 오늘의 주인공이다. 이번 포스팅에서는  roc_score, RocCurveDisplay, roc_auc_score, auc의 사용법을 알아보고자 한다.

 

ROC 곡선과 AUC에 대한 개념이 궁금하면 아래 포스팅을 참고하면 된다.

34. ROC(Receiver Operating Characteristic) 곡선과 AUC(Area Under the Cuve)에 대해서 알아보자 with Python

 

34. ROC(Receiver Operating Characteristic) 곡선과 AUC(Area Under the Cuve)에 대해서 알아보자 with Python

이번 포스팅에서는 머신러닝 예측 모형 간 성능을 시각적으로 비교해 볼 수 있는 방법으로 ROC(Receiver Operating Characteristic) 곡선과 AUC(Area Under the Cuve)에 대한 개념을 알아보고 이를 파이썬(Python)으

zephyrus1111.tistory.com


   ROC 곡선과 AUC

1) ROC 곡선 그리기

a. roc_score

roc_score는 기본적으로 실제 라벨과 Positive 라벨 예측 확률로 이루어진 배열을 넣어준다. 또한 기존 0, 1 또는 -1, 1 이외의 범주로 설정되어 있다면 pos_label을 통해 Positive 라벨을 지정할 수 있다. 이를 통하여 roc_score는 차례대로 False Positive Rate, True Positive Rate(민감도 Sensitivity, 재현율 Recall), 그리고 절단값 배열을 리턴한다.

 

사용법을 살펴보자. 여기에서는 유방암 데이터를 이용하여 랜덤포레스트, AdaBoost 모형의 성능을 비교하고자 한다. ROC 곡선은 Matplotlib을 이용하여 False Positive Rate를 x축, True Positive Rate를 y축으로 설정하여 그릴 수 있다.

 

from sklearn.metrics import roc_curve, roc_auc_score, auc, RocCurveDisplay
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier

bc = load_breast_cancer()
X = bc.data
y = bc.target

## 분류기 학습
clf1 = RandomForestClassifier(n_estimators=30, max_depth=2, random_state=20).fit(X, y)
clf2 = AdaBoostClassifier(n_estimators=30, base_estimator=DecisionTreeClassifier(max_depth=2),
                          random_state=20).fit(X, y)

## Positive 확률값 계산
score1 = clf1.predict_proba(X)[:, 1]
score2 = clf2.predict_proba(X)[:, 1]

## False Positive Rate, True Positive Rate, 절단값 리턴
fpr1, tpr1, cut1 = roc_curve(y, score1)
fpr2, tpr2, cut2 = roc_curve(y, score2)

## ROC 곡선 그리기
fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')
ax = fig.add_subplot()
ax.plot(fpr1, tpr1, label='RF')
ax.plot(fpr2, tpr2, label='AdaBoost')
ax.plot([0, 1], [0, 1], color='red', label='Random Model')
ax.legend()
plt.show()

 

b. RocCurveDisplay

앞에서는 roc_curve를 이용하여 ROC 곡선 그리기에 필요한 값들을 리턴해서 Matplotlib으로 그렸는데 RocCurveDisplay를 이용하면 바로 그릴 수 있다. RocCurveDisplay.from_estimator에 학습된 분류기, X 데이터 행렬, 실제 라벨, 그리고 필요하다면 ax인자에 Matplotlib 좌표축을 지정한다.

 

fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')
ax = fig.add_subplot()
RocCurveDisplay.from_estimator(clf1, X, y, ax=ax)
RocCurveDisplay.from_estimator(clf2, X, y, ax=ax)
ax.plot([0, 1], [0, 1], color='red', label='Random Model')
ax.legend()
plt.show()

 


2) AUC 값 계산하기

roc_auc_score, auc

roc_auc_score와 auc는 모두 AUC 값을 계산한다. 차이점은 들어가는 인자인데 roc_auc_score는 실제 라벨과 Positive 예측 확률 배열이 들어가고 auc는 False Positive Rate와 True Positive Rate 배열이 들어간다는 차이점이 있다.

 

## Positive 확률값 계산
score1 = clf1.predict_proba(X)[:, 1]
score2 = clf2.predict_proba(X)[:, 1]

## False Positive Rate, True Positive Rate, 절단값 리턴
fpr1, tpr1, cut1 = roc_curve(y, score1)
fpr2, tpr2, cut2 = roc_curve(y, score2)

print('roc_auc_score')
print('RF', roc_auc_score(y, score1))
print('AdaBoost', roc_auc_score(y, score2))
print()
print('auc')
print('RF', auc(fpr1, tpr1))
print('AdaBoost', auc(fpr2, tpr2))

 

 

결과가 동일하게 나온다. 다만 특정 경우에는 값이 아주 조금씩 달라지는 경우가 있긴 하다. 왜 그런지는 모르겠다. 


댓글


맨 위로