Comment :
이진분류(Binary Classification) 모델의 성능을 측정하기 위해서...
- Confusion Matrix 값들; TP, TN, FP, FN
- Sensitivity(=Recall)
- Precision
- F1-Score
- Accuracy
- ROC AUC
들을 깔끔하게 출력해주는 Function을 만듦
sklearn.metrics
를 통해서 구할 수 있는 값들이지만, Cut-off Value를 지정해줄 수 있고 보기 좋게 출력해줄 수 있게끔 만든 Function!
[!] Confusion Matrix의 값들이 0이어서 zero division error
나오는거 손봐야함!
def confusion_matrix_cal(prob,
label,
cutoff_value):
"""
param prob: 모델의 예측값; NumPy Array
param label: 정답값; Pandas Series
param cutoff_value: Cut-off value
return: Confusion Matrix값, Precision, Sensitivity, F1-Score, Accuracy, ROC AUC로 이루어진 Dictionary
"""
TP = TN = FP = FN = 0
# 예측값 개수와 정답값 개수 일치여부 파악 및 전체 건수 totalcount에 할당
if len(prob) == len(label):
totalcount = len(prob)
# Cut-off value 미입력 시 0.5로 할당
if cutoff_value is None:
cutoff_value = 0.5
for idx in range(totalcount):
if label.iloc[idx] == 1:
if prob[idx] >= cutoff_value:
TP += 1
else:
FN += 1
elif label.iloc[idx] == 0:
if prob[idx] >= cutoff_value:
FP += 1
else:
TN += 1
sens = TP / (TP + FN)
try:
prec = TP / (TP + FP)
except:
prec = 1.0
F1 = 2*((sens*prec)/(sens+prec))
acc = (TP+TN) / (TP+FP+FN+TN)
ROC_AUC = metrics.roc_auc_score(label.fillna(0), prob). # sklearn.metics 사용
dic = {"TP" : TP,
"TN" : TN,
"FP" : FP,
"FN" : FN,
"Sensitivity" : sens,
"Precision" : prec,
"F1-Score" : F1,
"Accuracy" : acc,
"ROC AUC" : ROC_ACU}
return dic