在資料挖掘或機器學習模組化後往往會面臨一個問題,就是該模型是否可靠?可靠性如何?也就是說模型的性能如何我們暫時不得而知。
如果模型不加驗證就使用,那後續出現的問題将會是不可估計的。是以通常模組化後我們都會使用模型評估方法進行驗證,當驗證結果處于我們的可控範圍之内或者效果更佳,那該模型便可以進行後續的進一步操作。
這裡又将面臨一個新的問題——如何選擇評估方法,其實通常很多人都會使用比較簡單的錯誤率來衡量模型的性能,錯誤率指的是在所有測試樣例中錯分的樣例比例。實際上,這樣的度量錯誤掩蓋了樣例如何被分錯的事實。其實相對于不同的問題會有不同的評估思路:
回歸模型:
對于回歸模型的評估方法,我們通常會采用平均絕對誤差(MAE)、均方誤差(MSE)、平均絕對百分比誤差(MAPE)等方法。
聚類模型:
對于聚類模型的評估方法,較為常見的一種方法為輪廓系數(Silhouette Coefficient ),該方法從内聚度和分離度兩個方面入手,用以評價相同資料基礎上不同聚類算法的優劣。
分類模型:
本篇文章将會主要描述分類模型的一種評估方法——混淆矩陣。對于二分類問題,除了計算正确率方法外,我們常常會定義正類和負類,由真實類别(行名)與預測類别(列名)構成混淆矩陣。
首先直覺的來看看(混淆矩陣圖):
文字詳細說明:
- TN:将負類預測為負類(真負類)
- FN:将正類預測為負類(假負類)
- TP:将正類預測為正類(真正類)
- FP:将負類預測為正類(假正類)
最後根據混淆矩陣得出分類模型常用的分類評估名額:
準确率 Accuracy:
測試樣本中正确分類的樣本數占總測試的樣本數的比例。公式如下:
scikit-learn 準确率的計算方法:
sklearn.metrics.accuracy_score(y_true, y_pred)
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_predict)
精确率 Precision:
準确率又叫查準率,測試樣本中正确分類為正類的樣本數占分類為正類樣本數的比例。公式如下:
scikit-learn 精确率的計算方法:
sklearn.metrics.precision_score(y_true, y_pred)
from sklearn.metrics import precision_score
precision_score(y_test, y_predict)
召回率 Recall:
召回率又稱查全率,測試樣本中正确分類為正類的樣本數占實際為正類樣本數的比例。公式如下:
scikit-learn 召回率的計算方法:
sklearn.metrics.recall_score(y_true, y_pred)
from sklearn.metrics import recall_score
recall_score(y_test, y_predict)
F1 值:
F1 值是查準率和召回率的權重平均數。F1 相當于精确率和召回率的綜合評價名額,對衡量資料更有利,更為常用。 公式如下:
scikit-learn F1的計算方法:
sklearn.metrics.f1_score(y_true, y_pred)
from sklearn.metrics import f1_score
f1_score(y_test, y_predict)
ROC 曲線:
在部分分類模型中(如:邏輯回歸),通常會設定一個門檻值如0.5,當大于0.5歸為正類,小于則歸為負類。是以,當減小門檻值如0.4時,模型将會劃分更多測試樣本為正類。這樣的結果是提高了正類的分類率,但同時也會使得更多負類被錯分為正類。
在ROC 曲線中有兩個參數名額——TPR、FPR,公式如下:
TPR 代表能将正例分對的機率(召回率),而 FPR 則代表将負例錯分為正例的機率。
TPR作為ROC 曲線的縱坐标,FPR作為ROC曲線的橫坐标,如下圖:
由圖可得:
- 當 FPR=0,TPR=0 時,意味着将每一個執行個體都預測為負例。
- 當 FPR=1,TPR=1 時,意味着将每一個執行個體都預測為正例。
- 當 FPR=0,TPR=1 時,意味着為最優分類器點。
是以一個優秀的分類器對應的ROC曲線應該盡量靠近左上角,越接近45度直線時效果越差。
scikit-learn ROC曲線的計算方法:
sklearn.metrics.roc_curve(y_true, y_score)
AUC 值:
AUC 的全稱為 Area Under Curve,意思是曲線下面積,即 ROC 曲線下面積 。通過AUC我們能得到一個準确的數值,用來衡量分類器好壞。
- AUC=1:最佳分類器。
- 0.5<AUC<1:分類器優于随機猜測。
- AUC=0.5:分類器和随機猜測的結果接近。
- AUC<0.5:分類器比随機猜測的結果還差。
scikit-learn AUC的計算方法:
sklearn.metrics.auc(y_true, y_score)
from matplotlib import pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve
from sklearn.metrics import auc
model = LogisticRegression()
model.fit(X_train,y_train.ravel())
y_score = model.decision_function(X_test) # model訓練好的分類模型
fpr, tpr, _ = roc_curve(y_test, y_score) # 獲得FPR、TPR值
roc_auc = auc(fpr, tpr) # 計算AUC值
plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', linestyle='--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend()
plt.show()
由于(精準率、召回率)與(偏差、方差)很相似,都是一對需要平衡的衡量值,(偏差、方差)衡量模型的拟合能力與泛化能力,而(精準率、召回率)則需要考慮的情況更多,主要如下3點:
1:如果某個業務需要控制一定的成本,同時還想要最大限制的預測出更多的問題。(精确率、召回率 平衡)
2:(極端情況)如果某個業務成本可以最大化,隻要得出所有的可能性。(犧牲精确率,提高召回率)
3:(極端情況)如果某個業務成本需要最小化,隻要模型不出錯即可。(犧牲召回率,提高精确率)
提高門檻值,如邏輯回歸中修改sigmoid函數的判斷門檻值k=0.5,我們來看看精确率與召回率的變化情況:
1:提高k大于0.5,精确率提高,召回率下降
2:降低k小于0.5,精确率下降,召回率提高