Machine Learning/DL - basics

Confusion Matrix(혼돈 행렬), Precision(정밀도), Recall(재현률), F1-score and MCC(Matthews Correlation Coefficient)

IP_DataScientist 2022. 9. 25.
반응형

다음은 User Guide for KOTE: Korean Online Comments Emotions Dataset 논문에서 가져온 성능 지표입니다.

해당 논문은 총 44가지의 감성에 대해 정의하고 입력문장의 감정을 멀티레이블 분류 문제로 다룬 아주 흥미로운 논문입니다. (해당 논문에 대해서도 리뷰하는 시간을 다른 글에서 다뤄보도록 하겠습니다.)

우리는 아래 지표에서 왜 KOTE 논문이 macro avg (0.56)을 해당 분류 문제의 F1 score로 사용하였는지, 그리고 MCC는 왜 지표에 포함 한건지에 대해 알아보는 시간을 갖도록 해보겠습니다.

 

그러므로 이 글에서는 F1 스코어, MCC, 그리고 이 지표들을 이해하기 위한 confusion matrix(혼동 행렬), precision(정밀도), recall(재현율)에 대해서도 다루어 보겠습니다.

 

들어가기 전에.. 혹시 여러분은 F1 score가 True Negative를 성능의 평가에 사용되지 않는 다는 사실을 알고 계셨는지 궁금합니다. 저 또한 MCC를 알아보기 전에 해당 사실에 대해 간과 하고 있었으며, 이 글을 작성하는 시점에도 혼동행렬의 개념은 계속 햇갈립니다 - (이번 기회에 머릿속에 단단히 자리잡았으면 좋겠습니다.)

KOTE의 성능지표

여러 성능지표에 대한 테이블

Predicted condition Sources: [4][5][6][7][8][9][10][11][12]
Total population
= P + N
Positive (PP) Negative (PN) Informedness, bookmaker informedness (BM)
= TPR + TNR − 1
Prevalence threshold (PT)
=
Actual condition
Positive (P) True positive (TP),
hit
False negative (FN),
type II error, miss,
underestimation
True positive rate (TPR), recall, sensitivity (SEN), probability of detection, hit rate, power
= TP/P = 1 − FNR
False negative rate (FNR),
miss rate
= FN/P = 1 − TPR
Negative (N) False positive (FP),
type I error, false alarm,
overestimation
True negative (TN),
correct rejection
False positive rate (FPR),
probability of false alarm, fall-out
= FP/N = 1 − TNR
True negative rate (TNR),
specificity (SPC), selectivity
= TN/N = 1 − FPR
Prevalence
= P/P + N
Positive predictive value (PPV), precision
= TP/PP = 1 − FDR
False omission rate (FOR)
= FN/PN = 1 − NPV
Positive likelihood ratio (LR+)
= TPR/FPR
Negative likelihood ratio (LR−)
= FNR/TNR
Accuracy (ACC) = TP + TN/P + N False discovery rate (FDR)
= FP/PP = 1 − PPV
Negative predictive value (NPV) = TN/PN = 1 − FOR Markedness (MK), deltaP (Δp)
= PPV + NPV − 1
Diagnostic odds ratio (DOR) = LR+/LR−
Balanced accuracy (BA) = TPR + TNR/2 F1 score
= 2 PPV × TPR/PPV + TPR = 2 TP/2 TP + FP + FN
Fowlkes–Mallows index (FM) = Matthews correlation coefficient (MCC)
=
Threat score (TS), critical success index (CSI), Jaccard index = TP/TP + FN + FP referred from: https://en.wikipedia.org/wiki/F-score

Confusion Matrix (혼동 행렬)

이진 분류에는 두개의 class 가 존재 하죠.

True(0) or False(1) / Positive or Negative / ex) dog or cat

이진 분류에서는 둘 중 하나가 긍정 또는 부정으로 나뉩니다.

우리가 강아지가 들어있는 사진을 식별하는데 흥미가 있을경우 강아지면 Positive class, 고양이면 Negative class로 분류를 하게 됩니다.

