💠 평가 💠

2023. 9. 26. 17:45개발/💠 Alchemist

 

 

1.  평가

 

머신러닝의 대략적인 프로세스는

데이터 가공 / 변환 -> 모델 학습 / 예측 -> 평가 로 구성되어있다

 

이 때 '평가'란 말 그대로 모델이 결과 예측을 잘 하고 있는지 판단하는 것을 의미한다

 

성능 평가 지표는 분류냐 회귀냐에 따라 구분된다

회귀와 분류 모두 예측값과 실제값의 오차에 기반하여 평가한다

하지만 분류는, 특히 이진 분류의 경우에 레이블 값의 분포가 불균형할 때

단순히 예측값의 정확도만 측정한다면 잘못된 평가 결과에 빠질 수 있다

 

그렇기 때문에 분류는 다양한 성능 평가 지표를 가지고 있다

 

 

2. 분류의 성능 평가 지표

 

1 ) 정확도

정확도(Accuracy) : 실제 데이터 중 예측 데이터와 실제 데이터가 일치하는 비율

구현 함수 : accuracy_score()

 

하지만 앞서 말했듯이 오직 실제값과 예측값이 얼마나 일치했는지만 가지고 판단한다면 왜곡된 결과에 빠지게 된다

 

예를 들어 데이터 100개의 값 중 0이 90개, 1이 10개인 레이블이 불균형한 상황에서

무조건 0이라고 예측하는 멍청한 알고리즘도 정확도가 90%나 나오게 된다는 것이다

 

 

2 ) 오차 행렬(confusion matrix)

오차 행렬 : 학습된 분류 모델의 예측 오류가 얼마인지와 더불어 어떠한 유형의 예측 오류가 발생하고 있는지 함께 나타내는 지표

* 구현 함수 : confusion_matrix()

 

오차 행렬을 이용해 정확도를 구현해보면

 

오차 행렬을 통해 더욱 보완된 평가 지표인 재현율정밀도를 구현할 수 있다

 

 

3 )  정밀도와 재현율

 

(1) 정밀도와 재현율의 정의 및 특징

 

정밀도와 재현율은 Positive값을 중심으로 평가한다

 

정밀도 : 예측을 Positive로 한 대상 중 예측과 실제 값이 Positive로 일치한 데이터의 비율

* 구현 함수 : precision_score()

 

재현율 : 실제값이 Positive인 대상 중 예측과 실제 값이 Positive로 일치한 데이터의 비율

* 구현 함수 : recall_score()

 

재현율은 실제 Positive 데이터를 Negative로 잘못 판단하게 되면(FN) 큰 영향을 받는 경우에 사용되고

정밀도는 실제 Negative 데이터를 Positive로 잘못 판단하게 되면(FP) 큰 영향을 받는 경우에 사용된다

 

(2) 정밀도 재현율의 트레이드오프

정밀도 혹은 재현율 중 하나를 강조해야 하는 경우가 있다

이때 일반적으로 임계값을 조정해 정밀도 혹은 재현율 중 하나를 강조하는 방법을 사용한다

하지만 정밀도와 재현율의 차이가 심한 경우 그 지표는 성능이 좋다고 할 수 없다

 

고정된 임계값과 같거나 임계값을 넘었을 경우 Positive, 임계값을 넘지 못했을 경우 Negative로 판단한다

* 예측 확률 결과 반환 함수 : predict_proba()

 

이때 임계값이 높아지면 Positive로 예측하는 경우가 줄고 따라서 TP와 FP가 줄어들며 TN과 FN은 증가한다

그렇게 되면 정밀도는 감소하게 되고 재현율은 증가하게 된다

반대로 임계값이 낮아지면 Positive로 예측하는 경우가 늘어나고 따라서 TP와 FP가 증가하며 TN과 FN은 감소한다

그렇게 되면 재현율은 감소하게 되고 정밀도는 증가하게 된다

 

* 임계값 변경하는 방법

from sklearn.preprocessing import Binarizer

binarizer = Binarizer(threshold = 1.1)	# 임계값 1.1로 변경
binarizer.fit_transform(데이터 세트)  # 임계값 기준으로 데이터값 Positive(1), Negative(0)으로 변환

 

위의 설명을 통해 정밀도와 재현율이 서로 반대되게 작용하는 것을 알 수 있다

정밀도와 재현율은 상호보완적인 관계이기 때문에 한쪽이 증가하면 한쪽이 감소하는 형태를 띈다

이를 정밀도와 재현율의 트레이드오프라고 한다

 

(3) 정밀도와 재현율의 맹점

위에서 말한 것처럼 정밀도와 재현율은 임계값으로 조정이 가능하다

그렇기 때문에 만약 정밀도와 재현율 중 한 가지만 강조하고 싶다면 임계값을 임의로 조정해서 한 쪽 값을 극단적으로 조작할 수 있다

정밀도와 재현율의 차이가 심한 지표는 좋지 못한 지표기 때문에 이러한 맹점을 잘 방어해야 한다

 

정밀도와 재현율의 이러한 맹점을 방어하기 위해 필요한 것이 F1 스코어, ROC 곡선과 AUC다

 

4 ) F1 스코어

F1 스코어 : 정밀도와 재현율을 결합한 지표로 정밀도나 재현율 중 한쪽으로 치우지지 않을 때 높은 값을 가진다

조화 평균

* 구현 함수 : f1_score()

 

5 ) ROC 곡선과 AUC

ROC 곡선 : FPR(False Positive Rate)가 변할 때 TPR(True Positive Rate)이 어떻게 변하는지 나타내는 곡선

X축 - FPR / Y축 - TPR

 

TPR : 재현율(Positive가 정확히 예측돼야 하는 수준)을 의미함, TPR = TP / (FN + TP)

TNR : 특이성(Negative가 정확히 예측돼야 하는 수준)을 의미함, TNR = TN / (FP + TN)

FPR = 1 - TNR

 

가운데 직선은 ROC곡선의 최저값을 의미한다

ROC 곡선이 가운데 직선에 가까울수록 성능이 떨어지고 멀어질수록 성능이 뛰어나다는 것이다

* 구현 함수 : roc_curve()

 

가운데 직선과 ROC곡선으로 둘러싸인 부분의 면적을 AUC 스코어라고 하는데

ROC 곡선이 가운데 직선에서 멀어질수록 AUC 스코어가 높게 나온다

AUC 스코어가 커지려면 FPR이 작은 상태에서 얼마나 큰 TPR을 구할 수 있느냐가 관건이다.