머신러닝

[파이썬 머신러닝 완벽가이드] CH03

AnnSEo2105 2021. 9. 26. 10:54

평가 Metrics

 

참고

https://shinminyong.tistory.com/28

https://angeloyeo.github.io/2020/08/05/ROC.html

 

예측 성능을 평가

  • 분류 성능 평가 지표
    • 정확도(Accuracy)
    • 오차행렬(Confusion Matrix)
    • 정밀도(Precision)
    • 재현율(Recall)
    • F1 스코어
    • ROC AUC

 

01 정확도

예측 결과가 동일한 데이터 건수/전체 예측 데이터 건수

불균형한 레이블 데이터 세트에는 성능 수치로 사용하면 안됨

이 한계점 극복을 위해 오차 행렬 사용

 

02 Confusion Matrix

이진 분류의 예측 오류가 얼마인지, 어떤 유형의 예측 오류가 발생하는지를 함께 나타내는 지표

TP, TN, FP, TN 값으로 Classifier 성능의 여러 면모를 판단할 수 있는 기반 정보를 제공함

→ 정확도, 정밀도, 재현율 값을 알 수 있음

정확도 = 예측 결과가 동일한 데이터 건수/전체 예측 데이터 건수 = (TN+TP)/(TN+FP+FN+TP)

 

03 정밀도와 재현율

Positive 데이터 세트의 예측 성능에 초점을 맞춘 평가 지표

정밀도

  • 예측을 Positive로 한 대상 중에 예측과 실제 값이 Positive로 일치한 데이터의 비율
  • TP/(FP + TP)
  • 양성 예측도라고도 불림
  • 실제 Negative 음성인 데이터 예측을 Positive 양성으로 잘못 판단하게 되면 업무상 큰 영향이 발생하는 경우 중요
  • ex) 스팸메일 여부 판단 모델 등 중요

재현율

  • 실제 값이 Positive인 대상 중에 예측과 실제 값이 Positive로 일치한 데이터 비율
  • TP/(FN + TP)
  • 민감도 또는 TRR(True Positive Rate)라고 불림
  • 실제 Positive 양성 데이터를 Negative로 잘못 판단할 시 큰 문제가 생기는 경우에 중요
  • ex) 암 판단 모델, 금융 사기 적발 모델 등은 재현율이 중요

Precision/Recall Trade-off

정밀도와 재현율은 상충관계에 있음

 

04 F1 스코어

정밀도와 재현율을 결합한 지표

F1 = 2/{(1/recall)+(1/precision)}

f1_score()라는 API를 이용해 구할 수 있음

 

05 ROC 곡선과 AUC

ROC(Receiver Operation Characteristic Curve)

FPR(False Positive Rate)이 변할 때 TPR(True Positive Rate, 재현율, 민감도)이 어떻게 변하는지 나타내는 곡선

FPR이 X축, TPR이 Y축으로 FPR 변화에 따른 TPR의 변화가 곡선 형태로 나타남

TPR 민감도에 대응하는 지표로 TNR(True Negative Rate)이라 불리는 특이성이 있음. 특이성은 실제값 Negative(음성)가 정확히 예측돼야 하는 수준을 나타낸다.

  • ROC 곡선이 가운데 직선에 가까울수록 성능이 떨어지고 멀어질수록 뛰어난 것을 의미
  • ROC 곡선은 FPR을 0부터 1까지 변경하면서 TPR의 변화 값을 구한다.

 