이러한 이진 분류의 성능을 잘 평가 할 수 있는 지표는 바로 confusion matrix(혼동 행렬)입니다.

정확도 100퍼센트의 혼동 행렬 (강아지를 기준으로) (dog = positive / cat = negative)

위 그림으로 설명을 진행하도록 하겠습니다. (우리는 총 24장의 강아지(20장)와 고양이(4장) 사진을 갖고 있습니다)

우리가 학습한 분류기(classifier)는 첫번째 혼동행렬처럼 정확도 100퍼센트의 성능을 가지면 좋겠지만, 아래와 같은 성능이 나왔습니다.

혼동 행렬 (강아지를 기준으로) (dog = positive / cat = negative)

우선 Positive와 Negative, True와 False의 개념부터 잡아봅시다.

실제 True인 sample(강아지 사진)을 기준으로 모델이 잘못(Negative) 분류 했을 경우 우리는 False Negative라고 합니다.

✔️그럼 여기서 False Negative(FN)의 의미를 풀어 말하면 True를 틀려서(정답은 강아지인 경우) ➡️ False(틀림~ 땡!@!)가 되었고 True(강아지)에 대해서 Negative(고양이)라고 예측을 한 것입니다. 즉 강아지 사진을 보고 고양이라고 예측을 한 것이죠.

✔️반대로, False Positive(FP)와 같은 경우도 True를 틀려서(정답은 고양이인 경우) ➡️ False(틀림~ 땡!@!)가 되었고 True(고양이)에 대해서 Positive(강아지)라고 예측을 한 것입니다. 즉 고양이 사진을 보고 강아지라고 예측을 한 경우죠.

✅ 그럼 TP와 TN은 각각 강아지를 강아지로 예측한것과, 고양이를 고양이라고 잘 예측한것이죠 

 

✨ 표를 해석할때 True/Actual의 기준으로 봐야 햇갈리지 않음

Precision(정밀도)

Precision(정밀도)는 다음과 같은 질문에 답합니다.

  • 예측된 긍정의 몇 퍼센트가 정말로 긍정적일까?
    • 예측된 강아지 사진의의 몇 퍼센트가 정말로 강아지 사진일까? = 강아지 사진으로 예측된 사진중 정말 강아지 사진인 비율은?

Precision 👀 초점 - predicted:

  1. 전체(total) 예측된 강아지 사진 (positives) 의 수 (TP 강아지강아지로 예측 + FP 고양이지만 강아지로 예측함)
  2. 정답을 정답으로 ➡️ 강아지 사진을 강아지 사진(TP)이라고 예측한 수 = 18

이 경우 precision(정밀도)는 TP/(TP+FP) ➡️ 18/(18+3) = 85.7% 이 됩니다.

 

Recall(재현율)

Recall(재현율)은 다음과 같은 조금 다른 질문에 답합니다.

  • 실제 포지티브 중 올바르게 분류된 비율은 어느 정도입니까?
    • 실제 강아지 사진중 올바르게 강아지로 분류된 비율은?

recall 👀 초점 - actual:

  1. 실제(actual) 강아지 사진(Positives) 수 (TP 강아지강아지로 예측 + FN 강아지를 고양이로 예측함) = 20
  2. 정답을 정답으로 ➡️ 강아지 사진을 강아지 사진(TP)이라고 예측한 수 = 18

그러므로 recall(재현율)은 TP/(TP+FN) ➡️ 18/(18+2) = 90% 이 됩니다.

precision and recall - 출처: https://en.wikipedia.org/wiki/Precision_and_recall

 

 한가지 짚고 넘어가야 할 점은 ~ 우리가 해당 분류기에 대해 우리 분류기(모델)은 얼마나 좋아? 라고 질문을 하게 된다면 실제 우리가 풀어야 할 문제(real-world problem)의 시점에서 "얼마나 좋아?" 라는 질문은 상황에 맞게 제 좀 더 구체적으로 정의 되어야 합니다.

