본문 바로가기
Data Science/Machine Learning

[Machine Learning] 평가 지표 - 분류(Classification)

by 인사이티드 2023. 2. 7.

분류는 머신러닝의 대표적인 기법 중 하나이다. 정말 다양한 분류 알고리즘이 있고, 아직 데이터분석을 시작한 지 얼마 안 된 초보자 입장이지만, 현재까지 웬만한 문제들은 분류 알고리즘 기반으로 풀렸다.

그러나 머신러닝 모델링을 했어도 모델의 성능을 측정할 수 없다면 아무 쓸모가 없을 것이다. 실제 테스트 데이터에 대해서 잘 작동하는지 평가를 해봐야 할 것이다. 일반적으로 평가를 한다면 정확도를 가지고 평가를 할 테지만, 분류에서는 다른 측정 방법들을 사용한다. 분류에서 정확도를 맹신하지 않는 이유는 나중에 정리하여 포스팅하겠다.
분류에서 이 평가를 하는 방법이 존재한다.


1. 오차 행렬 (confusion matrix)

첫 번째는 바로 오차 행렬이다.

오차 행렬


오차 행렬은 실제 값과 예측 값을 비교하여 잘못 비교된 경우가 얼마나 있는지를 확인한다. 오차 행렬에는 아래와 같이 4가지 값이 존재한다. (이진 분류의 경우)

TN(True Negative): 실제로는 음성 클래스이고 음성으로 예측한 횟수이다.
FP(False Positive): 실제로는 음성 클래스이지만 양성으로 예측한 횟수이다.
FN(False Negative): 실제로는 양성 클래스이지만 음성으로 예측한 횟수이다.
TP(True Positive): 실제로는 양성 클래스이고 양성으로 예측한 횟수이다.


이 때, 양성 예측의 정확도의 지표로 정밀도, 실제 양성을 얼마나 잘 감지했는지를 재현율(민감도)로 따로 나타낸다. 

정밀도와 재현율


정확도의 식은 다음과 같다. 정확도란 전체 케이스 중의 정확하게 예측한 비율이다.

정확도

 

물론 좋은 분류기라 함은 정밀도와 재현율이 모두 높은 분류기이다. 그러나 일반적으로 정밀도와 재현율은 trade-off 관계에 있다. 정밀도가 올라가면 재현율이 떨어지고, 재현율이 올라가면 정밀도가 떨어진다.

2. f1 score

두 번째로 f1 score가 있다. f1 score란 정밀도와 재현율을 하나의 수자로 만든 것을 말한다. f1 score는 정밀도와 재현율의 조화 평균이다.

f1 score

f1 score는 정밀도와 재현율을 요약한 지표이기 때문에 대회에서 종종 쓰이기도 한다. 

측정 지표

데이콘에서 열렸던 데이터분석 경진대회에서 Macro F1 Score가 사용된 모습이다. Macro f1 score는 다중 클래스 분류 문제에서 클래스별 f1 score의 평균이다.


3. ROC 곡선
세 번째는 ROC 곡선이다. ROC곡선은 민감도에 대한 1-특이도 그래프이다. 특이도는 진짜 음성 비율을 말하는 것으로 식은 다음과 같다.

특이도

참고로 코로나 검진 키트의 성능을 판단하기 위해서 사용되었던 지표가 두 가지 있는데, 바로 민감도(재현율)와 특이도이다. 민감도는 실제 양성 환자를 잘 감지하기 위한 지표이므로 중요하고, 특이도는 실제 음성 환자를 잘 감지하기 위한 지표이기 때문에 중요하다. 코로나 검진 키트의 경우에는 정밀도보다 민감도와 특이도가 더 중요한 케이스였다.

아래는 ROC 곡선의 그래프를 나타낸 것이다.

ROC 곡선

ROC 곡선은 가짜 양성 비율이 낮을 때 진짜 양성 비율이 높을수록 좋은 분류기를 의미한다. 즉, 그래프가 왼쪽 위에 붙을수록 좋은 분류기라는 뜻이다. 그래프가 만약에 항등함수 모양으로 그려진다면 랜덤 분류기라는 소리로, 분류기의 의미가 사라진다.

ROC 곡선은 이처럼 이진 분류기에 대해 시각화하기 좋은 지표이다.

4. AUC (Area Under the Curve)
ROC 곡선을 통해서 이진 분류기의 성능을 시각화할 수 있었다면, AUC를 통해서 이진 분류기의 성능을 수치화할 수 있다. AUC는 곡선 아래 면적이라는 뜻으로 ROC 곡선의 아래 면적을 의미한다. 1에 가까울수록 좋은 분류기라는 뜻이고, 0.5이면 랜덤 분류기라는 뜻이다.

위의 네 가지 지표들이 바로 분류에서 사용되는 측정 지표들이다. 개인적으로 나는 오차 행렬을 조사하는 것을 좋아한다. 그 이유는 오차 행렬은 다중 클래스에 대해서도 알아보기 편하고, 어떤 클래스가 어떤 클래스로 잘못 예측되었는지 판단하는데 살펴보기 좋기 때문이다.

모든 지표들은 전부 사이킷런의 metrics에서 지원하고 있다. 아래 코드로 불러와서 사용 가능하다.

# 오차 행렬
from sklearn.metrics import confusion_matrix
# 정밀도, 재현율
from sklearn.metrics import precision_score, recall_score
# ROC 곡선
from sklearn.metrics import roc_curve
# AUC
from sklearn.metrics import roc_auc_score


추가로, 사이킷런에서는 분류에 대한 결과를 요약해서 살펴볼 수 있는 classification_report()라는 함수도 제공한다.

다중 분류에 대한 classification_report()

 

5. Logloss

Macro F1 score와 비슷하게 Logloss는 다중 클래스 분류 모델의 평가 방법으로 쓰인다.

이름에 loss가 들어갔기 때문에 손실을 평가지표로 쓴다는 뜻이고, 값이 0에 가까울수록 좋은 모델을 의미한다.

Precision과 Recall을 사용하는 F1 score와는 다르게 확률 값 자체를 사용한다.

0.2의 확률로 1이라고 예측한 사람보다, 0.9의 확률로 1이라고 예측한 사람이 실제값이 1일 때 더 많은 점수를 얻는다.

Logloss는 우연에 의한 정답을 고평가하는 것을 방지하는 데에 큰 의미가 있다.


참고자료

[1] Aurélien Géron, 「Hands-On Machine Learning with Scikit-Learn, Keras & TensorFlow」, 한빛미디어, 2020

[2] yun99, "[Basic] 대회에서 자주 사용되는 평가 산식들에 대한 정리(2) 분류모델 평가산식", 2022, https://dacon.io/en/forum/405817