由於我們需要有指標來衡量一個模型的好壞,而問題可以粗略分成「分類」和「迴歸」問題。而根據不同的問題,我們所選用的衡量指標也會不同。
關於分類問題,我們先介紹什麼是混肴矩陣,會在很多機器學習的應用場景看到這個名詞哦!
如果分類問題假設只有分真和假,請看下圖,左邊欄位是代表實際的情況,上面欄位是代表預測的情況(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 (Receiver operator characteristic): 接收者操作特徵曲線,該曲線是由混淆矩陣算出
AUC (Area Under Curve): ROC 曲線下的面積
ROC 曲線是以 FPR 為 X 軸;以 TPR 為 Y 軸
FPR:
TPR:
假設我們現在有4個測試樣本,label代表 ground truth(1表示真,0表示假),score則是為真的機率值
針對第一筆,只要是 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 是 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 | 均方根誤差 |