데이터가 불균형하거나 클래스 간 차이가 있다면 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 |