iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0

由於我們需要有指標來衡量一個模型的好壞,而問題可以粗略分成「分類」和「迴歸」問題。而根據不同的問題,我們所選用的衡量指標也會不同。

分類

關於分類問題,我們先介紹什麼是混肴矩陣,會在很多機器學習的應用場景看到這個名詞哦!

混肴矩陣(Confusion Matrix)

如果分類問題假設只有分真和假,請看下圖,左邊欄位是代表實際的情況,上面欄位是代表預測的情況(2x2情況)

(如果分類有3種,那混肴矩陣就會變成3x3情況,依此類推)

  • False Positive 是 Type Ⅰ Error

  • False Negative 是 Type Ⅱ Error,通常型二錯誤是比較嚴重的錯誤

  • Accuracy: 準確率,計算正確預測的佔比

  • Precision: 精準率,計算在預測情況為真,實際情況為真的佔比

  • Recall: 召回率,計算在實際情況為真,預測情況為真的佔比

  • F1-Score: 是 percision 和 recall 的調和平均,會考慮兩個指標

    或是

為什麼我們要有不同的指標,難道不能只看準確率(Accuracy)嗎?

假設有一個模型預測癌症,一萬人之中真實只有10人獲得癌症,因此該模型都只要回覆健康,準確率高達 99.90%

但這並不是我們所想要的,我們就是想要找出誰有得癌症!準確率再高也解決不了醫生的需求,根本只是盲猜

在此,癌症病患是我們想要預測的事情,很顯然地,由於沒有判斷出任何一個有癌症的病患,使用其他指標均會 0

因此通常會看問題的種類而決定要使用的評估指標:

  • Recall: 由於型二錯誤(FN)代價很高(實際是癌症但卻檢驗不是)

  • Precision: 由於型一錯誤(FP)代價很高(例如把正常郵件辨識為垃圾郵件)

  • F1 score: 綜合考量以上兩個指標

ROC曲線與AUC

  • ROC (Receiver operator characteristic): 接收者操作特徵曲線,該曲線是由混淆矩陣算出

  • AUC (Area Under Curve): ROC 曲線下的面積

ROC 曲線是以 FPR 為 X 軸;以 TPR 為 Y 軸

  • FPR:

  • TPR:

假設我們現在有4個測試樣本,label代表 ground truth(1表示真,0表示假),score則是為真的機率值

    1. 對 score 做降冪排序,可以得到右表
    1. 針對每一個依序計算 TPR、FPR

實際計算

針對第一筆,只要是 score 超過 0.9 都視為真

precistion:預測為真,真實是真的機率是 1

TPR: 真實為真,預測是真的機率是 0.5

FPR: 真實為假,預測是真的機率是 0

針對第二筆,只要是 score 超過 0.6 都視為真

precistion:預測為真,真實是真的機率是 0.5

TPR: 真實為真,預測是真的機率是 0.5

FPR: 真實為假,預測是真的機率是 0.5

最後完成此表可以得到

由上表我們可以得到 (FPR, TPR)

(0, 0.5)

(0.5,0.5)

(0.5,1)

(1,1)

得到這些點並連線就是 ROC 曲線

程式繪製

import numpy as np
from sklearn.metrics import roc_curve, auc
y = np.array([0, 0, 1, 1])
scores = np.array([0.1, 0.6, 0.4, 0.9])
fpr, tpr, _ = roc_curve(y, scores)
roc_auc = auc(fpr, tpr)

import matplotlib.pyplot as plt

plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

AUC

最好的模型是繪製到左上角,反之則差
而 AUC 是 ROC 的曲線下的面積,因此介於 0~1 之間,而藍色的線代表是隨機猜測的模型

AUC 可以表示一個模型的好壞,一般的標準是:

AUC 說明
1 最好的模型
> 0.85 效果很好
0.7 ~ 0.85 效果一般
0.5 ~ 0.7 效果低
0.5 隨機猜測的模型(丟銅板)
<0.5 比隨機猜測還要差的模型
# 複雜一點的交給程式來畫吧!

import numpy as np
from sklearn.metrics import roc_curve, auc
y = np.array([1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0])
scores = np.array([0.99, 0.44, 0.19, 0.33, 0.7, 0.32, 0.64, 0.54, 0.28, 0.16, 0.83, 0.67, 0.51, 0.60, 0.55, 0.49, 0.69, 0.65, 0.19, 0.47])
fpr, tpr, _ = roc_curve(y, scores)
roc_auc = auc(fpr, tpr)

import matplotlib.pyplot as plt

plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

迴歸

預測值要與真實值越近越好,因此下面兩個指標如果越大代表模型越不好

指標 中文 數學式
Mean Squared Error, MSE 均方誤差
Mean Absolute Error, MAE 平均絕對誤差
Root Mean Absolute Error, RMAE 均方根誤差

上一篇
Day 15 : 機器學習介紹
下一篇
Day 17 : 模型前的資料處理 (1)
系列文
Python資料分析學習地圖30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言