본문으로 바로가기

Model evaluation metrics

category AI/Machine Learning 2021. 2. 23. 14:23

데이터가 불균형하거나 클래스 간 차이가 있다면 roc-auc

Confusion matrix

  예측 클래스
Negative Positive
실제 클래스 Negative True Negative (TN) False Positivie (FP)
Positive False Negative (FN) True Positive (TP)

    - True Positive (TP) : 모델이 정답을 맞췄다.

    - True Negative (TN) : 모델이 오답을 했다.

    - False Positive (FP) : 모델이 오답을 정답으로 잘못 예측/분류 했다.

    - False Negative (FN) : 모델이 정답을 오답으로 잘못 예측/분류 했다.

 

Accuracy

    - 전체 표본 중 정확히 분류/예측된 표본의 수

    - 매우 일반적인 정보로 accuracy 지표만으로 모델 실제 성능을 장담할 수 없다.

 

    - error : 잘못된 예측의 합을 전체 예측 샘플 개수로 나눈 것

$$ERR = \frac{FP+FN}{FP+FN+TP+TN}$$

 

    - accuracy : 옳은 예측의 합을 전체 예측 샘플 개수로 나눈 것 (오차로부터 구할 수도 있다.)

$$ACC = \frac{TP+TN}{FP+FN+TP+TN} = 1- ERR$$

 

Precision & Recall

1) 개요

    - 클래스 비율이 다른 경우 유용한 성능 지표

    - 오차 행렬에서 행(실제 클래스)끼리  계산하기 때문에 클래스 비율에 영향 받지 않는다.

    - precision과 recall 사이에 적절한 간극을 찾아 이상적인 예측/분류를 해야 한다.

    e.g. 암이 걸리지 않았지만 걸렸다고 (FP) 분류하여 불필요한 의료비가 소비된다.

 

1) Precision

$$PRE=\frac{TP}{TP+FP}$$

    - precision이 높으면 관련 있는 결과를 그렇지 못한 것과 비교하여 많이 맞춘 것이다.

 

2) Recall

$$REC = \frac{TP}{TP+FN}$$

    - recall이 높으면 관련 있는 결과를 최대한 많이 가져왔다는 것이다.

 

F1 score

1) 개요

    - precision과 recall의 조화평균 (harmonic mean)

    - f1 score가 [0, 1] 사이의 값으로 나오는데 1에 가까울수록 precisioin과 recall은 조화롭다.

    - 편중된 값을 더 크게 조정시킨다.

 

2) 공식

$$F1 = 2\frac{PRE \times REC}{PRE+REC}$$

 

3) 사용처

    - FP와 FN이 모두 중요할 때

    - 추가되는 데이터가 결과에 영향을 끼치지 않는 경우

    - TN이 중요할 경우 (홍수 예측, 암환자 예측)

 

코드 예시

from sklearn.metrics import precision_score
from sklearn.metrics import recall_score, f1_score

print('정밀도: %.3f' %precision_score(y_true = y_test, y_pred = y_pred))

print('재현율: %.3f' %recall_score(y_true = y_test, y_pred = y_pred))

print('F1: %.3f' %f1_score(y_true = y_test, y_pred = y_pred))

'''모델에서 성능지표 변경'''
from sklearn.metrics import make_scorer, f1_score

scorer = make_scorer(f1_score, pos_label = 0)
c_gamma_range = [0.01, 0.1, 1.0, 10.0]

param_grid = [{'svc__C':c_gamma_range,
               'svc__kernel': ['linear']},
              {'svc__C':c_gamma_range,
               'svc__gamma':c_gamma_range,
               'svc__kernel':['rbf']}]

gs = GridSearchCV(estimator = pipe_svc,
                  param_grid = param_grid,
                  scoring = scorer,
                  cv = 10)

gs = gs.fit(X_train, y_train)
print(gs.best_score_)
print(gs.best_params_)

ROC Curve (receiver operating characteristic)

1) 개요

    - 클래스 분포에 민감하지 않아 데이터의 긍,부정 비율이 빠겨도 roc curve는 변하지 않는다.

    - 분류기의 threshold(임계 값)를 바꾸며 계산된 FPR, TPR 점수를 기반으로 그래프를 그린다.

$$FPR=\frac{FP}{FP+TN},\;\;\; TPR=REC=\frac{TP}{TP+FN}$$

 

2) 그래프

    - 점(0, 0) : Positive가 하나도 없다. (Only TN, FN)

    - 점(1, 1) : Negative가 하나도 없다. (Only TP, FP)

    - 점선 삼각형 안에 있다면 성능이 좋다고 볼 수 있다.

AUROC (area under the ROC curve)

1) 개요

    - ROC curve 아래 면적을 계산

    - 2차원인 ROC curver에서 성능지표를 스칼라값으로 보고자 할 때 사용

    - 고정수치여서 절대적 수치로 모델의 성능을 매길 수 있다.

    - 분류 임계치가 고정이어서 모델의 임계점에 상관없이 성능을 매길 수 있다.

Multi-classification evaluation metrics

1) 개요

    - OvA (One vs. All) 방식을 사용하여 해당 클래스는 Positive, 기타 클래스들은 Negative로 적용한다.

    - 위의 방법을 반복해서 총 클래스 개수 n개의 서로 다른 ROC 그래프를 그린다.

 

2) macro 평균 방식

    - 단순한 클래스별 정밀도의 평균

    - 모든 클래스에 동일한 가중치를 부여하여 분류기의 전반적인 성능 평가

    - 가장 많이 사용

$$PRE_{macro} = \frac{PRE_{1} + \cdots + PRE_{n}}{n}$$

 

3) micro 평균 방식

    - 각 샘플이나 예측에 동일한 가중치를 부여하고자 할 때 사용

$$PRE_{micro} = \frac{TP_{1} + \cdots +TP_{n}}{TP_{1} + \cdots + TP_{n} + FP_{1} + \cdots + FP_{n}}$$

 

4) 코드 예시

'''multiclass'''
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
clf = LogisticRegression(solver="liblinear").fit(X, y)
roc_auc_score(y, clf.predict_proba(X), multi_class='ovr')

'''macro, micro'''
from sklearn.metrics import precision_score
precision_score(y_true, y_pred, average='macro')
precision_score(y_true, y_pred, average='micro')

참고

머신러닝 교과서 (길벗)

heartbeat.fritz.ai/evaluation-metrics-for-machine-learning-models-d42138496366

stats.stackexchange.com/questions/132777/what-does-auc-stand-for-and-what-is-it

scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html

scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_score.html

'AI > Machine Learning' 카테고리의 다른 글

Linear regression  (0) 2021.02.26
Ensemble (Voting, Bagging, Boosting)  (0) 2021.02.24
Validation (Cross-val, learning-curve, GridSearch)  (0) 2021.02.23
Model pipeline  (0) 2021.02.22
Regularization  (0) 2021.02.19