분류 문제의 성능 지표
모델을 평가하는 성능 지표들
- 회귀(regression): MAE, MSE, RMSE, SSE
- 분류(classification): 정확도, 정밀도, 민감도, F1 스코어, ROC 커브, 리프트 차트
- 클러스터링(clsutering): DBI, 엘보우 메서드, 실루엣 계수
추가적인 성능 지표
- 모델의 경제성
- 모델이 쓰는 데이터 양
- 모델이 용량이 작은 컴퓨터에서도 돌아가나?
분류 문제의 성능지표
혼동행렬(confusion matrix)
- 예측값이 실제값 대비 얼마나 잘 맞는지 2x2 행렬로 표햔
| 예측값(prediction) | |||
| 실제값(actual class) | 1 | 0 | |
| 1 | True Positive | False Negative | |
| 0 | False Positive | True Negative | |
True Positive(TP) : 예측값, 실제값 모두 1로 동일 (맞는 걸 맞다고 함)
True Negative(TN) : 예측값, 실제값 모두 0으로 동일 (틀린 걸 틀렸다고 함)
False Negative(FN) : 실제값 1 예측값 0 (맞는 걸 아니라고 함)
False Positive(FP) : 실제값 0 예측값 1 (틀린 걸 맞다고 함)
정확도(accuracy)
- 전체 데이터 대비 정답을 맞춘 데이터의 개수
- Accuracy = (TP + TN) / (TP + TN + FP + FN)
정밀도와 민감도
- 정밀도와 민감도는 불균일한 데이터셋을 다룰 때 유용
- 데이터에서 1와 0의 비율이 7:3 또는 3:7 이상 차이나는 상태
정밀도(precisiopn)
- 모델이 1이라고 예측했을 때 얼마나 잘 맞았을지에 대한 비율
- PRECISION(PPV) = TP / (TP + FP)
민감도(recall)
- 실제 1인 값을 가진 데이터를 모델이 얼마나 1이라고 잘 예측했는지에 대한 비율
- == 반환율, 재현율
- RECALL(TPR) = TP(TP + FN)
F1 스코어(F1 score)
- 정밀도와 민감도의 조화평균 값
F1 = 2 * (precision * recall) / (precision + recall)
예시
| 예측 | |||
| 실제 | 암환자 | 정상인 | |
| 암환자 | 2 | 7 | |
| 정상인 | 1 | 90 | |
정확도: 92/100
정밀도: 2/3
민감도: 2/9
사이킷런
from sklearn.metrics import confusion_matrix
y_true = [1, 0, 1, 1, 0, 1]
y_pred = [0, 0, 1, 1, 0, 1]
confusion_matrix(y_true, y_pred)

tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
(tn, fp, fn, tp)

import numpy as np
from sklearn.metrics import accuracy_score
y_pred = np.array([0, 1, 1, 0])
y_true = np.array([0, 1, 0, 0])
#accuracy = (y_pred[ y_pred == y_true ].size) / y_true.size
#accuracy
np.sum(y_true == y_pred) / len(y_true)

정확도 계산
주석 친 거도 같은 결과 나옴
accuracy_score(y_true, y_pred)

사이킷런 함수 써도 됨
import numpy as np
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
y_pred = np.array([0, 1, 1, 0, 1, 1, 1, 0])
y_true = np.array([0, 1, 0, 0, 0, 0, 1, 1])

정밀도, 민감도, F1 스코어도 가능