06 피마 인디언 당뇨병 예측

  • 데이터에서 0이 Negative 값으로 500개, 1인 Positive 값이 268개 있으므로 Negative 값이 더 많음
  • 고로 정확도보다는 재현율 성능에 좀 더 초점을 맞춰야함
  • Null 값은 없고 피쳐 타입도 다 숫자형으로 별도의 피쳐 인코딩은 필요하지 않음
  • 로지스틱 회귀를 이용해 예측 모델을 생성
  • 피처 데이터 세트와 클래스 데이터 세트로 나누고 학습 데이터 세트와 테스트 데이터 세트로 분리
  • 정밀도와 재현율을 구했을 때 재현율이 0.5741 값으로 임계값별 정밀도와 재현율 값의 변화 확인을 위해 precision_recall_curve_plot() 함수를 이용해 재현율 곡선을 시각화
  • 곡선을 봤을 때 임계값 0.42 정도면 어느 정도 균형이 맞는데 둘다 0.7이 안되는 상황이므로 임계값 조작 전에 데이터 값 점검이 필요함
  • describe() 메서드를 호출해 피쳐 값의 분포도를 보니 diabetes_data.describe() 데이터 값을 보면 min() 값이 0으로 돼 있는 피처가 상당히 많음 → 예를 들어, Glucose 피처는 포도당 수치인데 min 값이 0인 것은 말이 안됨 → Glucose 히스토그램을 확인해 보면 0 값이 일정 수준 존재함을 확인 가능
  • 0 값의 건수 및 전체 데이터 건수 대비 몇 퍼센트 비율로 존재하는지 확인
  • SkinThickness와 Insulin의 0 값이 전체의 29.56%, 48.7%로 상당히 많음을 확인할 수 있음
  • 위 피처의 0 값을 평균값으로 대체하고 그 대체한 데이터 세트에 피처 스케일링을 적용함
  • 일반적으로 로지스틱 회귀의 경우 숫자 데이터에 스케일링을 적용하는게 좋음
  • 이후 다시 학습/테스트 데이터 세트로 나누고 로지스틱 회귀를 적용해 성능 평가 지표 확인
  • 데이터 변환과 스케일링을 통해 성능 수치가 일정 수준 개선됐음을 확인 가능
  • 분류 결정 임계값을 변화시키면서 재현율 값의 성능 수치가 어느 정도 개선되는지 확인
  • 0.3일 때 재현율이 0.7963으로 좋긴 하나 정밀도가 너무 떨어지므로 둘다 적당히 높은 수치로 0.48 임계값이 적당함(전체적인 성능 평가 지표를 유지하면서 재현율을 약간 향상시킴)
  • 로지스틱 회귀 모델을 이용해 임계값 0.48로 낮춘 상태에서 다시 예측 → predict() 메서드는 임계값을 변환할 수 없으므로 별도 로직 필요 → Binarizer 클래스를 이용해 predict_proba()로 추출한 예측 결과 확률 값을 변환해 변경된 임계값에 따른 예측 클래스 값을 구함

 

07 정리

  • 이진 분류의 레이블 값이 불균형하게 분포될 경우 정확도 지표로만은 평가할 수 없음
  • 정확도는 단순 예측 결과와 실제 결과가 일치하는지만 확인하기 때문
  • 오차 팽렬은 True False에 따라 4분면 행렬 기반으로 예측 성능을 평가함
  • 정확도, 정밀도, 재현율 수치는 TN, FP, FN, TP 값을 다양히 결합해 만들어지고 이걸로 분류 모델 예측 성능의 오류가 어떤 모습으로 발생하는지 알 수 있음
  • 정밀도와 재현율은 Positive 데이터 세트의 예측 성능에 좀 더 초점이 있는 평가 지표
  • 재현율이 상대적으로 중요할 경우 Positive 양성인 데이터 예측을 Negative로 잘못 판단하게 되면 업무상 큰 영햐이 발생할 수 있음
  • 분류하려는 업무 특성상 정밀도 또는 재현율이 특별히 강조돼야 할 경우 분류의 결정 임계값(Threshold)을 조정해 정밀도 또는 재현율 수치를 높일 수 있음
  • F1 스코어는 정밀도와 재현율을 결합한 평가 지표로 어느 한 쪽으로 치우치지 않을 때 높은 지표값을 갖게 된다.
  • ROC-AUC는 일반적으로 이진 분류의 성능 평가를 위해 가장 많이 사용되는 지표
  • AUC(Area Under Curve) 값은 ROC 곡선 밑의 면적을 구한 것으로 일반적으로 1에 가까울수록 좋은 수치