sklearn.metrics 모듈
문제: 양성 지표만 확인 X / 불균형 데이터: 평가지표 X(if 양성:음성 = 1:9 > 모두 음성: 정확도 90% but, ㅌ)
이미지를 0 ~ 9 로 분류하는 문제를 위한 데이터셋 ===> 9와 나머지 숫자로 분류하는 데이터셋으로 변환 => 이 숫자가 9야?
from sklearn.dummy import DummyClassifier
from sklearn.metrics import accuracy_score
#dummy 모델 생성
d_model = DummyClassifier(strategy='most_frequent') #y(정답)의 최빈값을 결과로 출력
#dummy 모델 학습
d_model.fit(X_train, y_train) #y의 최빈값을 찾는다.
#dummy 모델 추론
pred_train = d_model.predict(X_train) # y_train의 최빈값으로 추정
pred_test = d_model.predict(X_test)
# 정확도
accuracy_score(y_train, pred_train), accuracy_score(y_test, pred_test)
불균형 데이터 : 정확도 > 문제
#
import matplotlib.pyplot as plt
from sklearn.metrics import (confusion_matrix, ConfusionMatrixDisplay, recall_score, accuracy_score,
precision_score, f1_score) #>> 여러줄에 할꺼면 ()묶어야함
#
result_cm_1 = confusion_matrix(y_train, pred_train)
result_cm_2 = confusion_matrix(y_test,pred_test)
#
disp = ConfusionMatrixDisplay(result_cm_1, # confusion_matrix 계산한 배열
display_labels=['Not 9', '9']) #0,1의 ticks 라벨을 변경
disp.plot(cmap='Blues')
plt.show()
#
plt.figure(figsize=(4,4))
ax = plt.gca() #크기 줄이기 위해서 준거?
disp2 = ConfusionMatrixDisplay(result_cm_2, # confusion_matrix 계산한 배열
display_labels=['0~8', '9']) #0,1의 ticks 라벨을 변경
disp2.plot(cmap='Reds', ax=ax)
plt.title('test set 혼동행렬')
plt.show()
#
print('Accuracy')
accuracy_score(y_train, pred_train), accuracy_score(y_test, pred_test)
#
print('Recall')
recall_score(y_train,pred_train), recall_score(y_test, pred_test)
#
print('Precision')
precision_score(y_train,pred_train), precision_score(y_test, pred_test)
# 경고 이유 > 0/ 0+0
#
print('f1-score')
f1_score(y_train,pred_train), f1_score(y_test, pred_test)
| Predicted(예측) | |||
|---|---|---|---|
| Negative(0) | Positive(1) | ||
| Actual(실제) | Negative(0) | TN(True Negative) | FP(False Positive) |
| Positive(1) | FN(False Negative) | TP(True Positive) |
Recall/Sensitivity(재현율/민감도)
- 양성이라고 답한 것 중 양성을 맞게 예측한 것 비율
- TPR
- TP / TP + FN
- recall_score(y 실제값, y 예측값)
Precision(정밀도)
- 양성이 정답인 것 중 맞춘 양성 비율
- PPV
- TP / FP + TP
- precision_score(y 실제값, y 예측값)
F1 점수
- 정밀도와 재현율의 조화평균 점수
- recall과 precision이 비슷할 수록 높은 값을 가지게 된다. F1 score가 높다는 것은 recall과 precision이 한쪽으로 치우쳐저 있이 않고 둘다 좋다고 판단할 수 있는 근거가 된다.
- 2 ( Recall Precision / Recall + Precision)
from sklearn.metrics import classification_report
result = classification_report(y_train, pred_train_tree)
print(type(result))
print(result)
precision recall f1-score support
0 0.98 0.96 0.97 1212 # 0을 positive로 했을 때 각 지표
1 0.71 0.80 0.75 135 # 1을 positive로 했을 때 각 지표
accuracy 0.95 1347
macro avg 0.84 0.88 0.86 1347
weighted avg 0.95 0.95 0.95 1347