ML_모델 평가

조천룡·2023년 7월 18일
0

Machine Learning

목록 보기
10/26
post-thumbnail

모델 평가의 개념

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

희귀모델들은 실제 값과의 에러치를 가지고 계산

분류 모델의 평가 항목이 조금 많은 편이다.

이진 분류 모델의 평가

이진 분류에서 predict vs real

Accuracy

Precision

RECALL (TPR TRUE POSITIVE RATIO)

FALL-OUT (FPR FALSE POSITION RATIO)

분류모델은 그 결과를 속할 비율(확률)을 반환한다.

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

그 threshold를 변경해 가면서 모델 평가 지표들을 관찰

Threshold = 0.3

Threshold = 0.4

Threshold = 0.5

Threshold = 0.6

Threshold = 0.8

Threshold = 0.9

정리

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

F1-Score

F1-Score의 계산

ROC와 AUC

  • ROC 곡선

  • 만약 완벽하게 분류했다면

  • 적당히 잘했다면

  • 분류 성능이 나쁘다면

  • 방금 전 예제에서의 ROC 곡선

  • AUC

ROC 커브 그려보기

  • 데이터 읽어보기
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']
  • 결정나무 적용
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('Tran Acc : ', accuracy_score(y_train, y_pred_tr))
print('Test Acc : ', accuracy_score(y_test, y_pred_test))

  • 각 수치 구해보기
from sklearn.metrics import accuracy_score, precision_score
from sklearn.metrics import recall_score, f1_score
from sklearn.metrics import 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))

  • ROC 커브 그리기
import matplotlib.pyplot as plt

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

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

profile
10√2 Data

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

유익한 글 잘 봤습니다, 감사합니다.

1개의 답글