정확도 평가에 대해
업데이트:
카테고리: 파이썬 머신러닝 완벽 가이드
정확도 평가에 대해
흔히 사용하는 머신러닝 모델은 회귀와 분류 모델입니다. 회귀 모델은 대부분 정답과 예측 값의 오차 평균 값을 지표로 사용하죠.
분류 모델의 정확도를 평가하는 방법도 일반적으로는 정답과 예측 결과가 같은지 비교할 수 있지만, 단순히 이런 식으로만 평가하게되면 잘못된 평가를 할 수 있습니다.
정확도 평가 지표란, scikit-learn에서 accuracy_score를 통해서 간단하게 구현할 수 있는 정답과 예측 값을 비교하는 것이라고 생각하면 된다. 특히 이진 클래스를 분류할 때 자주 사용하게 되는데(멀티 클래스에서도 사용됨) 정확도 평가 지표만 사용하면, 문제가 발생하게 된다. 언제 문제가 발생하는가?
주로 데이터의 균형이 맞지 않은 경우에 문제가 발생하게 된다.
예를 들어서 개와 고양이 사진이 100장 있고 개는 0으로 고양이는 1로 라벨링 되어 각각 90장,10장이 있다고 해보자. 위 데이터 셋으로 학습을 진행을 하게 되면, 먼저 데이터의 불균형에 의해 올바른 학습이 이루어지지 않을 수 있다. 특히 KFold를 사용해서 학습을 하게되면 더욱 더 큰 문제가 발생한다. (문제 해결을 위한 방법 중 하나는 아래에서 한번 언급한 적 있다.)
https://blog.naver.com/znlduqwl/222630976037
Stratified K fold 방식이미지 썸네일 삭제 Stratified K fold 방식 데이터를 이용해서 분류를 하기위해선 일반적으로 train - test 세트로 나눠서 학습을 진행하는 것이 통상…
blog.naver.com
그러나 여기선 위 문제를 생각하지 말고 prediction 과정에 집중해보자. 위 100장의 이미지로 학습을 해서 정확도가 80~90%의 예측 결과가 나왔다고 해보자. 그러나, 학습을 하지 않고 단순하게 100장에 이미지에 대해서 예측을 할 때 “항상 이 사진은 개(0)야!” 라고 무지성으로 예측을 하더라도 정확도가 무려 90%에 달한다. 그러면 이건 학습하는 의미가 없는 것이나 마찬가지이다. 따라서 정확도 평가 지표는 단순하게 홀로 사용된다면, 올바른 성능 지표로 작동하지 않을 수 있다.
우리는 그래서 여러가지 다른 분류 지표들과 함께 정확도 평가 지표를 사용해야한다!
분류기의 성능 평가 지표
https://blog.naver.com/znlduqwl/222633131902
정확도 평가 지표의 문제점이미지 썸네일 삭제 정확도 평가 지표의 문제점 정확도 평가 지표란, scikit-learn에서 accuracy_score를 통해서 간단하게 구현할 수 있는 정답과 예측 값…
blog.naver.com
이미 위 게시글에서 분류기의 성능을 평가할 때 단순하게 “테스트 셋의 클래스 예측 결과가 내가 갖고 있는 정답과 일치하는 수를 N이라고 하고, 전체 테스트 데이터 셋의 수를 M이라고 했을 때 N/M *100 의 정확도를 가진다고 평가하는 것”은 올바른 평가지표로 볼 수 없다고 얘기했었다.
그렇다면 어떤 평가지표를 더 추가해야할까? 책에서는
1) Confusion matrix
2) Precision
3) Recall
4) F1 score
5) ROC AUC
를 이야기한다. 나도 여태까지 분류기를 다루는데 있어 정확도(accuracy_score)같은 것만 생각했는데, 책의 내용 및 예제를 실행해보니, 실제로 머신러닝로 분류기를 사용함에 있어서 위 지표들을 잘 이용해야한다는 것을 이제 알았다. 특히 이진 분류에서 데이터의 불균형이 일어났을 때, 가장 조심해야한다.
대표사진 삭제 사진 설명을 입력하세요.
위 사진은 confusion matrix와 precision, recall에 대해 표현 및 관계되어 있는 것들에 대해 표시한 것이다. 뒤에 N/P는 예측한 클래스를 이야기하고, 앞에 T/F는 예측한 클래스와 정답 클래스가 같으면 T, 다르면 F를 쓴다.
Recall과 Precision에 대한 식은 다음과 같다.
대표사진 삭제 사진 설명을 입력하세요.
분류기의 성능을 평가할 때 Precision과 Recall 둘다 높은 값이 나오면 좋지만, 이것들은 서로 Trade-off 관계를 갖는다. 따라서 프로젝트의 목표에 따라 어떤 것에 더 비중을 둘지 생각을 해야한다. 책은 2가지 예시를 들었다.
1) 내가 암에 걸린 상태(P)인데 병원에 가서 인공지능에게 진료를 받아보니 음성(N)이라고 하더라.
2) 스팸메일(P)을 차단하는 인공지능을 만들었다. 그러나 업무용 메일(N)을 인공지능이 스팸메일(P)로 판단해서 차단해버렸다.
위의 두 예시 중 precision과 recall이 중요한 지표인 경우는 각각 뭘까?
precision이 중요한 지표은 2)이다. 2)와 같은 상황이 많아지면, 업무에 차질이 생기기 마련이며, 동시에 confusion matrix에서 FP가 커지게 된다. 왜냐하면 업무용 메일(N)은 정답 클래스가 N이고, 이것을 인공지능이 스팸메일(P)로 예측하는 경우가 많아지는 것이기 때문이다.
recall이 중요한 지표는 1)이다. 1)과 같은 상황이 많아지면, 나는 진료결과를 믿고 살다가 조기 치료가 가능한 시점을 지나 암 말기가 되버려서 죽을 수 있으며, 동시에 confusion matrix에서 FN이 커지게 된다. 왜냐하면 내 몸은 사실 암에 걸린 상태(P)이므로 정답 클래스가 P이고, 이것을 인공지능이 정상(N)으로 예측하는 경우가 많아지는 것이기 때문이다.
따라서 1)과 같은 경우는 평가지표에서 recall의 값을 더 비중있게 다루고, 2)와 같은 경우는 precision을 더 비중있게 다루는 것이 맞다.
그러나 사실 제일 좋은 것은 precision,recall,accuracy가 전부다 높은게 좋다. 그러나 위에서 언급했듯, trade-off문제가 있기 때문에 항상 문제가 발생할 것이다. precision과 recall의 값이 동시에 커지고 작아지고를 한눈에 파악하기 위해서 3) F1 score를 사용하면 간단하게 평가지표로 삼을 수 있다.
여기서 클래스를 예측하는 것은 사실 머신러닝 모델에서 한번에 추출되는 것이 아니다. 머신러닝 모델은 입력 데이터가 들어오면, 이 데이터가 개별 클래스에 해당하는 확률을 뱉어낸다. 특히 이진 분류에선 positive의 확률을 주시하게 되고, 이 확률 값이 일정 threshold가 넘어가면 해당 데이터의 클래스를 positive라고 출력하는 것이다. (멀티 클래스의 경우 지금 내가 아는 지식내에선 cross-entropy와 softmax를 사용해서 멀티 클래스마다의 확률 중 가장 큰 것을 해당 데이터의 클래스로 갖게 된다고 알고 있다.)
따라서 threshold에 따라 TN,TP,FN,FP가 바뀌게 될 것을 어느정도 예상할 수 있다. 이 threshold는 하이퍼 파라미터 개념이라 결국 내가 선택을 해야하고, 가장 좋은 선택 방법은 scikit-learn이 제공하는 precision_recall_curve()와 같은 함수를 이용해서 threshold에 따른 precision과 recall의 그래프를 그리고 두 그래프가 만나는 지점을 선택하는 것 같다.
만약 교차지점의 threshold를 선택하고자 했지만, 두 평가지표의 값이 0.6처럼 작을 경우, 데이터에서 문제가 생겼을 수 있다. 따라서 항상 데이터를 살펴보고 데이터를 수정하고 보완하는 습관을 들일 필요가 있다.