그래서, precision과 recall 중 어느게 더 중요할까요??

이 문제는 우리가 마주한 실제 세상의 분류 문제 정의에 따라서 정밀도와 재현율의 중요도가 달라집니다.

example : recall

  • 예) 분류기가 당뇨병 환자를 감지 해야하는데 여기서 positive = 당뇨병, negative = 건강함 이라고 하는 경우 우리는 분류기의 성능중 recall 재현율이 높게 나오길 기대하게 될 것입니다. 왜냐 하면 당뇨인 경우를 대비해 당뇨병 환자를 최대한 감지 하고 싶기 때문이죠
  • (정밀도) - 당뇨병, 건강함 샘플 중에서 당뇨병을 더 잘 예측 하는 경우
  • (재현율) - 당뇨병 샘플중에서 당뇨병이라고 더 잘 예측 하는 경우 ✔️
  • 즉 분류기의 학습셋에서 당뇨병과 건강 데이터가 있을 경우 당뇨병 샘플 20개 건강 20개 총 40개의 샘플 중, 우리는 당뇨 샘플 20개에 초점을 맞춰서 정확도를 측정하는 것이죠
  • 또다른 극단적?인 예) 우리는 초등학생을위해 유해 컨텐츠 및 일반 컨텐츠를 분류하는 문제를 다룰때, 유해한 컨텐츠샘플을 더 잘 예측해야 하는 경우에 우리는 재현율을 더 중요하게 바라본다. 유해한 샘플을 유해하지 않다고 바라보는 모델은 위험하다..✔️

example : precision

  • 예) 너튜브 추천시스템을 구축할때, 우리의 분류기는 연관 있는 비디오를 Positive, 연관 없는 비디오를 Negative로 분류 하게 되는데, 이런경우 대부분의 추천된 비디오가 사용자에게 연관이 있는 비디오를 전달 하는 모델을 추구 하게 된다. 즉, 높은 정밀도를 원하게 될 것이다.
  • (정밀도) - 즉 분류기가 연관있는 또는 없는 컨텐츠 샘플 중 연관 있는것을 더 정확하게 예측하는 비율 ✔️
    • 연관이 있는것과 없는것중 연관이 있는것을 더 정확하게 잘 예측해야 사용자를 더 끌어드릴 수 있다. 
  • (재현율) - 연관있는 컨텐츠 샘플들 중 연관이 있는 샘플이라고 잘 예측하는 비율
    • 연관이 있는 컨텐츠를 연관이 있다라고 잘 말하는 정도

위 예시와 같이 삶은 trade-off 로 가득차다..

유득유실, 유실유득 <좋아하는 모든 것을 다 얻을 수는 없고 얻는 것이 있으면 잃는 것도 있다> 라는 뜻이다.

우리가 만드는 인공지능 모델에도 부합한다.

  • 부합하다 : 사전을 보면 '부신(符信)이 꼭 들어맞듯 사물이나 현상이 서로 꼭 들어맞다 라고 되어있다.
    • 부신 : 대개 나뭇조각이나 두꺼운 종잇조각에 글자를 쓰고 증인(證印)을 찍은 뒤에 이것을 두 조각으로 쪼개어 한 조각은 상대자에게 주고 다른 조각은 발행한 쪽에서 보관하였다가 뒷날 사용할 때 서로 맞추어 증거로 삼았다. - 신표(신분증) 같은것..

Accuracy (정확도)

정확도는 강아지 사진(positive) 입장이 아니라 강아지 고양이(positive and negative) 두 시점으로 바라본다.

즉 분류기가 강아지, 고양이를 얼마나 정확하게 분류해? 라고 질문을 던졌을때 답하기 좋은 지표이다.

위  confusion matrix를 기준으로 정확도를 계산하게 된다면, 모델의 정확도는:

  • (TP + TN) / (TP+TN+FP+FN) = (18+1) / (18 + 1 + 3 + 2) = 79.2% 가 된다.

MCC를 사용해야 하는 이유

