做完機器學習的預測,我們要怎麼評估預測結果的好壞呢?
今天介紹一些名詞和使用的方法!
範例程式碼我放在GitHub,有需要練習可以自行取用哦!
顯示預測結果與答案之間的正確率
提前說一下,這邊用來做使用的是昨天Day19 羅吉斯迴歸的資料,如果懶得回去看的,往上滑,在我提供的程式碼裡面已經有包含之前的程式了。
from sklearn.metrics import accuracy_score
# 正確率:比較預測出來的結果跟正確答案的正確率
print("正確率:", accuracy_score(Y_test, pred).round(2))
可以看到正確率是1(也就是100%正確),為什麼會這樣呢,只能說這份資料集整理得太好,而且我們還把比較不相關的資料剔除了XD
將實際答案、預測結果的組合數量分別呈現出來。
預測-有 | 預測-無 | |
---|---|---|
實際-有 | 真陽(TP) | 假陰(FN) |
實際-無 | 假陽(FP) | 真陰(TN) |
我們以預測有沒有確診來舉例--
好的指標
越多越好
不好的指標
越少越好
預測-感染殭屍病毒 | 預測-沒感染 | |
---|---|---|
實際-感染殭屍病毒 | 真陽(TP) | 假陰(FN) |
實際-沒感染 | 假陽(FP) | 真陰(TN) |
如果這樣會不會比較好理解假陽、假陰為什麼不好XD
那假陽、假陰之間,誰又更壞一點呢?
想想,如果是末日基地在預測疑似感染者的時候,是預測錯感染者抓去關起來(FP)比較嚴重,還是放真的感染的人在基地裡趴趴走(FN)比較嚴重?
當然是後者啊!媽啊!有人變殭屍啦!快跑啊~
from sklearn.metrics import confusion_matrix
# 混淆矩陣
cf = confusion_matrix(Y_test, pred)
# 把矩陣結果加上行列的標題後,打印出來
print(pd.DataFrame(cf, columns=['預測1', '預測2', '預測3'], index=['實際1','實際2','實際3']))
還是一個跟正確率一樣漂亮的混淆矩陣(笑)
可能會有人問了,明明上面的範例是兩格,怎麼這邊變3格了,是不是弄錯了?
其實沒錯哦,畢竟有時候目標不會只有兩個,像這次我們的目標就有三種鳶尾花的屬種,理所當然就會有三個預測的結果。
但是問題來了,如果混淆矩陣長這樣,我要怎麼看那些FP、TP等等的?
如果是兩個以上的話,那每個值都會有自己的真陽、真陰、假陽、假陰,要分別看了,這會比較複雜。
我本來在寫的時候想說不要這麼麻煩,但想到之後可能還是會用到,乾脆直接講好了(認命)
有召回率、準確率等更多預測結果的相關資訊。
from sklearn.metrics import classification_report
# 印出綜合報告
print(classification_report(Y_test, pred))
我覺得資料太漂亮真的不好,全對我要怎麼講錯誤啦……不管了,我就是要硬講。
下面先比較一下這兩個常用的,因為正確率常跟他們混淆,所以也放在一起比較:
| | 召回率(Recall) | 精準度(Precision) | 正確率(accuracy) |
| --- | --- | --- |
| 公式 | TP/(TP+FN) | TP/(TP+FP) | (TP+TN)/(TP+TN+FP+FN) |
| 差別 | 我不要出現假陰(FN) | 我不要出現假陽(FP) |
| 代表 | 對正確樣本的識別能力 | 對錯誤樣本的分辨能力 |
| 適用時機 | 寧可殺錯一百,不可放過一個!(如抓殭屍病毒感染者的時候) | 一定要對才可以!(如手機指紋驗證的時候) |
公式:預測正確(真陽TP)/總預測(真陽TP+假陽FP)
精準度的要求是,我不要出現假陽(FP),也就是說,我一定要正確才可以,疑似正確的這種通通給我剔除掉。
打個比方,我們在手機解鎖的時候,寧可他在我臉油油、手濕濕的情況下不給我過,我也不要別人可以打開我的手機。而假陽(FP)中,「陽」就是對的、你的指紋。
精準率想要的就是不要假陽(不要把別人的認成你的指紋)。
所以精準度越高,對錯誤樣本的分辨能力越強。
公式:預測正確(真陽TP)/總預測(真陽TP+假陰FN)
召回率在看的是,我不要出現假陰(FN)。
比如前面的例子,我寧可把假陽(預測感染殭屍但沒事的病患)關起來,也不要出現假陰(預測沒事但其實已經感染)的情況發生。
召回率越高,代表隊正確樣本的識別能力越強。
公式:2*((精準度*召回率)/(精準度+召回率))
精準度 & 召回率的加權平均數
f1-score的值越高,表示模型越穩健(在面對異常、未知的數據上,也能有良好的表現。)
各類樣本的總數量
今天的內容看完,各位是學會了還是學廢了呢?(笑)
我第一次學混淆矩陣的時候,感覺自己比混淆矩陣還要混淆,這個名字真的有點威力欸。
但是混淆矩陣跟綜合報告都是很重要的概念哦,要學會才行!