Dev.log

ROC-AUC curve 본문

카테고리 없음

ROC-AUC curve

포켓몬빵 2022. 2. 22. 22:09

본 포스팅에서는 ROC-AUC curve에 대해 포스팅 해보도록 하겠습니다. 전 포스팅에서 말씀드렸다 싶이, confusion matrix는 분류문제를 학습한 모델을 평가할 때 사용되는 지표입니다. ROC curve 역시 다양한 threshold에서 분류모델의 성능을 측정 할때 주로 사용되는 방법중 하나입니다.

 

ROC-AUC Curve

ROC는 분류 모델의 성능을 보여주는 그래프가 될 수 있습니다. 또한, ROC curve는 모델의 효율성을 민감도(sensitivity)와 특이도(specificity)를 사용하며, ROC curve의 x축은 False Positive Rate(FPR, fall-out)으로 거짓을 참이라고 잘못 예측한 수치를 나타냅니다. 그리고 y축은 True Positive Rate(TPR, sensitivity) 으로 참을 참이라고 올바르게 예측한 수치를 나타냅니다. AUC의 경우 ROC 곡선의 아랫부분을 의미합니다. ROC-AUC curve에서 중요한 것은 선 그 자체보다는 AUC라는 면적이라 생각됩니다. 앞서 말했듯, ROC curve와 x축을 이루는 면적의 넓이를 AUC(Area Under Curve)라 하는데, AUC의 값은 대게 0.5~1사이로 표기되고, 그값이 0.5면 분류를 아얘못하는 모델이고, 1이면 민감도와 특이도가 모두 100%이므로 이에 근접할수록 효율적인 모델이라 평가할 수 있습니다.

  • 50% ~ 60% = 실패한 모델
  • 60% ~ 70% = 안 좋은 모델
  • 70% ~ 80% = 양호한 모델
  • 80% ~ 90% = 좋은 모델
  • 90% ~ 99% = 훌륭한 모델
  • 100% = 완벽한 모델

 

ROC Curve 구현

이제 scikit-learn의 metrics를 통해 iris 데이터셋의 간단한 분류모델에 대해 ROC curve를 그려보도록 하겠습니다.

import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle

from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier
from sklearn.metrics import roc_auc_score

# Import some data to play with
iris = datasets.load_iris()
X = iris.data
y = iris.target

# Binarize the output
y = label_binarize(y, classes=[0, 1, 2])
n_classes = y.shape[1]

# Add noisy features to make the problem harder
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]

# shuffle and split training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)

# Learn to predict each class against the other
classifier = OneVsRestClassifier(
    svm.SVC(kernel="linear", probability=True, random_state=random_state)
)
y_score = classifier.fit(X_train, y_train).decision_function(X_test)

# Compute ROC curve and ROC area for each class
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])


plt.figure()
lw = 2
plt.plot(
    fpr[2],
    tpr[2],
    color="darkorange",
    lw=lw,
    label="ROC curve (area = %0.2f)" % roc_auc[2],
)
plt.plot([0, 1], [0, 1], color="navy", lw=lw, 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()

Comments