지금까지 우리는 분류기의 precision, recall, accuracy를 강아지 사진을 기준으로 살펴 보았다. 그럼 고양이 사진을 잘 탐지하는 입장에서 보았을때 분류기의 성능이 같은 precision, recall, accuracy를 갖게될까??

절대로 그렇지 않다...

고양이사진을 잘 감지해야되 라는 입장에서 본다면 모델은 총 4개의 고양이 사진에서 고양이 사진을 강아지라고 3번예측하고 강아지 사진을 고양이라고 2번 예측한다.

이런 경우 고양이 입장에서 precision = 33.3%, recall = 25%, accuracy = 79.2%이다.

강아지는 90% 고양이는 25%로 정확하게 분류되는데 이 둘의 평균은 57.5로 분류기의 정확도인 79%보다 적다.. 그리고 이유는 강아지와 고양이의 데이터 샘플이 불균형 하기 때문이다.

이러한 클래스 불균형 문제를 해결하기위해 MCC가 사용된다.

MCC에 대해서는 마지막에 살펴보겠다.

F1 score

우리는 모델의 성능을 정밀도와 재현율로 표현하기보다는 단일 지표로 요약하여 나타내길 원한다.

이러한 경우 F1-score가 계산되는데, 평균을 사용하여 계산되지만 일반적인 "산술 평균"이 아니라, "조화 평균"을 사용한다.

F1-score 출처:&nbsp;https://en.wikipedia.org/wiki/F-score

※ F1 스코어는 정밀도와 재현율의 조화 평균이다.

F1-score는 항상 재현율과 정밀도 사이 어딘가를 나타낸다. 하지만 한가지 알고 넘어가야 할 것은 F1-score는 항상 recall과 precision에서 더 적은 점수에 높은 가중치를 주어 계산하게 된다는 것이다.

  • Precision = 100% 과 Recall = 0% 라고 할 경우, F1-score 는 50%가 아니라, 0%이다.

여기서 F1-score를 좀 더 알아보기위해 다중분류 문제로 넘어가 보자

다중 분류 - 고양이, 물고기, 닭
정밀도와 재현율
F1-score

위와 같이 각각의 분류 클래스(고양이, 물고기, 닭)에 대해서 F1-score를 구했다.

그럼 해당 모델각각의 F1-score 3개를 하나의 F1-score로 합치는 작업은 어떻게 할까?

이 모델의 전반적인 F1-score를 구하는방법은 여러가지가 있다. (macro-F1, weighted-F1, micro-F1)

Macro-F1

각각의 클래스에 대해 산술 평균(arithmetic mean)을 구하는것이다 = macro-averaged F1-score로도 부를 수 있다.

Macro-F1 = (42.1% + 30.8% + 66.7%) / 3 = 46.5%

F1 과 마찬가지로 재현율과 정밀도도 일반적인 산술평균을 구하면 각각 Macro-precision, Macro-recall이 된다.

Macro-precision = (31% + 67% + 67%) / 3 = 54.7%

Macro-recall = (67% + 20% + 67%) / 3 = 51.1%

Macro는 각 분류클래스의 정밀도와 재현율의 조화 평균점수의 평균점수로서 각각의 분류 점수를 모두 고려한 F1-score 라고 볼 수 있겠다.

Weighted-F1

Macro-F1과 같은경우 우리는 각각의 class(고양이, 물고기, 닭)에 동일한 가중치(class의 개수 = 3)를 주어서 계산 하였다.

하지만 모델에 사용되는 각 class의 샘플의 수가 항상 같을 순 없고 그래서 동일한 가중치를 줄 수 없겠다 싶을때 weighted-F1을 사용한다. 위 그림에서는 6 Cat, 10 Fish, and 9 Hen으로 총 25개의 샘플이 있는데 데이터의 수 가 불균형 imbalance하다. 가중 F1을 구하는 방식은 다음과 같다.

F1점수에 가중치를 각각 곱해준 합에 전체 샘플 수 만큼 나누어 준다.

