평가지표

김혜인·2023년 5월 17일

머신러닝

목록 보기
5/11

모델 평가

분류와 회귀의 평가방법

분류 평가 지표

  1. 정확도 (Accuracy)
  2. 정밀도 (Precision)
  3. 재현률 (Recall)
  4. F1점수 (F1 Score)
  5. PR Curve, AP score
  6. ROC, AUC score

회귀 평가 방법

  1. MSE (Mean Squared Error)
  2. RMSE (Root Mean Squared Error)
  3. R2R^2 (결정계수)

sklearn.metrics 모듈

분류 평가 지표

다중 분류(Multi class classification)

  • 개 or 고양이 or 코끼리?

이진 분류(Binary classification)

  • 개 or not? (맞는지 아닌지)
  • 이진 분류 양성(Positive)과 음성(Negative)
    - 양성: 찾으려는 대상 > 1
    - 음성: 찾으려는 대상 X > 0

정확도(Accuracy)

  • 정확도 = 맞게 예측한 건수 / 전체 예측건수
  • accuracy_score(정답, 모델예측값)

문제: 양성 지표만 확인 X / 불균형 데이터: 평가지표 X(if 양성:음성 = 1:9 > 모두 음성: 정확도 90% but, ㅌ)

불균형 데이터셋으로 만들기

이미지를 0 ~ 9 로 분류하는 문제를 위한 데이터셋 ===> 9와 나머지 숫자로 분류하는 데이터셋으로 변환 => 이 숫자가 9야?

  • y > 9와 나머지로 변경
  • Positive(양성 - 1): 9
  • Negative(음성 - 0): 0 ~ 8

Dummy Model 정의

  • dummy model: 흉내낸 모델
  • Target Label중 무조건 최빈값 예측 모델 정의
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)

불균형 데이터 : 정확도 > 문제

혼동행렬(Confusion Matrix)

  • 실제 값(정답)과 예측한 것 표로 만든 것
  • confusion_matrix(정답, 모델예측값)
  • 0번축: 실제답 / 1번축: 예측값
  • confusion_matrix(y 실제값, y 예측값), ConfusionMatrixDisplay(Confusion marix 시각화클래스)
#
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)
  • TP(True Positive)
    • 양성으로 예측했는데 맞은 개수
  • TN(True Negative)
    • 음성으로 예측했는데 맞은 개수
  • FP(False Positive)
    • 양성으로 예측했는데 틀린 개수
    • 음성을 양성으로 예측
  • FN(False Negative)
    • 음성으로 예측했는데 틀린 개수
    • 양성을 음성으로 예측

이진 분류 평가지표

  • Accuracy (정확도)
    - TP + TN / TP + TN + FP + FN

양성(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)

각 평가 지표 계산 함수

  • sklearn.metrics 모듈
  • confusion_matrix(y 실제값, y 예측값), ConfusionMatrixDisplay(Confusion marix 시각화클래스)**
    • 혼돈 행렬 반환
  • recall_score(y 실제값, y 예측값)
  • precision_score(y 실제값, y 예측값)
  • f1_score(y 실제값, y 예측값)
  • classification_report(y 실제값, y 예측값)
    • 클래스 별로 recall, precision, f1 점수와 accuracy를 종합해서 보여준다.

classification_report()

  • Accuracy와 각 class가 Positive일 때의 recall, precision, f1-score를 한번에 보여주는 함수
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

0개의 댓글