reference : https://angeloyeo.github.io/2020/08/05/ROC.html
FPR이 변할때 TPR이 어떻게 변하는지를 보여주는 곡선이다.(0~1 사이의 값을 가짐)
분류모델 성능 평가 시 반드시 기술해야할 사항은
모델의 정확도, 정밀도, 민감도(재현율)이 있다.
TP(True Positive) : 실제값과 예측치 모두 True
TN(True Negative) : 실제값과 예측치 모두 False
FP(False Positive) : 실제값은 False, 예측은 True
FN(False Negative) : 실제값은 True, 예측은 False
정확도(accuracy) : TP + TN / TP + FN + FP + TN
재현도(Recall) : TP / TP + FN
정밀도(Precision) : TP / TP + FP
민감도(sensitivity) : TP / TP + FN
특이도(specificity) : TN / FP + TN
조화평균(F1 Score) :
🔗 각 값에 대한 자세한 설명
🔗 참고
예제 : 50주년행사 경품 전화 / 우수고객 : 여행상품권
실제값/예측값 | 당첨 Positive | 낙첨 Nagative |
---|---|---|
당첨 True | TP : 40 | FN : 5 (기회잃음) |
낙첨 False | FP : 15 (사기당함) | TN : 40 |
accuracy : 80/100 = 80%
정밀도(Precision) : TP / TP + FP
... 40 / 55 = 72%
재현도(Recall) : TP / TP + FN
... 40 / 45 = 88%
이 예제의 경우에는 경품에 당첨되지 않았는데도 당첨 메시지가 고객에게 전달되는 경우인
정밀도의 상황(사기당함)이 더 중요하다.
make_classification
함수로 임의의 샘플 데이터를 생성했다.
#샘플100 / 독립변수2 생성
x,y = make_classification(n_samples=100, n_features=2, n_redundant=0, random_state=123)
model = LogisticRegression().fit(x,y)
y_hat = model.predict(x) #예측값
#결정/판별함수 - 판별 경계선 설정용
f_value = model.decision_function(x)
#판별,예측,실제값
df = pd.DataFrame(np.vstack([f_value,y_hat,y]).T,columns=['f','y_hat','y'])
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y, y_hat))
#[[44 4]
# [ 8 44]]
confusion_matrix
를 확인하여 정밀도, 재현도, 특이도를 수식으로 계산해보았다.
# accuracy TP + TN / 전체수
acc = (44+44)/100
# 재현도(Recall) TP / TP + FN
recall = 44 / (44+4)
# 정밀도(Precision) : TP / TP + FP
precision = 44 / (44 + 8)
# 특이도 TN / FP + TN
specificity = 44 / (44 + 8)
#위양성률
fallout = 8 / (8+44) #또는 1-특이도 (1-specificity)
accuracy : 0.88
재현도(Recall) : 0.916
정밀도(Precistion) : 0.84
특이도 : 0.84
위양성률 : 0.153
위양성률은 1-특이도 로도 계산 할 수 있다.
from sklearn import metrics
을 사용하여 정밀정확도 점수와 보고서 함수로 한번에 출력해보자
from sklearn import metrics
ac_score = metrics.accuracy_score(y, y_hat)
print(ac_score) #0.88
cl_report = metrics.classification_report(y, y_hat)
print(cl_report)
precision recall f1-score support
0 0.85 0.92 0.88 48
1 0.92 0.85 0.88 52
accuracy 0.88 100
macro avg 0.88 0.88 0.88 100
weighted avg 0.88 0.88 0.88 100
fpr, tpr, threshold = metrics.roc_curve(y,model.decision_function(x))
이제 이 결과로 ROC curve를 그려보자
#ROC 커브
plt.plot(fpr,tpr,'o-',label="Logistic Regression")
plt.plot([0,1],[0,1],'k--',label='classifier line(AUC:0.5)')
plt.plot([fallout],[recall],'ro',ms=10)
plt.xlabel('fpr')
plt.ylabel('tpr')
plt.legend()
plt.show()
print('AUC : ', metrics.auc(fpr,tpr)) #0.968