Last Updated on 2023-04-13 by Clay
Introduction
每當我們訓練完一個深度學習模型後,就又到了我們評估模型好壞的時間。比方說分類任務所使用的分類模型,我們總是會拿各式各樣的指標來測試,比方說 precision、recall、F1-score、Accuracy… 指標間總是有好有壞,甚至有可能會互相衝突,所以大部分時候還是要依據任務的需求來選擇自己評估模型的指標的。
打個比方,如果你想要做出一塊美味的蛋糕,你可能需要有專業的美食家替你進行試吃,然後告訴你感想,這是一個檢驗美味蛋糕的良好方式;而如果你選擇把蛋糕從兩公尺高的地方丟向地板,然後看著摔成爛泥的蛋糕心想:「嗯,這個蛋糕顯然不怎麼好吃。」—— 我們可能會覺得這位點心師傅需要去看個精神科醫生。
所以結論是:錯誤的評估方式只會得出錯誤的結論。
好,話題扯遠了。今天我要紀錄的是名為馬修斯相關係數 (Matthews Correlation Coefficient, MCC) 的評估指標。
這個指標我是在接觸使用 simpletransformer 這個框架時才第一次接觸到了,也是在查詢時才知道 mcc 的中文翻譯叫做馬修斯相關係數,著實汗顏。
MCC 指標基本介紹
MCC 簡單來講就是應用於單值分類的指標,能夠替我們的混淆矩陣給出一個總結。
這裡快速複習一下混淆矩陣(confusion matrix):
而 MCC 的公式也是根據混淆矩陣的 TP、FP、FN、TN 來計算的。
如果模型預測的結果對於這四種分數都有良好的分數時,才會獲得高分,這時候我們就可以認定模型對於分類的具有一定程度的可靠性。MCC 指標的範圍介於 -1 到 1 之間:
- 1 代表著預測值與實際值之間的最佳一致性(越接近 1 越好)
- 0 代表著預測值很有可能是隨機的、或是模型預測的結果不比隨機好
- -1 代表著預測值跟結論是完全不一致的,模型出現了奇怪的謬誤
好,這樣看完了定義,大部分人應該還是對於 MCC 的概念有些含糊,我想這不是大家的問題,而是我沒解說到重點。
我們看個實際的案例:
import random
from sklearn import metrics
# Labels and random choices
labels = [1] * 50 + [0] * 50
preds = [random.choice([0, 1]) for i inrange(100)]
# Metrics
print("Accuacy:", metrics.accuracy_score(labels, preds))
print("MCC:", metrics.matthews_corrcoef(labels, preds))
Output:
Accuacy: 0.45
MCC: -0.10002
我們的標準答案是前 50 個值通通都是 1、後 50 個值通通都是 0,而我們的預測是隨機產生的。
可以發現,就算 accuracy 達到了接近一半的水準,MCC 仍然告訴我們這個模型是不好用的。
下面我們修改一下程式,改成更極端的案例:
import random
from sklearn import metrics
# Labels and random choices
labels = [1] * 75 + [0] * 25
preds = [1] * 100# Metricsprint("Accuacy:", metrics.accuracy_score(labels, preds))
print("MCC:", metrics.matthews_corrcoef(labels, preds))
Output:
Accuacy: 0.75
MCC: 0.0
我們的標準答案是:有 75 個 1 類別、有 25 個 0 類別。
我們的預測答案是:全部猜 1 類別。
最後我們 Accuracy 達到了 0.75,但是 MCC 指標卻誠實地告訴了我們這個模型不比隨機預測來得好。這就是 MCC 的應用場景,可以引入模型評估階段和 Accuracy、F1-score 等指標一同工作。
References
- What is Matthew’s correlation coefficient?
- Classifiers and their Metrics Quantified – Wiley Online Library