Weighted-F1 = (6 × 42.1% + 10 × 30.8% + 9 × 66.7%) / 25 = 46.4%

위와 마찬가지로 가중 정밀도와 가중 리콜을 계산할 수 있다.

Weighted-precision=(6 × 30.8% + 10 × 66.7% + 9 × 66.7%)/25 = 58.1%

Weighted-recall = (6 × 66.7% + 10 × 20.0% + 9 × 66.7%) / 25 = 48.0%

이 지표는 샘플의 불균형 까지 고려각 분류클래스의 정밀도와 재현율의 조화 평균점수의 평균점수로서 각각의 분류 점수를 모두 고려한 F1-score 라고 볼 수 있겠다.

Micro-F1

Micro-F1을 계산하기 위해서는 우선 위 두 방식과는 달리 이번에는 micro-averaged precision과 micro-averaged recall을 모든 샘플들에 대해서 구한뒤 이 두 점수를 합산해야 한다. micro-average를 구하기 위해서는 모든 샘플을 함께 살펴봐야 한다.

다중 클래스의 경우 올바르게 예측된 모든 샘플을 TruePositives로 간주한다.

  • [정밀도 (TP/(TP+FP))]=[재현율 (TP/(TP+FN))] = TP=4+2+6= 12

반대로 틀린 예측을 모두 False Positive로 간주하게 된다. FP=6+3+1+0+1+2=13

그러므로 정밀도(precision)은 12/12+13 = 48%

재현율 또한 마찬가지로 12/12+13 = 48%이 되어버린다.

micro-average 의 경우 precision = recall의 관계가 되어버리고 F1-score또한 마찬가지로 같게 되어버린다.

  • micro-F1 = micro-precision = micro-recall
  • micro-F1 = micro-precision = micro-recall = accuracy

F1 스코어는 정밀도와 재현율을 하나의 점수로 나타내는 편리함을 제공하지만 주의해서 사용해야 한다.

왜냐하면 F1-score의 주된 결점은 정밀도와 리콜에 동등한 비중을 둔다는 것이다.

저명한 통계학자 데이비드 핸드는 "정확성과 리콜에 할당된 상대적 중요성이 문제의 한 측면이 되어야 한다"고 설명했다.

 

아픈 사람을 건강한 사람으로 분류하는 것은 건강한 사람을 아픈 사람으로 분류하는 것과 비용이 다르며, 이는 해결하려는 특정 문제에 가장 적합한 분류자를 선정하는 데 가중치와 비용이 사용되는 방식에 반영되어야 한다.

 

이는 이진 분류기에 해당하며, 매크로, 가중치 또는 마이크로 F1 점수와 같은 다중 클래스 F1 점수를 계산할 때 문제가 복잡해진다. 다중 클래스의 경우 예측 오류마다 다른 함축성이 있다.

곧 X를 Y로 예측하는 것은 Z를 W로 예측하는 것과 다른 비용이 발생할 가능성이 높다. 표준 F1 점수는 도메인 지식을 고려하지 않는다.

 

https://towardsdatascience.com/multi-class-metrics-made-simple-part-ii-the-f1-score-ebe8b2c2ca1

위 그림과 같이 sk-learn의 출력을 보면 빨간 박스는 macro와 weighted의 각각의 정밀도와 재현율 f1값을 보여주는데, 정확도는 micro-F1 = micro-precision = micro-recall = accuracy 다음과 같이 성립된다.

 

그래서 맨 처음 위에서 언급한 KOTE논문에서 44개의 감정 성능을 얘기할때 micro-avg가 아닌 macro-avg점수인 0.56을 모델의 성능으로 내세운 이유는 모든 감성 분류에 대해 동일한 가중치를 주었을때 의 모델 성능을 말하기 위함이라고 할 수 있겠다.

F1아래 AUC는 (Area Under the Curve)를 의미한다. 이건 https://bioinformaticsandme.tistory.com/328를 참고하시라

 

그럼 드디어 MCC 는 무엇인지 알아보자~!

