[ML] 모델 평가

TaeHwi Kang·2022년 12월 20일
1

1. 모델평가의 개념

  • 모델을 좋다, 나쁘다 등으로 평가할 방법은 없다. 대부분 다양한 모델, 다양한 파라미터를 두고, 상대적으로 비교

1) 회귀모델 평가

  • 회귀모델들은 실제 값과의 에러치를 가지고 계산
  • 회귀모델의 평가는 어렵지 않다

2) 분류 모델 평가

  • 평가 항목

2. 이진 분류 모델의 평가

1) Accuracy

  • 전체 데이터중 맞게 예측한 것의 비율

2) Precision

  • Positive라고 예측한것 중에서 실제 Positive 비율

3) RECALL (TPR, TRUE POSITIVE RATIO)

  • Positive인 데이터 중에서 Positive이라고 맞게 예측한 비율

4) FALL-OUT (FPR, FALSE POSITION RATIO)

  • 실제 Nagative인 데이터 중 Positive로 잘못 예측한 비율

  • 분류모델은 그 결과를 속할 비율(확률)을 반환한다
    - 지금까지는 비율에서 threshold를 0.5라고 하고 0, 1로 결과를 반영했다. (이진분류)
    - iris의 경우 가장 높은 확률값이 있는 클래스를 해당 값이라고 했다

3. Threshold를 변경해 가면서 모델 평가 지표들을 관찰

  • 실제 양성인 데이터를 음성이라고 판단하면 안되는 경우라면, Recall이 중요
    - 이경우는 Threshold를 0.3 or 0.4로 선정해야 함. (ex. 암환자 판별)

  • 실제 음성인 데이터를 양성이라고 판단하면 안되는 경우라면, Precision이 중요
    - 이경우는 Threshold를 0.8 or 0.9로 선정해야 함. (ex. 스팸메일)

  • 그러나 Recall과 Precision은 서로 영향을 주기 때문에 한 쪽을 극단적으로 높게 설정해서는 안된다

4. F1-Score

  • F1-score는 Recall과 Precision을 결합한 지표
  • Recall과 Precision이 어느 한쪽으로 치우치지 않고 둘다 높은 값을 가질수록 높은값을 가진다.

- F1-Score 계산

4. ROC와 AUC

1) ROC 곡선

  • FPR (FALSE POSITION RATIO)이 변할떄 TPR (TRUE POSITION RATIO)의 변화를 그린 그림
  • FPR을 x축, TPR을 y축
  • 직선에 가까울 수록 머신러닝 모델의 성능이 떨어지는것으로 판다

(1) 완벽하게 분류했을때

(2) 잘 했을때

(3) 성능이 안좋을때

(4) 방금 전 예제의 ROC 곡선

2) AUC

  • ROC 곡선 아래의 면적
  • 일반적으로 1에 가까울수록 좋은 수치
  • 기울기가 1인 직선 아래의 면적이 0.5
    - AUC는 0.5보다 커야한다

5. 와인데이터로 ROC 곡선 그려보기

1) 데이터 가져오기

import pandas as pd

red_url = 'https://raw.githubusercontent.com/PinkWink/ML_tutorial/master/dataset/winequality-red.csv'
white_url = 'https://raw.githubusercontent.com/PinkWink/ML_tutorial/master/dataset/winequality-white.csv'

red_wine = pd.read_csv(red_url, sep= ';')
white_wine = pd.read_csv(white_url, sep= ';')

red_wine['color'] = 1.
white_wine['color'] = 0.

wine = pd.concat([red_wine, white_wine])

wine['taste'] = [1. if grade > 5 else 0. for grade in wine['quality']]

X = wine.drop(['taste', 'quality'], axis = 1)
y = wine['taste']

2) 간단하게 결정나무 적용

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=13)

wine_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
wine_tree.fit(X_train, y_train)

y_pred_tr = wine_tree.predict(X_train)
y_pred_test = wine_tree.predict(X_test)

print('train Acc : ',accuracy_score(y_train, y_pred_tr))
print('test Acc : ',accuracy_score(y_test, y_pred_test))

# train Acc :  0.7294593034442948
# test Acc :  0.7161538461538461

3) 각 평가 수치 구해보기

from sklearn.metrics import (accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, roc_curve)

print('Accuracy :', accuracy_score(y_test, y_pred_test))
print('Recall :', recall_score(y_test, y_pred_test))
print('Precision :', precision_score(y_test, y_pred_test))
print('AUC Score :', roc_auc_score(y_test, y_pred_test))
print('F1 Score :', f1_score(y_test, y_pred_test))

# Accuracy : 0.7161538461538461
# Recall : 0.7314702308626975
# Precision : 0.8026666666666666
# AUC Score : 0.7105988470875331
# F1 Score : 0.7654164017800381

4) ROC 커브 그리기

import matplotlib.pyplot as plt
%matplotlib inline

pred_proba = wine_tree.predict_proba(X_test)[:, 1]
fpr, tpr, threshold = roc_curve(y_test, pred_proba)

plt.figure(figsize=(10,8))
plt.plot([0,1],[0,1], ls='dashed')
plt.plot(fpr, tpr)
plt.grid()
plt.show()

profile
스터디 노트

0개의 댓글