AI기록장
[ML] 머신러닝 성능 평가 지표(분류) 본문
Machine Learning Evaluation
성능 평가
→ 모델링을 할 수 있는 ML 알고리즘을 만들었다면, 실제값과 모델에 의해 예측된 값을 비교하여 두 오차를 구하는 것이다.
모델링을 하는 과정에서 목적과 목표 변수의 유형에 따라 몇가지의 다른 평가 지표를 활용하게 된다.
쉽게 말해, 내가 원하는 모델링의 목적에 맞게 알맞은 지표를 보고,오차율을 낮춰가며 좋은 성능의 모델을 만들어낼 수 있는 지표이다.
성능 평가지표는 분류모델과 회귀 모델의 평가모델이 있는데 이번에는 분류 모델의 평가지표에 대해서 다뤄볼 예정이다.
성능 평가 지표 종류
- 정확도(Accuracy)
- 오차 행렬(Confusion Matrix)
- 정밀도 (Precision)
- 재현율(Recall)
- F1-score
- ROC-AUC
정확도(Accuracy)
정확도는 '전체 데이터중에서, 정확하게 예측한 데이터의 수' 라고 이해하면 된다. 하지만, 이 지표만을 보고 완벽하게
모델이 예측을 해냈다고 생각하기에는 어렵다. 만약 데이터가 Imbalance한 경우에는 정확도 적합한 평가 지표로 사용되기에는
어려움이 있다는 것이다.
수식 : TP + TN / TP + TN + FP + FN
오차행렬(Confusion Matrix)
오차 행렬은 분류의 예측 범주와 실제 데이터의 분류 범주를 교차 표로 정리한 행렬의 형태이다.
또한, 이진 분류의 예측 오류가 얼마인지와 더불어 어떠한 유형의 예측 오류가 발생하고 있는지를 함께 보여주고 있다.
행렬의 형태는 위에 표 순서대로 나오고 있으니 참고바람
정밀도(Precision)
정밀도는 모델이 'True'로 예측한 데이터 중 실제로 'True'인 데이터를 말한다.
정밀도는 모델이 '오늘 저녁 태풍이 올것이라고 예측한 것 중, 정말로 태풍이 온 비율'이라고 생각하면된다
수식 : TP / TP + FP
재현율(Recall)
재현율은 실제로 'True'인 데이터를 모델이 'True'라고 인식한 데이터를 말한다.
재현율은 암진단 예측 모델을 모델링할 때, 중요한 지표로 사용되는데, '진짜 양성인 것들 중에서, 올바르게 양성으로 판단한 비율'을 보여주기 때문이다.
암과 같은 생명이 걸린 문제에 있어, 모델이 실제 데이터를 기준으로 얼마나 모델이 제대로 판단을 했는가를 직접적으로 알려주는 중요한 지표이다.
Cheak → 재현율과 정밀도는 서로 상반되는 관게에 놓여있으며, 어느 평가지표가 더욱이 중요하다고는 말할 수 없음
수식 : TP / TP + FN
정밀도와 재현율 같은 경우 Positive 데이터 세트의 예측 성능에 좀 더 초점을 맞춘 평가 지표이며, 분류 모델의 목적과 특성에 따라
특정 평가 지표가 더 중요하고, 원하는 결과를 만들어내는데 큰 도움이 될 수 있다.
'재현율'과 같은 경우에는 Positive한 데이터를 Negative로 잘못 판단하게되는 경우 업무에 큰지장을 줄 수 있는 상황에서
정밀도 보다 더 중요한 지표로 활용된다. 반대로 '정밀도'는 실제 Negative인 데이터를 Positive로 잘못 판단하게 되었을 때,
큰 문제가 발생되는 되는경우에 더 큰 중요한 지표로서 간주되는 것이다.
재현율과 정밀도는 TP를 높이는데 초점을 맞추고 있지만, 각기 다른 특성을 가지고 있는 평가지표로서 모델의 특성과 업무에 목적에 따라 중요도가 높은 평가지표를 참고하면되겠다. 하지만, 앞선 둘이 가지고 있는 특성들이 한쪽을 강제적으로 높이게되면, 한쪽이 떨어지게되는 'Trade-Off'관계에 있음을 알아두고, 적절하게 이용하자
F1 Score
'F1 Score'는 정밀도(Precision)와 재현율(Recall)을 결합하여 만든 지표이다. 이전의 정밀도와 재현율은 서로 상반대는 성격의 수치적 성격을 나타내고 있었지만, F1 Score는 어느한쪽에 치우치치 않는 수치를 보여주는 주요 지표이다.
F1 Score = 2*Precision *Recall / Precision + Recall
Cheak → 위 모든 평가지표들은 모두 0~1사이의 값에서 1에 가까워질 수록 좋은 성능을 의미한다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline
df= pd.read_csv("data/diabetes.csv")
df.head()
Pregnancies | Glucose | BloodPressure | SkinThickness | Insulin | BMI | DiabetesPedigreeFunction | Age | Outcome | |
---|---|---|---|---|---|---|---|---|---|
0 | 6 | 148 | 72 | 35 | 0 | 33.6 | 0.627 | 50 | 1 |
1 | 1 | 85 | 66 | 29 | 0 | 26.6 | 0.351 | 31 | 0 |
2 | 8 | 183 | 64 | 0 | 0 | 23.3 | 0.672 | 32 | 1 |
3 | 1 | 89 | 66 | 23 | 94 | 28.1 | 0.167 | 21 | 0 |
4 | 0 | 137 | 40 | 35 | 168 | 43.1 | 2.288 | 33 | 1 |
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, roc_auc_score
from sklearn.metrics import f1_score, confusion_matrix
X = df.iloc[:,:-1]
y = df.iloc[:,-1]
X_train,X_test,y_train,y_test = train_test_split(X,y, test_size = 0.2, random_state = 156, stratify = y)
lr_clf = LogisticRegression(solver='liblinear')
lr_clf.fit(X_train,y_train)
pred = lr_clf.predict(X_test)
pred_proba = lr_clf.predict_proba(X_test)[:,1]
confusion = confusion_matrix(y_test, pred)
accuracy = accuracy_score(y_test,pred)
precision = precision_score(y_test,pred)
recall = recall_score(y_test,pred)
f1 = f1_score(y_test,pred)
#ROC_AUC 추가로 !
#roc_auc 같은경우에는 예측 확률을 넣어주어야함!
roc_auc = roc_auc_score(y_test, pred_proba)
print('오차행렬')
print(confusion)
print('정확도: {0:.4f}, 정밀도: {1:.4f}, 재현율: {2:.4f},\
F1: {3:.4f}, AUC:{4:.4f}'.format(accuracy, precision, recall, f1, roc_auc))
오차행렬
[[87 13]
[22 32]]
정확도: 0.7727, 정밀도: 0.7111, 재현율: 0.5926, F1: 0.6465, AUC:0.8083
(추가적으로 AOC-AUC 지표도 있으나, 추후에 다뤄보겠지만, 이전 블로그 Feature selection에도 간단한게 설명해두었다)
[참고] - 파이썬 머신러닝 완벽 가이드, https://bigdaheta.tistory.com/53
'ML > 개념정리' 카테고리의 다른 글
[ML] 앙상블 학습(Ensemble Learning) (0) | 2023.11.02 |
---|---|
[ML] 결정 트리(Decision_Tree) (1) | 2023.11.01 |
[ML] 데이터 스케일링(Data Scaling) (0) | 2023.09.11 |
[ML] 데이터 인코딩 (Label / One-Hot Encoding) (0) | 2023.09.07 |
[ML] 교차 검증(Cross Validation) 및 GridSearchCV 정리 (1) | 2023.09.07 |