데이터과학 유망주의 매일 글쓰기 — 33일차
Kaggle이 이렇게 재미있을 줄이야!
# Kaggle, #Confusion Matrix
오늘 한일:
오늘은 Confusion Matrix에 관해서 배웠다. 이 매트리스는 어떠한 사실이 “정말" 사실인지, 아니면 “정말" 거짓인지 등을 구분할 수 있게 해주는 것이다. 사실 0과 1로 모든 것이 분류되는 지도학습의 분류학습에서는, 상당히 유용한 머신 러닝 보완 기법이다.
예를 들어, 셜록 홈즈가 사건 현장에 도착하여, 범인을 가리기 위해 용의자들을 좁혔다고 하자. 홈즈가 “진짜” 범인을 지목했을 경우를 True Positive(“정말 옳을” 경우)라고 하고, 그외의 용의자를 범인으로 지목하지 않고, 실제로 그들이 범인이 아닌 경우를 “True Negative” (“정말 아닐” 경우)라고 하자. 홈즈가 범인을 지목했는데 범인이 아닌 경우는 “False Negative” (“거짓이고 아닐” 경우), 그리고 특정 용의자가 범인인데 그를 범인으로 지목하지 않은 경우를 “False Positive” (“거짓이고 옳을" 경우)라고 하자. 그렇다면 아래의 형태의 테이블을 구성할 수 있다.
이 테이블에 기반하여, “지목된 범인(1)”이 옳을 확률(1)과 아닐 확률(0), “지목되지 않은 범인(0)”이 옳을 확률(1)과 아닐 확률(1)을 측정할 수 있다. 이분법적인 분류에서도 그것이 사실인지 아닌지까지 확인해야 한다는 것은 이 매트리스 말대로 좀 혼란(confusion)스럽게 느껴지지만, 컴퓨터가 각 경우에 대한 확률을 잘 계산할 수 있다면, 내가 만든 머신 러닝 모델의 성능은 더 좋아질 것이다. 만약 당시에 조금 발전한 컴퓨터가 있었다면, 홈즈의 업무가 훨씬 간단해지지 않았을까?
마찬가지로, 오늘 나의 과제는 어제 만든 Random Forest Classfier의 성능을, 이 confusion matrix를 통해 개선하는 것이었다. 나에게는 한 개인이 코로나를 대비해 “실제로(1)” 백신을 맞았을 확률(1)과 맞지 않았을 확률(0)을 예측해야하는 과제가 주어졌다.
그리고, 이 confusion matrix를 통해 계산할 수 있는 중요한 지표들이 있는데, 아래와 같다.
- 정확성(accuracy) = (TP+TN)/(TP+TN+FP+FN)
- 정밀도(precision) = TP/(TP+FP)
- 재현율(recall) = TP/(TP+FN)
- F1-score(분류 모델의 평가지표) = TP/(TP + 0.5(FP+FN))
- 임계값(beta): F1-score를 좌우하는 중요 변수
지금까지는 정확성을 가장 중요한 지표로 보았지만, 사실 분류 문제에서 가장 중요한 평가 지표는 F1-Score라는 것을 깨달았다. 또한 경우에 따라, 정밀도나 재현율이 정확성보다 중요할 수도 있다는 사실을 깨달았다. 예를 들어 스펨메일 여부를 판단하는 모델이 있다면, 일반 메일(Negative)를 스팸메일(Positive)로 분류한다면(FP), 사용자가 필요한 메일을 보지 못할 경우가 생길 수 있으니, 이 경우 정밀도가 재현율 보다 중요하다.
반대로, 암을 판단할 때, 실제 암 환자(Positive)를 음성(Negative)로 판단한다면, 환자의 생명이 위험해질 수 있다(FN). 정상(Negative)인 환자를 (Postive) 양성으로 판별하는 것(FP) 역시 상당한 의료 비용을 초래할 수 있다. 그러므로, 이 경우 재현율이 정밀도 보다 더 중요하다 할 수 있다. 각 상황마다 중요한 지표가 다를 수 있는데, 이것은 해당 도메인에 대한 지식이 매우 필요한 부분이다.
F1 스코어는 결국, 이 두 가지 조건을 염두한 계산을 하게된다. 그러므로, 이 둘의 균형을 잘 맞추어야 좋은 스코어를 낼 수 있다. 나의 경우 “실제 백신을 맞은 사람(1)”을 예측하는 것이 목적이기 때문에, True Positive(백신을 맞았다고 판별된 이들 중 “실제로 백신을 맞은 자들")이 중요하다.
또한 ROC Curve와 AUC라는 개념을 배우게 되었는데, ROC Curve는 특정 임계치에 따른 TP확률과 FP확률을 그래프로 보여주는 기법이며, AUC는 Area Under Curve라 하여, 이 그래프의 아래 면적을 말한다. 이 면적이 높을 수록, 모델의 재현율을 높이는데 긍정적인 영향이 있다.
하지만 결정적으로 AUC는 F1-Score와 관련이 없기 때문에, 나는 임계치 변화에 따른 F1-Score의 변화를 보면서 임계치를 최적화 시키는 것이 옳다는 판단을 했다. 그리고 이 것은 옳은 선택으로 보였다.여기에 더해, 어제 조정했던 하이퍼파라미터들을 수정하고, 최적화된 임계치를 기반으로한 확률 계산을 모델에 반영하면서, 훨씬 더 나은 성능의 모델로 개선할 수 있었다.
앞으로 할일:
어제 배운 것에 더해서 지난 한 달간 계속 배워왔던 “확률”이라는 개념이 끼어드니 조금 더 혼란스럽게 느껴진 것은 사실이었다. 그러나 시간을 들여 씨름한 결과, 내가 초기에 원했던 목적 (0.55보다 높은 스코어)을 크게 윗도는 성과를 달성할 수 있었다.
하루 하루 배운 머신 러닝 기법들이 매우 소중하게 느껴진다. 원래 알고 있던 방법 중에 가장 좋은 값들을 찾아내는 것도 좋지만, 새로운 방법을 사용하는 것으로 훨씬 더 큰 개선 효과를 볼 수 있었다는 사실이 기뻤다. 아직 내가 배워야할 것들이 많다고 느껴진다. 내일은 또 어떤 기법을 배우게 될지, 이를 통해 어떻게 나의 모델을 여기서 더 발전시킬 수 있을지 기대가된다.
무엇보다도 Kaggle이 더욱 더 재미있어졌다. 처음에는 순위가 많이 신경쓰였지만, 지금은 하루 하루 나아지는 나의 점수를 보는 것이 즐겁다. 내가 발전하고 있다는 뜻이니까. 그것 만으로도 충분하다. 앞으로 이렇게 하루 하루 발전하는 데이터 과학자의 삶을 이어가고 싶다. 다른 동료 수강생들과 이 세상에 있는 모든 데이터과학 유망주들이 오늘은 어제보다 더 나은 하루를 보냈기를 바라며, 내일 역시 조금이라도 더 나아질 수 있는 하루가 되었으면 좋겠다.
참조:
(1) https://glassboxmedicine.files.wordpress.com/2019/02/confusion-matrix.png
(2) https://developers.google.com/machine-learning/crash-course/images/AUC.svg