Confusion matrix는 혼동행렬이라 부른다... 왜냐하면... 해석하기가 너무 '혼동'이 오기 때문...? ㅋ
TP/TN/FP/FN으로 이루어진 매트릭스다. 분류 모델의 성능을 평가하는 여러 지표 중 하나.
코로나 진단과 스팸 메일 분류를 할 때?
참고자료
예측한 값이 실제 값과 얼마나 가까운지를 나타내는 기준.
얼핏 보면 어? 맞는거 아니야? 라고 생각할 수가 있다. 하지만 좀 더 자세히 살펴보면 얘기가 달라진다.
대한민국에 코로나 확진자가 10명(양성, 1)이 있다. 나머지는 5000만 명 모두 음성(0)이라고 했을 때, 어느 한 자가키트가 '무조건', '음성(0)' 이라고 한다면 어떨까?
위의 식을 살펴볼 때 정확도가 소수점 4자리까지 9로 찍힌다. 즉, 틀릴 확률은 극히 드물다는 뜻이다. 이런 코로나 검사 방법을 시행한다면, 조만간 전 국민이 슈퍼항체 보유자가 될 것이다;;;;
비유가 약간 이상하게 들릴 수도 있는데, 전하고자 하는 바는 이런 모델을 사용하면 안된다는 거다. 자가키트가 무조건, 음성을 말하는 상황을 바로 데이터 불균형이라고 한다. 키트가 무조건 0으로 찍어버리니, 정확도가 높더라도 우리는 신뢰할 수 없게 되는 것이다. 그렇기 때문에 홀/짝, 0/1 도박 하는 게임도 아니니,, 진짜 문제를 해결하기 위한 모델 설정이 필요하고, 진짜로 예측이 잘 되었는지를 확인할 필요가 있다!
분류를 진행했을 때에, 얼마나 많은 예측(분류 결과)치가 실제 값과 일치하는지.
모델이 1로 예측했을 때, 진짜로 1인 비율.
예측치를 기준으로 삼는다!
Of the Shoes classified Nike, How many are actually Nike?
Step1: Nike로 예측한 전체 합을 더한다. (Number of shoes classified as Nike) TP + FP(나이키로 예측한 수)
Step2: Nike로 예측한 경우 중에, 실제로 나이키인 경우를 구한다. (Number of shoes actually Nike, When classified as Nike) TP (찐 나이키)
Step3: Step2 / Step1 = TP / (TP + FP)
실제 값 중에서, 얼마나 많은 예측(분류 결과)치가 실제처럼 분류 되었는지.
진짜 1인 값들 중에서 모델이 1로 맞춘 비율
실제값을 기준으로 삼는다!
Of the shoes that are actually Nike, How many are classfied as Nike?
Step1: 실제 Nike의 값을 모두 더한다. (Number of Shoes actually Nike) TP + FN(찐 나이키)
Step2: 실제로 Nike인데, Nike로 예측한 경우를 모두 합한다. (Number of shoes classified as Nike, When actually Nike) TP (찐 나이키)
Step3: Step2 / Step1 = TP / (TP + FN)
그럼 모델이 위의 표와 같이 두 개가 나와 있다. 어떤 모델을 써야할까???
???로 표시되어 있는 F-beta 값을 사용하면 된다.
위 두 가지 ROC, AUC를 사용하면 분류문제에서 임계값(Threshold) 설정에 대한 모델의 퍼포먼스를 구할 수 있게 된다.
임계값(Threshold)에 따른 재현율(Recall, TPR(True Positive Rate))과 위양성률(FPR, False Positive RatE)의 관계를 나타내준다.
재현율을 높이기 위해서는 Positive로 판단하는 최소 기준(임계값)을 계속 낮추어 모두 Positive로 판단하게 하면 된다. But 이렇게 하면 동시에 Negative 이지만, Positive로 판단하는 위양성률도 같이 높아지게 된다. 즉, Trade-Off 관계.
재현율은 최대로, 위양성률은 최소로 만들어주는 임계값을 찾아내는 것이 목적이다.
ROC가 왼쪽 위로, 밀접할 수록 좋은 모델 'ㄴ'을 밑으로 뒤집거나, 'ㄱ'을 왼쪽으로 돌렸을 때 나오는 모습처럼!!
ROC curve 아래의 면적을 의미한다.
임계값은 default = 0.5. 즉, 0, 1 중에서 1로 나올 확률이 0.5이상이면 1로 판단하게 되는 것이다. 근데 이 값을 높이게 되면(엄격하게 적용) threshold = 0.8 / 0.9 등으로 하게 되면,, 좀 더 확실하게 1만 나오는 것들만 1로 판단하게 된다.
반면, 이 값을 낮추게 되면(느슨하게 적용) threshold = 0.4 / 0.2 등으로 하게 되면,, 좀 불확실하더라도 좀 더 0에 가까울 것 같더라도 1로 판단하게 된다.
좀 더 직관적으로 이해할 수 있도록 만든 그래프.....
http://www.navan.name/roc/ 직접 확인해 볼 수 있는 사이트....
하지만, 하이퍼파라미터 등을 사용해서 직접 모델을 돌리는 것 같지는 않았다...
y_pred_optimal = y_pred_proba >= optimal_threshold
y_pred_07 = y_pred_proba >= 0.7
이런 식으로 직접 지정해주거나 condition을 걸어주는 식으로 사용하는 것 같았다. 대신 라이브러리로 'Binarizer'가 있었다. 하지만 알려주신 분도 직접 사용해보지는 않았고, 이런 게 있다라는 정도로만 알고 있다고...
그래서 결론, 그냥 개념적으로만 알고 있거나 혹은 분류를 해야하는 코드를 작성할 때에는 위의 코드처럼 하드코딩(??맞나??) 식으로 해서 해주어야 할 것 같다.
+ F-beta score와의 차이점!
F-beta score는 모델의 성능을 평가하기 위한 지표! (for Train data set)
Threshold는 분류할 때에 사용하는 확률의 기준이 된다. (연구자가 직접 어느 정도로 엄격 or 느슨하게 분류할 것인지를 지정해주는 것)