iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0

做完機器學習的預測,我們要怎麼評估預測結果的好壞呢?

今天介紹一些名詞和使用的方法!


今天的學習目錄

範例程式碼我放在GitHub,有需要練習可以自行取用哦!

  1. 正確率(accuracy)
  2. 混淆矩陣(confusion matrix)
  3. 綜合報告-召回率(recall)、精確度(precision)

正確率(accuracy)

顯示預測結果與答案之間的正確率

提前說一下,這邊用來做使用的是昨天Day19 羅吉斯迴歸的資料,如果懶得回去看的,往上滑,在我提供的程式碼裡面已經有包含之前的程式了。

from sklearn.metrics import accuracy_score

# 正確率:比較預測出來的結果跟正確答案的正確率
print("正確率:", accuracy_score(Y_test, pred).round(2))

正確率結果

可以看到正確率是1(也就是100%正確),為什麼會這樣呢,只能說這份資料集整理得太好,而且我們還把比較不相關的資料剔除了XD

混淆矩陣

將實際答案、預測結果的組合數量分別呈現出來。

預測-有 預測-無
實際-有 真陽(TP) 假陰(FN)
實際-無 假陽(FP) 真陰(TN)

我們以預測有沒有確診來舉例--

好的指標

越多越好

  • 真陰(True negative, TN):預測沒確診,那個人也真的沒確診。
  • 真陽(True positive, TP):預測有確診,那個人也真的有確診。

不好的指標

越少越好

  • 假陽(False positive, FP):明明沒確診,卻預測他有確診。也被稱為一型錯誤(Type1 error)。
  • 假陰(False negative, FN)明明有確診,卻驗出來沒有確診。也被稱為二型錯誤(Type2 error)。

上面這個表格不太好理解嗎?那我們換一個來

預測-感染殭屍病毒 預測-沒感染
實際-感染殭屍病毒 真陽(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) |
| 代表 | 對正確樣本的識別能力 | 對錯誤樣本的分辨能力 |
| 適用時機 | 寧可殺錯一百,不可放過一個!(如抓殭屍病毒感染者的時候) | 一定要對才可以!(如手機指紋驗證的時候) |

精準度(Precision)

公式:預測正確(真陽TP)/總預測(真陽TP+假陽FP)

精準度的要求是,我不要出現假陽(FP),也就是說,我一定要正確才可以,疑似正確的這種通通給我剔除掉。

打個比方,我們在手機解鎖的時候,寧可他在我臉油油、手濕濕的情況下不給我過,我也不要別人可以打開我的手機。而假陽(FP)中,「陽」就是對的、你的指紋。

精準率想要的就是不要假陽(不要把別人的認成你的指紋)。

所以精準度越高,對錯誤樣本的分辨能力越強。

召回率(Recall)

公式:預測正確(真陽TP)/總預測(真陽TP+假陰FN)

召回率在看的是,我不要出現假陰(FN)。

比如前面的例子,我寧可把假陽(預測感染殭屍但沒事的病患)關起來,也不要出現假陰(預測沒事但其實已經感染)的情況發生。

召回率越高,代表隊正確樣本的識別能力越強。

f1-score

公式:2*((精準度*召回率)/(精準度+召回率))

精準度 & 召回率的加權平均數

f1-score的值越高,表示模型越穩健(在面對異常、未知的數據上,也能有良好的表現。)

support

各類樣本的總數量

結語

今天的內容看完,各位是學會了還是學廢了呢?(笑)

我第一次學混淆矩陣的時候,感覺自己比混淆矩陣還要混淆,這個名字真的有點威力欸。

但是混淆矩陣跟綜合報告都是很重要的概念哦,要學會才行!


上一篇
Day19 羅吉斯迴歸
下一篇
Day21 K最近鄰(KNN)
系列文
跟我一起在AI的世界裡打怪獸30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言