【機器學習】模型選擇(性能度量)原理及實戰(zhàn)
0.概述
模型的好壞是相對的。什么樣的模型是好的,即取決于算法和數(shù)據(jù),也取決于任務需求。
1. 回歸任務的性能度量
均方誤差
均方誤差是回歸任務最常用的性能度量,表示預測值和實際值之間的誤差。
2. 分類任務的性能度量
| 真實情況 | 預測結(jié)果 | |
| 正例 | 反例 | |
| 正例 | TP(真正例) | FN(假反例) |
| 反例 | FP(假正例) | TN(真反例) |
精度:分類正確的樣本占總樣本的比例 TP+FN/總例數(shù)
查準率:預測正確的樣本中實際為正確的比例 TP/(TP+FP)
查全率:正例中預測正確的比例 TP/(TP+FN)
F1:查準率和查全率的平均
ROC與AUC
許多機器學習方法分類的方式是為測試樣本產(chǎn)生一個實值(或概率預測),并將其與設定好的閾值相比較,大于閾值的分為正類,小于閾值的分為負類。我們可以根據(jù)實值的大小,即按是正例的可能性將樣本進行排序。分類過程就是在這個排序中找到某個“截斷點”將前面一部分判做正例,后面一部分判做反例。
ROC曲線是以每一個實值作為閾值,并衡量模型性能的方法。它以真正例率TPR=TP/(TP+FN)為橫坐標,假正例率FPR=FP/(TN+FP)為橫坐標。每次按順序嘗試一個實值作為閾值進行測試。
真正例率和反正例率的分母是實際的正例和反例數(shù)量,是一個固定的數(shù),因此他們與TP和FP成正比。

上圖是ROC的一個示例。點(0,1)對應將所有正例劃分在反例前面的理想模型。橙色線對應一條實際情況下的ROC曲線。開始時,閾值的取值較高,只有前幾個數(shù)作為正例,假正例數(shù)量為0,假正例率為0。隨著閾值的降低,更多的樣本被劃分為正例,真假正例的數(shù)量都在增多,真假正例率也均有提升。閾值增高到一定程度時,排序靠后的樣本全部為實際反例。于是真正例率不再增加,反正例率逐漸增加至1。得到一個數(shù)列fpr,tpr可以使用sklearn.metrics中的roc_curve([實際結(jié)果],[分數(shù)])
AUC是ROC曲線的線下面積,衡量了預測的排序質(zhì)量,是一種綜合性指標。AUC=1時,ROC曲線是(0, 0), (0, 1), (1, 1)連接起來的折線,代表所有正例在反例之前的完美排序。AUC=接近1/2時,ROC接近(0, 0)和(1, 1)連接起來的直線,代表排序的方式接近于完全隨機。計算auc的方法是應用sklearn.metrics中的roc_auc([fpr],[tpr])
代價敏感錯誤率
適用于錯誤類型造成的后果不同,如患者診斷為健康人(錯過治療)和健康人診斷為患者(檢查費用)
根據(jù)錯誤類型的不同給FP和FN按一定比例相加除以樣例數(shù)即為代價敏感錯誤率。
3. 代碼示例
畫出ROC曲線,計算AUC值
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier
# 導入鳶尾花數(shù)據(jù)集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 二進制化輸出
y = label_binarize(y, classes=[0, 1, 2])
n_classes = y.shape[1]
# 切分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5, random_state=0)
# 應用SVM進行評分
classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True,))
y_score = classifier.fit(X_train, y_train).decision_function(X_test)
# 為每個類別計算ROC曲線和AUC
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
# 這里用roc_curve得到了每個點的fpr,tpr值,參數(shù)是測試樣本實際結(jié)果和評分的的第i列
fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
# 這里用auc函數(shù)得到每個點的auc
roc_auc[i] = auc(fpr[i], tpr[i])
plt.figure()
lw = 2
# 畫出ROC曲線,標出AUC值
plt.plot(fpr[1], tpr[1], color='darkorange', lw=lw, label='ROC curve (area = %0.4f)' % roc_auc[1])
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()

- EOF -
往期精彩回顧
適合初學者入門人工智能的路線及資料下載 (圖文+視頻)機器學習入門系列下載 中國大學慕課《機器學習》(黃海廣主講) 機器學習及深度學習筆記等資料打印 《統(tǒng)計學習方法》的代碼復現(xiàn)專輯 機器學習交流qq群955171419,加入微信群請掃碼
