讓混淆矩陣不再混淆
混淆矩陣是用於總結分類算法性能的技術。如果每個類中的樣本數量不等,或者數據集中有兩個以上的類,則僅用分類准確率作為評判標准的話可能會產生誤導。計算混淆矩陣可以讓我們更好地了解分類模型的表現情況以及它所犯的錯誤的類型。
閱讀這篇文章后你會了解到:
混淆矩陣是什么以及為什么需要使用混淆矩陣;
如何自己由腳本構造兩種類別的分類問題的混淆矩陣;
如何在Python中創建混淆矩陣。
1.分類准確率及其局限性
分類准確率是預測正確的樣本數與總樣本數的比值
即:分類准確率 = 預測正確的樣本數 / 總樣本數
錯誤率即: 錯誤率 = 1 - 分類准確率
分類准確率看上去是一個不錯的評判標准,但在實際當中往往卻存在着一些問題。其主要問題在於它隱藏了我們需要的細節,從而阻礙我們更好地理解分類模型的性能。 有兩個最常見的例子:
- 當我們的數據有2個以上的類時,如3個或更多類,我們可以得到80%的分類准確率,但是我們卻不知道是否所有的類別都被預測得同樣好,或者說模型是否忽略了一個或兩個類;
- 當我們的每個類中的樣本數並不接近時,我們可以達到90%或更高的准確率,但如果每100個記錄中有90個記錄屬於一個類別,則這不是一個好分數,我們可以通過始終預測最常見的類值來達到此分數。如90個樣本都屬於類別1,則我們的模型只需要預測所有的樣本都屬於類別1,便可以達到90%或更高的准確率。
分類准確率可以隱藏診斷模型性能所需的詳細信息,但幸運的是,我們可以通過混淆矩陣來進一步區分這些細節。
2.什么是混淆矩陣
混淆矩陣是對分類問題的預測結果的總結。使用計數值匯總正確和不正確預測的數量,並按每個類進行細分,這是混淆矩陣的關鍵所在。混淆矩陣顯示了分類模型的在進行預測時會對哪一部分產生混淆。它不僅可以讓您了解分類模型所犯的錯誤,更重要的是可以了解哪些錯誤類型正在發生。正是這種對結果的分解克服了僅使用分類准確率所帶來的局限性。
3.怎么計算混淆矩陣
- 我們需要具有類別標簽的測試數據集或驗證數據集;
- 對測試數據集中的每一行進行預測;
- 從類別標簽和預測結果我們可以得出:
每個類別的正確預測數量;
每個類的錯誤預測數;
- 將這些數字組織成表格或矩陣,如下所示:
表格左邊由上至下:矩陣的每一行對應一個預測的類;
表格上部:矩陣的每列對應於實際的類;
將正確和不正確分類的計數填入表中;
- 將類別的正確預測總數填進該類值的標簽行和該類值的預測列
- 將類別的錯誤預測總數填進該類值的標簽行和該類值的預測列。
該矩陣可用於易於理解的二類分類問題,但通過向混淆矩陣添加更多行和列,可輕松應用於具有3個或更多類值的問題。
讓我們通過一個例子來解釋如何建立混淆矩陣。
4.二類分類問題混淆矩陣的建立
讓我們假設我們有一個兩類分類問題,即預測照片內有男人還是女人。
我們有一個包含10個記錄的測試數據集,如下是標簽分類和模型的預測結果:
標簽分類 |
預測結果 |
男 |
女 |
男 |
男 |
女 |
女 |
男 |
男 |
女 |
男 |
女 |
女 |
女 |
女 |
男 |
男 |
男 |
女 |
女 |
女 |
首先,我們來計算分類准確率:
准確率 = 所有正確預測的樣本 / 所有樣本 = 7 / 10 = 70%
接着,我們來建立混淆矩陣:
我們需要先算出每一個類當中預測正確的數量:
“男”類:3個
“女”類:4個
然后,我們計算每一個類當中預測錯誤的數量:
“男”類:2個
“女”類:1個
現在我們可以把結果填入到一個2X2的矩陣當中:
男(標簽值) |
女(標簽值) |
|
男(預測值) |
3 |
1 |
女(預測值) |
2 |
4 |
5.二類分類問題的特殊混淆矩陣
在二類分類問題中,我們經常尋求從正常數據中區分出具有特殊性質的數據,如患病與未患病。通過這種方式,我們可以將患病事件行指定為“Positive(陽性)”,將未患病事件行指定為“Negative(陰性)”。 然后,我們可以將預測患病指定為“True(真)”,將預測未患病事件指定為“False(假)”。
由此我們可以得到:
- 正確預測患病事件值的“True Positive(真陽性)”。
- 錯誤預測患病事件值的“False Positive(假陽性)”。
- 正確預測未患病事件值的“True Negative(真陰性)”。
- 錯誤預測未患病事件值的“False Negative(假陰性)”。
我們可以在混淆矩陣中總結如下:
患病(實際) |
未患病(實際) |
|
患病(預測) |
真陽性 |
假陽性 |
未患病(預測) |
假陰性 |
真陰性 |
從混淆矩陣當中,我們可以得到更高級的分類指標:Precision(准確率),Recall(召回率),Specificity(特異性),Sensitivity(靈敏度)。
現在我們已經掌握了如何去構造混淆矩陣,接下來我們看看如何使用Python來幫助我們完成這一任務。
6.利用Python中的Scikit-Learn構造混淆矩陣
Python中的scikit-learn庫可以用於計算混淆矩陣。給定標簽值以及模型預測結果,使用confusion_matrix()函數計算混淆矩陣並將結果作為數組返回。 然后,我們可以打印此數組並解釋結果。
# 利用Python構造混淆矩陣的例子:
from sklearn.metrics import confusion_matrix
expected = [1, 1, 0, 1, 0, 0, 1, 0, 0, 0]predicted = [1, 0, 0, 1, 0, 0, 1, 1, 1, 0]
results = confusion_matrix(expected, predicted)print(results)
運行以上示例會輸出以下形式的混淆矩陣:
[[4, 2], [1, 3]]
總結
在這篇文章中,我們了解到:
- 分類准確率的局限性以及准確率在什么情況下會隱藏重要細節;
- 什么是混淆矩陣以及如何計算並解釋結果;
- 如何使用Python中的scikit-learn來計算混淆矩陣。
.
混淆矩陣
- TP(True Positive): 真實為0,預測也為0
- FN(False Negative): 真實為0,預測為1
- FP(False Positive): 真實為1,預測為0
- TN(True Negative): 真實為0,預測也為0
1.准確率 Accuracy
准確率:所有預測正確的樣本占所有樣本的比例。
所有預測正確的樣本占所有樣本的比例。
accuracy=(TP+TN)/(TP+FN+FP+TN)
2.精確率 Precision
精確率:預測結果為正例的樣本中真實為正例的比例。
precision= TPTP+FP
3.靈敏度 Sensitivity
靈敏度:即召回率(Recall),真實為正例的樣本中預測結果為正例的比例。
accuracy= TP/(TP+FN)
4.特異度 Specificity
特異度:真實為假例的樣本中預測結果為反例的結果。
accuracy= TN/(FP+TN)
5.F1-score
F1-score同時兼顧了分類模型的准確率和召回率,可以看作是模型准確率和召回率的一種加權平均。
F1-score的最大值是1,最小值是0。1代表模型輸出結果好,0代表模型輸出結果查。
F1=(2⋅precision⋅recall)/(precision+recall)