-목차-4. 정밀도(Precision)와 재현율(Recall)
6. ROC(Receiver Operation Characteristic Curve) 곡선과 AUC(Area Under Curve)
1. 성능 평가(Evaluation)
머신러닝은 데이터 가공/변환, 모델 학습/예측, 그리고 평가(Evaluation)의 프로세스로 구성된다.
이번 글에서는 머신러닝 모델의 성능 평가 지표(Evaluation Metric)에 대해서 다뤄 보도록 하겠다.
일반적으로 모델이 분류냐 회귀냐에 따라 여러 종류로 나뉜다. 회귀의 경우 대부분 실제 값과 예측값의 오차 평균값에 기반한다. 예를 들어 오차에 절댓값을 씌운 뒤 평균 오차를 구하거나 오차의 제곱 값에 루트를 씌운 뒤 평균 오차를 구하는 방법과 같이 기본적으로 예측 오차를 가지고 정규화 수준을 재가공하는 방법이 회귀의 성능 평가 지표 유형이다.
분류의 평가 방법도 일반적으로는 실제 결과 데이터와 예측 결과 데이터가 얼마나 정확하고 오류가 적게 발생하는가에 기반하지만, 단순이 이러한 정확도만 가지고 판단했다가는 자못된 평가 결과에 빠질 수 있다. 이번 글에서는 분류에 사용되는 성능 평가 지표에 대해 집중적으로 설명하도록 하겠다.
먼저 분류의 성능 평가 지표는 아래와 같다.
- 정확도(Accuracy)
- 오차 행렬(Confusion Matirx)
- 정밀도(Precision)
- 재현율(Recall)
- F1 스코어
- ROC AUC
2. 정확도(Accuracy)
정확도는 말 그대로 실제 데이터에서 예측 데이터가 얼마나 같은지를 판단하는 지표이다. 정확도 산출 방법은 아래와 같다.
정확도(Accuracy) = 예측 결과가 동일한 데이터 건수 / 전체 예측 데이터 건수
정확도는 직관적으로 모델 예측 성능을 나타내는 평가 지표이다. 하지만 이진 분류의 경우 데이터의 구성에 따라 ML 모델의 성능을 왜곡할 수 있기 때문에 정확도 수치 하나만 가지고 성능을 평가하지 않는다.
예를 들어 100개의 데이터가 있고 이 중에 90개의 데이터 레이블이 0, 단 10개의 데이터 레이블이 1이라고 한다면 무조건 0으로 예측 결과를 반환하는 ML 모델의 경우라도 정확도가 90%가 된다.
3. 오차 행렬(Confusion Matrix)
이진 분류에서 성능 지표로 잘 활용되는 오차행렬(Confusion matrix, 혼동 행렬)은 학습된 분류 모델이 예측을 수행하면서 얼마나 헷갈리고(confused) 있는지도 함께 보여주는 지표이다. 즉, 이진 분류의 예측 오류가 얼마인지와 더불어 어떠한 유형의 예측 오류가 발생하고 있는지를 함께 나타내는 지표이다.
오차 행렬을 다음과 같은 4분면 행렬에서 실제 레이블 클래스 값과 예측 레이블 클래스 값이 어떠한 유형을 가지고 매핑되는지를 나타낸다. TN, FP, FN, TP는 예측 클래스와 실제 클래스의 Positive 결정 값(값 1)과 Negative 결정 값(값 0)의 결합에 따라 결정된다.
예를 들어 TN은 True Negative의 의미이며 앞 True는 예측 클래스의 값과 실제 클래스 값이 같다는 의미고 뒤의 Negative는 예측값이 Negative 값이라는 의미이다.
즉 각 기호가 의미에서 앞 문자 True/False는 예측값과 실제값이 '같은가/틀린가'를 의미한다. 뒤 문자 Negative/Positive는 예측 값과 값이 부정(0)/긍정(1)을 의미한다.
정리하자면 아래와 같다.
- TN : 예측값을 Negative 값 0으로 예측했고 실제 값 역시 Negative 값 0
- FP : 예측값을 Positive 값 1로 예측했고 실제 값은 Negative 값 0
- FN : 예측값은 Negative 값 0으로 예측했고 실제 값은 Positive 값 1
- TP : 예측값은 Positive 값 1로 예측했고 실제 값 역시 Positive 값 1
4. 정밀도(Precision)와 재현율(Recall)
정밀도와 재현율은 Positive 데이터 세트의 예측 성능에 좀 더 초점을 맞춘 평가 지표이다. 정밀도와 재현율은 다음과 같은 공식으로 계산된다.
\[precision = \frac{TP}{FP+TP} \]
\[recall = \frac{TP}{FN+TP} \]
정밀도는 예측을 Positive로 한 대상 중에 예측 값이 Positive로 일치한 데이터의 비율을 뜻한다.
재현율은 실제 값이 positive인 대상 중에 예측과 실제 값이 Positive로 일치한 데이터의 비율을 뜻한다.
정밀도와 재현율 지표 중에 이진 분류 모델의 업무 특성에 따라서 특정 평가 지표가 더 중요한 지표로 간주될 수 있다.
- 재현율이 상대적으로 더 중요한 지표인 경우는 실제 Positive인 데이터 예측을 Negative로 잘못 판단하게 되면 업무상 큰 영향이 발생하는 경우(금융 사기 분류)
- 정밀도가 상대적으로 더 중요한 지표인 경우는 실제 Negative인 데이터 예측을 Positive로 잘못 판단하게 되면 업무상 큰 영향이 발생하는 경우(스팸메일 분류)
4.1 정밀도/재현율 트레이드오프
분류하려는 업무의 특성상 정밀도 또는 재현율이 특별히 강조돼야 할 경우 분류의 결정 임곗값(Threshold)를 조정해 정밀도 또는 재현율의 수치를 높일 수 있다. 하지만 정밀도와 재현율은 상호 보완적인 평가 지표이기 때문에 어느 한쪽을 강제로 높이면 다른 하나의 수치는 떨어지는 정밀도/재현율 트레이드오프(Trade-off)가 존재한다. 트레이드오프가 생기는 이유는 무엇일까?
분류 결정 임곗값은 Positive 예측값을 결정하는 확률의 기준이 된다. 확률이 0.5가 아닌 0.4부터 Positive로 예측되게 한다면 Positive 예측 값이 많아질 것이다. Positive 예측값이 많아지면 실제 Positive를 Negative로 예측하는 횟수가 상대적으로 줄어들기 때문이다. 위의 정밀도/재현율의 공식을 다시 상기해보면 Positive 예측 값이 많아질수록 재현율은 증가하고, 반대로 Negative도 Positive로 관대하게 예측하게 되기 때문에 정밀도는 줄어들게 된다.
아래 코드를 보자.
구현 코드 : Precision_Recall_Trade-off
def precision_recall_curve_plot(y_test , pred_proba_c1):
# threshold ndarray와 이 threshold에 따른 정밀도, 재현율 ndarray 추출.
precisions, recalls, thresholds = precision_recall_curve( y_test, pred_proba_c1)
# X축을 threshold값으로, Y축은 정밀도, 재현율 값으로 각각 Plot 수행. 정밀도는 점선으로 표시
plt.figure(figsize=(8,6))
threshold_boundary = thresholds.shape[0]
plt.plot(thresholds, precisions[0:threshold_boundary], linestyle='--', label='precision')
plt.plot(thresholds, recalls[0:threshold_boundary],label='recall')
# threshold 값 X 축의 Scale을 0.1 단위로 변경
start, end = plt.xlim()
plt.xticks(np.round(np.arange(start, end, 0.1),2))
# x축, y축 label과 legend, 그리고 grid 설정
plt.xlabel('Threshold value'); plt.ylabel('Precision and Recall value')
plt.legend(); plt.grid()
plt.show()
precision_recall_curve_plot( y_test, lr_clf.predict_proba(X_test)[:, 1] )
정밀도는 점선으로, 재현율은 실선으로 표현했다. 그림에서 보다시피 임곗값이 낮을수록 많은 수의 양성 예측으로 인해 재현율 값이 극도로 높아지고 정밀도 값이 극도로 낮아지는 것을 확인할 수 있다.
임계값을 계속 증가시킬수록 재현율 값이 낮아지고 정밀도 값이 높아지는 반대의 양상이 된다.
5. F1 스코어(F1-Score)
F1 스코어는 정밀도와 재현율을 결합한 지표이다. F1 스코어는 정밀도와 재현율이 어느 한쪽으로 치우치지 않는 수치를 나타날 때 상대적으로 높은 값을 가진다. F1 스코어의 공식은 아래와 같다.
\[F1 = \frac{2}{\frac{1}{recall}+\frac{1}{precision}} = 2 * \frac{recall*precision}{recall+precision}\]
만약 A 예측 모델의 경우 정밀도가 0.9 재현율이 0.1로 극단적인 차이가 나고, B 예측 모델은 정밀도가 0.5 재현율이 0.5로 정밀도와 재현율이 큰 차이가 없다면 A 예측 모델의 F1 스코어는 0.18이고, B예측 모델의 F1 스코어는 0.5로 B 모델이 A 모델에 비해 우수한 F1 스코어를 가지게 된다.
6. ROC(Receiver Operation Characteristic Curve) 곡선과 AUC(Area Under Curve)
ROC 곡선과 이에 기반한 AUC 스코어는 이진 분류의 예측 성능 측정에서 중요하게 사용되는 지표이다.
ROC 곡선은 FPR(False Positive Rate)이 변할 때 TPR(True Positive Rate)이 어떻게 변하는지를 나타내는 곡선이다.
FPR을 X축으로 TPR을 Y축으로 잡으면 FPR의 변화에 따른 TPR의 변화가 곡선 형태로 나타난다.
각각을 구하는 공식은 아래와 같다.
구현 코드 : ROC_AUC
\[TPR = \frac{TP}{FN+TP}\]
\[FPR = \frac{FP}{FP+TN}\]
위 그림은 ROC 곡선의 예이다. 왼쪽 하단과 오른쪽 상단을 대각선으로 이은 직선은 동전을 무작위로 던져 앞/뒤를 맞추는 랜덤 수준의 이진 분류의 ROC 직선이다(AUC = 0.5). ROC 곡선은 가운데 직선에서 가까울수록 성능이 떨어지는 것이며, 멀어질수록 성능이 뛰어나다고 해석할 수 있다.
일반적으로 ROC 곡선 자체는 FPR과 TPR의 변화 값을 보는데 이용하며 분류의 성능 지표로 사용되는 것은 ROC 곡선 면적에 기반한 AUC 값으로 결정한다. AUC 값은 ROC 곡선 밑의 면적을 구한 것으로서 일반적으로 1에 가까울수록 좋은 수치이다.
AUC 수치가 커지려면 FPR이 작은 상태에서(Negative를 positive로 오분류하는 오분률이 작은 상태) 얼마나 큰 TPR(Positive를 Positive로 제대로 분류하는 상태)을 얻을 수 있느냐가 관건이다. 가운데 직선에서 멀어지고 왼쪽 상단 모서리 쪽으로 가파르게 곡선이 이동할수록 직사각형에 가까운 곡선이 되어 면적이 1에 가까워지는 좋은 ROC AUC 성능 수치를 얻게 된다.
참고 자료
'머신러닝, 딥러닝' 카테고리의 다른 글
고유값 분해(Eigen-Value Decomposition) (1) | 2022.02.28 |
---|---|
[ML] 피처 스케일링과 정규화(Scikit-Learn) (0) | 2022.02.21 |
[ML] 교차 검증 (CV, Cross Validation) (0) | 2022.02.21 |
[DL] Cost Function (0) | 2022.02.15 |
[DL] 경사 하강법(Gradient Descent) (0) | 2022.02.04 |
댓글