MCC (Matthew's Correlation Coefficient)

지금까지 우리는 고전적인 측정 기준에서 몇 가지 문제를 보았다. 

정확도는 클래스 불균형에 민감하다.

정밀도, 리콜 및 F1 점수는 비대칭적이다.

또한 두 클래스가 모두 관심 있는 경우 이진 분류 문제를 두 클래스가 있는 다중 클래스 문제로 취급한 다음, 마이크로 또는 매크로 평균 정밀도, 리콜 및 F1-점수의 해당 다중 클래스 메트릭을 계산할 수 있다.

 

이진 분류와 같은 경우 다른 해결책이 있다.

두 변수 사이의 상관 계수를 계산하는 것과 유사한 방식으로, 실제 클래스와 예측된클래스를 각각 2개(binary)의 변수로 대하고, 이 둘의 상관 계수(correlation coefficient)를 계산한다.

True 값과 Pred 값 사이의 상관 관계가 높을수록 예측이 잘 된것이며, 이 계산 방법이 분류 모델에 적용될 때 Matthews 상관 계수(MCC)로 다시 명명된 파이 계수(π)인 것이다.

MCC 공식

MCC의 좋은 특성은 이 공식에서 쉽게 도출할 수 있다: 분류기가 완벽할 때(FP = FN = 0) MCC의 값은 1이며 완벽한 양의 상관관계를 나타낸다.

반대로, 분류기가 항상 잘못 분류할 때(TP = TN = 0), 우리는 완벽한 음의 상관관계를 나타내는 -1의 값을 얻는다(이 경우, 단순히 분류기의 결과를 뒤집어서 이상적인 분류기를 얻을 수 있다).

실제로 MCC 값은 항상 -1과 1 사이이며, 0은 분류기가 동전의 랜덤 플립보다 낫지 않음을 의미한다.

MCC는 또한 완벽하게 대칭이기 때문에 다른 클래스보다 더 중요한 클래스는 없습니다. 양수와 음수를 전환해도 동일한 값을 얻을 수 있다고 한다.

즉 MCC는 혼동행렬의 모든 원소에 관여를 하는 것이고 높은 값(1에 가까움)은 모델이 이진분류에서 두 클래스중 한 클래스가 불균형적으로 과소 표현되더라도 두 클래스 모두를 잘 예측 함을 의미한다.

 

MCC의 사용은 sk-learn을 통해서 할 수 있다.

True데이터와 Pred데이터는 각각 배열의 형태로 입력한다.

위의 KOTE는 44개의 감정에 대해 각각의 입력문장에 대해 44개의 감정에 대해 binary형태로 44개의 감정 중 속하는 감정을 1로 하여 모델을 학습한다.

KcElectra로 KOTE를 파인튜닝한 하여 입력문장속의 여러 복합적인 감정을 MCC로 계산하게 되면 0.588의 정확도로 예측을 하는 것이지만.

AUC를 통해 각각의 감정을 보면 대부분 70~90%사이의 정확도로 각 입력문장의 단일 감정을 잘 예측하는 모습을 보여주는 훌륭한 모델 및 데이터셋을 제공했다고 생각한다.

from sklearn.metrics import matthews_corrcoef as MCC
import warnings

y_pred = predictions.numpy() # [[0,1,1,0,...,0,0,1,0], [...],[...]] 44개의 각각의 감정 카테고리에대한 2진분류 정답세트
y_true = labels.numpy() # [[0,1,0,0,...,1,0,1,1], [...],[...]] 44개의 각각의 감정 카테고리에대한 2진분류 예측세트

with warnings.catch_warnings():
    warnings.simplefilter("error")
    
    totalCorr = 0
    totalLen = 0
    for i in range(10_000):
        try:
            totalCorr += MCC(y_pred[i], y_true[i])
            totalLen += 1
        except:
            pass
        
print('computed # ::: {}'.format(totalLen))
print('MCC  :::::::::  {}'.format(totalCorr/totalLen))

#--- MCC 함수는 다음과 같다 --- 

def matthews_corrcoef(y_true, y_pred, *, sample_weight=None):
    """Compute the Matthews correlation coefficient (MCC).

    The Matthews correlation coefficient is used in machine learning as a
    measure of the quality of binary and multiclass classifications. It takes
    into account true and false positives and negatives and is generally
    regarded as a balanced measure which can be used even if the classes are of
    very different sizes. The MCC is in essence a correlation coefficient value
    between -1 and +1. A coefficient of +1 represents a perfect prediction, 0
    an average random prediction and -1 an inverse prediction.  The statistic
    is also known as the phi coefficient. [source: Wikipedia]

    Binary and multiclass labels are supported.  Only in the binary case does
    this relate to information about true and false positives and negatives.
    See references below.

    Read more in the :ref:`User Guide <matthews_corrcoef>`.

    Parameters
    ----------
    y_true : array, shape = [n_samples]
        Ground truth (correct) target values.

    y_pred : array, shape = [n_samples]
        Estimated targets as returned by a classifier.

    sample_weight : array-like of shape (n_samples,), default=None
        Sample weights.

        .. versionadded:: 0.18

    Returns
    -------
    mcc : float
        The Matthews correlation coefficient (+1 represents a perfect
        prediction, 0 an average random prediction and -1 and inverse
        prediction).

    References
    ----------
    .. [1] :doi:`Baldi, Brunak, Chauvin, Andersen and Nielsen, (2000). Assessing the
       accuracy of prediction algorithms for classification: an overview.
       <10.1093/bioinformatics/16.5.412>`

    .. [2] `Wikipedia entry for the Matthews Correlation Coefficient
       <https://en.wikipedia.org/wiki/Matthews_correlation_coefficient>`_.

    .. [3] `Gorodkin, (2004). Comparing two K-category assignments by a
        K-category correlation coefficient
        <https://www.sciencedirect.com/science/article/pii/S1476927104000799>`_.

    .. [4] `Jurman, Riccadonna, Furlanello, (2012). A Comparison of MCC and CEN
        Error Measures in MultiClass Prediction
        <https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0041882>`_.

    Examples
    --------
    >>> from sklearn.metrics import matthews_corrcoef
    >>> y_true = [+1, +1, +1, -1]
    >>> y_pred = [+1, -1, +1, +1]
    >>> matthews_corrcoef(y_true, y_pred)
    -0.33...
    """
    y_type, y_true, y_pred = _check_targets(y_true, y_pred)
    check_consistent_length(y_true, y_pred, sample_weight)
    if y_type not in {"binary", "multiclass"}:
        raise ValueError("%s is not supported" % y_type)

    lb = LabelEncoder()
    lb.fit(np.hstack([y_true, y_pred]))
    y_true = lb.transform(y_true)
    y_pred = lb.transform(y_pred)

    C = confusion_matrix(y_true, y_pred, sample_weight=sample_weight)
    t_sum = C.sum(axis=1, dtype=np.float64)
    p_sum = C.sum(axis=0, dtype=np.float64)
    n_correct = np.trace(C, dtype=np.float64)
    n_samples = p_sum.sum()
    cov_ytyp = n_correct * n_samples - np.dot(t_sum, p_sum)
    cov_ypyp = n_samples**2 - np.dot(p_sum, p_sum)
    cov_ytyt = n_samples**2 - np.dot(t_sum, t_sum)

    if cov_ypyp * cov_ytyt == 0:
        return 0.0
    else:
        return cov_ytyp / np.sqrt(cov_ytyt * cov_ypyp)

 

reference

https://towardsdatascience.com/the-best-classification-metric-youve-never-heard-of-the-matthews-correlation-coefficient-3bf50a2f3e9a

 

Matthews Correlation Coefficient is The Best Classification Metric You’ve Never Heard Of

Still using accuracy and F1-score? Time to upgrade.

towardsdatascience.com

 

반응형

'Machine Learning > DL - basics' 카테고리의 다른 글

AI Deep Dive 수학편  (2) 2023.01.30

댓글

💲 Google Ads.