评估指标_机器学习评估方法与评估指标总结
離線評估方法
離線評估的基本原理是在離線環境中,將數據集劃分為“訓練集”和“測試集”,用“訓練集”訓練模型,用“測試集”評估模型,根據數據集劃分方法的不同,離線評估可以分為以下3種。
Holdout檢驗
Holdout檢驗是基礎的離線評估方法,它將原始的樣本集合隨機的劃分為訓練集和驗證集兩部分。通常選擇7:3作為劃分比例,70%的樣本用于模型的訓練,30%的樣本用于模型的評估。
Holdout的缺點是:在驗證集上計算出來的評估指標與訓練集和驗證集的劃分有直接的關系,如果僅進行少量的Holdout檢驗,則得到的結論存在較大的隨機性。為了消除這種隨機性,“交叉檢驗”的思想被提出。
交叉檢驗
???k-fold交叉驗證:先將全部樣本劃分成k個大小相等的樣本子集;依次遍歷這k個子集,每次都先把當前子集作為驗證集,其余所有子集作為訓練集,進行模型的訓練和評估;最后把所有k次的評估指標的平均值作為最終的評估指標。在實際經驗中,k通常取10。留一驗證:每次留下一個樣本作為驗證集,其余所有樣本作為測試集。樣本總數為n,依次遍歷所有n個樣本,進行n次驗證,再將評估指標求平均得到最終指標。在樣本總數較多的情況下,留一驗證發的時間開銷極大。事實上,留一驗證是留p驗證的特例。留p驗證是指每次留下p個樣本作為驗證集,而從n個元素中選擇p個元素有種可能,因此它的時間開銷遠遠高于留一驗證,故很少在實際工程中應用。自助法
不管是holdout檢驗還是交叉檢驗,都是基于劃分訓練集和測試集的方法進行模型評估的,然后當樣本規模比較小時,將樣本集進行劃分會讓訓練集進一步減小,這可能會影響模型的訓練效果。自助法可以在一定程度上解決這個問題。
自助法(Bootstrap)是基于自采樣的檢驗方法:對于總數為n的樣本集合,進行n次有放回的隨機采樣,得到大小為n的訓練集。在n次采樣過程中,有的樣本會被重復采樣,有的樣本沒有被采樣過,這些沒有被采樣的樣本作為驗證集進行模型驗證,這就是自助法的驗證過程。
離線評估指標
準確率
準確率(Accuracy)是指分類正確樣本占總樣本個數的比例,即:
其中,為被正確分類的樣本個數,為總樣本個數,TP表示預測為正并且實際也為正的樣本個數,TN表示預測為負并且實際也為負的樣本個數,FP表示預測為正但實際為負的樣本個數,FN表示預測為負但實際為正的樣本個數。
準確率是分類任務中較直觀的評價指標,雖然其具有較強的可解釋性,但也存在缺陷:(1)當不同類別的樣本比例非常不均衡時,占比大的類別往往成為影響準確率的最主要因素。例如:如果負樣本占99%,那么分類器把所有樣本都預測為負樣本可以獲得99%的準確率。(2)結果太籠統,實際應用中,我們可能更加關注某一類別樣本的情況。比如搜索時會關心 “檢索出的信息有多少是用戶感興趣的”,“用戶感興趣的信息有多少被檢測出來了” 等等。
相應地還有錯誤率:分類錯誤的樣本占總樣本的比例。其公式化描述如下:
更一般的,分類錯誤率定義為:
其中I() 是指示函數,當條件為真時,指示函數的函數值為1,否則為0。
基于此,準確率可以表示為:
而更一般的,對于數據分布D和概率密度函數p(?),錯誤率與精度可分別描述為:
采用sklearn計算準確率demo如下:
from sklearn.metrics import accuracy_scorey_pred = [0, 0, 1, 1]y_true = [1, 0, 1, 0]accuracy_score(y_true,?y_pred)?#?0.5精確率與召回率
精確率和召回率與混淆矩陣密切相關,混淆矩陣是將分類(二分類)結果通過矩陣的形式直觀展現出來:
真實情況 | 預測結果為正例 | 預測結果為反例 |
正例 | TP(真正例) | FN(假反例) |
反例 | FP(假正例) | TN(真反例) |
精確率(Precision),也稱為查準率,反映的是模型判定的精確度,預測為正樣本里面有多少是真實的正樣本。可公式化描述如下:
召回率(Recall),也叫查全率,定義為分類正確的正樣本個數占真正的正樣本個數的比例,意味著真實的正樣本有多少被找出來了。可公式化描述如下:
精確率和召回率是矛盾統一的兩個指標:為了提高精確率,分類器需要盡量在“更有把握時”,才把樣本預測為正樣本,但往往會因為過于保守而漏掉很多“沒有把握”的正樣本,導致召回率很低。比如我們想要一個模型精確率達到 100%,那就意味著要保證每一個結果都是真正例,這就會導致有些正例被放棄;相反,要保證模型能將所有正例都預測為正例,意味著有些反例也會混進來。這背后的根本原因就在于我們的數據往往是隨機、且充滿噪聲的,并不是非黑即白。
采用sklearn得到精確率和召回率的代碼如下:
from sklearn.metrics import precision_score from sklearn.metrics import recall_score Precision = precision_score(y, guesses) Recall?=?recall_score(y,?guesses)采用sklearn得到混淆矩陣的代碼如下:
from sklearn.metrics import confusion_matrix confusion_matrix(y,?guesses)P-R曲線
Precision-Recall曲線(精確率召回率曲線,簡稱P-R曲線)。P-R曲線的橫軸是召回率,縱軸是精確率。P-R曲線上的一個點代表“在某一閾值下,模型將大于該閾值的結果判定為正樣本,將下于該閾值的結果判定為負樣本時,模型預測結果對應的召回率和精確率”。
P-R曲線繪制方法如下:對模型的學習結果進行從大到小排序(一般都有一個概率值)
按照上面的順序逐個把樣本作為正例進行預測,每次都可以得到一個PR值
將得到的PR值按照R為橫坐標,P為縱坐標繪制曲線圖。
如果有多個模型就可以繪制多條 P-R 曲線:
如果某個模型的曲線完全被另外一個模型 “包住”(即后者更加凹向原點),那么后者的性能一定優于前者。
如果多個模型的曲線發生交叉,此時不好判斷哪個模型較優,一個較為合理的方法是計算曲線下面積,但這個值不太好估算。
由于BEP過于簡單,為了綜合反映Precision和Recall的結果,可以使用F1-score(F1值)。
F1-score
F1-score是精確率和召回率的調和平均值,其定義如下:
F1-score有更一般的形式:
當β > 1時,更偏向召回率
當β < 1時,更偏好精確率
當β = 1時,平衡精確率和召回率,即為 F1
多個二分類混淆矩陣的綜合考查
當有多個混淆矩陣(多次訓練、多個數據集、多分類任務)時,有兩種方式估算 “全局” 性能:
(1)macro 方法:先計算每個 PR,取平均后,再計算 F1。這樣得到的就是宏查準率(macro-P)、宏查全率(macro-R),以及相應的宏 F1(macro-F1)(2)micro 方法:先計算混淆矩陣元素的平均,再計算 PR 和 F1。這樣得到的就是微查準率(micro-P),微查全率(micro-R),微F1(micro-F1)
采用sklearn得到f1-score的代碼如下:
from??sklearn.metrics?import?f1_scoref1_score(y_true=y_test,?y_pred=y_pred)ROC曲線與AUC
ROC曲線的全稱是the Receiver Operating Characteristic曲線,中文譯為“受試者工作特征曲線”。ROC曲線的橫坐標為FalsePositive Rate(FPR,假陽性率),定義為負例樣本中被錯誤判定為正例的樣本比例;縱坐標為True Positive Rate(TPR,真陽性率,也稱為敏感度(Sensitivity)),定義為正例樣本中被正確判定為正例的樣本數比例。通常來說,ROC曲線越光滑,過擬合程度越小。FPR和TPR的計算方法如下:
在上式中,P是真實正樣本的數量,N是真實負樣本的數量;TP是P個正樣本中被分類器預測為正樣本的個數,FP是N個負樣本中被分類器預測為正樣本的個數。
?????? 對于一個特定的分類器和樣本集合,只能計算得到一對 FPR 和 TPR,也就是曲線上的一個點,而要得到一個曲線,我們需要一系列 FPR 和 TPR 的值,這又是如何得到的呢?
通常分類器在預測某個樣本的類型時,會給出這個樣本具有多大的概率屬于正類,然后根據設定的某個閾值,預測其為正類還是負類。根據某個閾值我們可以計算出相應的一對 FPR 和 TPR,通過改變閾值的大小,就可以計算出一系列的FPR和TPR了。隨著閾值的逐漸減小,越來越多的樣本被劃分為正類,但是這些正類中同樣也摻雜著真正的負類,即 TPR 和 FPR 會同時增大。當閾值取最大值1時,對應坐標點為(0,0),當閾值取最小值0時,對應坐標點為 (1,1)。
采用sklearn得到ROC的代碼如下:from sklearn.metrics import roc_curve, roc_auc_curveroc_curve(y, guesses)roc_auc_curve(y,?guesses)自實現的方式得到ROC曲線的代碼如下:
def calc_fpr(fp: int, tn: int) -> float: return fp / (fp + tn) def calc_tpr(tp: int, fn: int) -> float: return tp / (tp + fn) def get_ftpr_pairs( y_pred_prob: List[float], y_true: List[int] ) -> Tuple[List[int], List[int]]: fprs = [0] tprs = [0] for prob1 in y_pred_prob: y_pred_i = [] for prob2 in y_pred_prob: if prob2 < prob1: y_pred_i.append(0) else: y_pred_i.append(1) tp, fp, tn, fn = get_confusion_matrix(y_pred_i, y_true) fpr = calc_fpr(fp, tn) tpr = calc_tpr(tp, fn) fprs.append(fpr) tprs.append(tpr) fprs.append(1) tprs.append(1) return fprs, tprs fprs, tprs = get_ftpr_pairs(y_pred_prob, y_true)fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(12, 5))ax.plot(fprs,?tprs)除此之外,還有一種繪制 ROC 曲線的方法:假設有m+個正例,m-個負例,首先把分類閾值設為最大,即把所有樣例均設為反例,此時真正例率和假正例率均為0,在坐標(0,0)處記一個點
然后依次將每個樣本的預測值作為閾值(即將該樣本作為正例),假設前一個坐標為(x, y),若當前為真正例,對應標記點為(x, y+1/m+),若當前為假正例,則對應標記點為(x+1/m-, y)
將所有點相連即可得到ROC曲線
ROC曲線中曲線相對于隨機線的最高點,表示正例和負例分布的分離程度(一般來說分離程度越大,ROC曲線的“小山包”隆起越明顯),“小山包”的面積(ROC曲線和隨機線圍住的面積)就是Gini指數,如下圖所示:
多個模型時,與 P-R 曲線也是類似,如果某個模型的曲線完全 “包住” 另一個,則前者性能好于后者。如果曲線相互交叉,則比較曲線下面積:AUC(Area Under ROC Curve),AUC越大,性能越好。
AUC 取值一般在 0.5-1 之間,處于 y=x 直線的上方(如果不是的話,把預測概率翻轉成 1-p 就能獲得更好的模型)。AUC 值越大,說明模型越可能把真正例排在前面,性能越好。此時,假正例率很低同時真正例率很高,意味著召回高并且誤判率小。對角線對應著隨機模型(各占 50%),(0,1)點對應的是理想模型,即所有正例 100% 召回且沒有一個負例被判別為正例。
由于 ROC 曲線越靠近坐標點 (0,1) 分類器越優,所以從 AUC 判斷分類器優劣的標準如下:AUC = 1:完美分類器,采用這個預測模型時,存在至少一個閾值能得出完美預測。
0.5 < AUC < 1:優于隨機猜測。這個分類器妥善設定閾值的話,能有預測價值。
AUC = 0.5:跟隨機猜測效果一樣,分類器沒有預測價值。
AUC < 0.5:比隨機猜測還差,但只要總是反預測而行,就優于隨機猜測。
AUC 面積可以通過以下公式進行估算:
若AUC考慮的是樣本預測的排序質量,與排序誤差緊密相連,排序 “損失” loss 可定義為:
該式子的意思是,如果正例預測值小于負例,計1個罰分,如果相等則計 0.5 個罰分。顯然,該式對應的就是 ROC 曲線上面的面積。因此有:
與P-R曲線相比,ROC曲線有一個特點:當正負樣本的分布發生變化時,ROC曲線形狀能基本保持不變,而P-R曲線的形狀一般會發生比較劇烈的變化。因此,當數據不均勻時,ROC曲線更能夠反映模型好壞。而這背后的原因是:P-R曲線關注的是真實的正例和預測的正例中(分別對應 Recall 和 Precision),實際是正例的比例
ROC曲線關注的是真實的正例和負例中(分別對應 TPR 和 FPR),被預測為正例的比例
平均精確均值(meanAverage Precision,mAP)是對平均精度(Average Precision,AP)再次平均。因此需要先了解什么是平均精度
下面舉例說明。
假設模型對6個樣本的預測結果如下:
序列 | N=1 | N=2 | N=3 | N=4 | N=5 | N=6 |
真實標簽 | 1 | 0 | 0 | 1 | 1 | 1 |
其中,1代表正樣本,0代表負樣本。
按順序計算每個位置上的精確率如下:
序列 | N=1 | N=2 | N=3 | N=4 | N=5 | N=6 |
真實標簽 | 1 | 0 | 0 | 1 | 1 | 1 |
Precision | 1/1 | 1/2 | 1/3 | 2/4 | 3/5 | 4/6 |
代價曲線
在某些現實任務中,不同類型的錯誤造成的后果不同。例如在醫療診斷中,將一名癌癥患者錯誤地診斷成健康人士,將一名健康人士錯誤地診斷為癌癥患者,這兩種情況要承擔的后果是截然不同的:后者僅是增加了進一步檢查的麻煩,而前者若喪失佳治療時機,則要付出生命的代價。
為此,我們為錯誤賦予非均等代價(unequal cost)來權衡不同類型錯誤所造成的不同損失。
以二分類任務為例,我們可以為任務設置一個代價矩陣(cost matrix),如下表所示:
其中costij表示第i類樣本錯誤預測為第j類的代價。一般情況下costii=0這是因為預測正確了,就沒 有代價了。我們規定,若將第0類判別為第一類的所造成的損失更大,那么就有cost01>cost10, 損失程度越大則兩者相差越大。但這個“相差”不是表示兩者之間的差值,表示的是比值,舉個例子 cost01:cost10=5:1的效果和 cost01:cost10=50:10是相同的。前面我們考慮的性能度量都是假設在均等代價的情況下,也就是說,以減小錯誤次數為主,但不考慮不同的錯誤類型造成的后果的嚴重程度。而在非均等代價下,我們希望小化總體代價(total cost)。若設上表中第0類為正類,第1類為反類,令D+和D?分別代表樣本集中的正類樣本子集和反類樣本子集,則代價敏感(cost-sensitive)錯誤率為:
由此我們可以推出其它性能度量的代價敏感版本,或者是基于分布定義的代價敏感錯誤率。若 costij中的值不局限于0,1,還可以定義出多分類任務的代價敏感性能度量。
在非均等代價下,我們用代價曲線(cost curve)代替ROC曲線表現學習器的期望總體代價。代價曲線圖橫軸是取值為[0,1]的正例概率代價:
其中p表示樣例為正例的概率。
縱軸是取值為[0,1]的歸一化代價:
歸一化是規范化(normalization)的特例,規范化表示將不同變化范圍的值映射到某相同、固定 的范圍當中,常見的固定范圍是[0,1],這個時候就是“歸一化”。
FPR即之前定義的假正例率,FNR=1-TPR 是假反例率
代價曲線的繪制方式:(1)ROC曲線上每一點對應代價平面上的一條線段,設ROC曲線上的坐標為(FPR,TPR),計算出相應的FNR(2)在代價平面上繪制一條從(0,FPR)到(1,FNR)的線段,線段下的面積就表示了該條件下的期望總體代價(3)將ROC曲線上的每個點轉化為代價平面上的一條線段,然后取所有線段的下界,圍成的面積即為在所有條件下學習器的期望總體代價馬修斯相關系數
馬修斯相關系數,簡稱MCC,與F1-score一樣,是分類的綜合評估指標。其公式化描述如下:
從公式中可以看出MCC和2*2列聯表的卡方檢驗很相近。MCC的值域為[-1,1]。
MCC的好處是:正例和負例的不同劃分對于最終結果沒有影響
① TP = 0, FP = 0; TN = 5, FN = 95.
② TP = 95, FP = 5; TN = 0, FN = 0.
這兩種條件下(正例和負例的劃分不一樣)得到的F1-Score差異非常大(①中為0,②中為0.97),從這里還可以看出F1-Score在正負例樣本比例差異不一致的情況下會高估模型的分類效果。綜合考慮了正負例樣本比例不一致的情況
TP = 90, FP = 4; TN = 1, FN = 5. 這種條件下得到的分類正確率(Accuracy)為0.91,F1-Score為0.95,MCC得到的值為0.135. 例如風控業務中“壞”用戶占整體用戶的比例很小,如果看正確率或者F1-Score那就入坑了,此時MCC可能更合適。
Balanced Classification Rate
Balanced Classification Rate簡稱BCR,BCR為正例樣本和負例樣本中各自預測正確率的均值,與F1-score一樣,是分類的綜合評估指標。其公式化定義為:
其中,TNR (True False Rate),指負例樣本中被正確判定為負例的樣本數比例,也稱為Specificity(特異度)。其公式化描述如下:
與BCR對應的是BER(Balanced Error Rate),也稱為Half Total Error Rate(HTER)。
同MCC一樣,正負例的標簽選擇對BCR的計算沒有影響,而且一定程度上也能克服正負例樣本不均衡導致的評估指標虛高。
均方誤差
均方誤差(Mean Squared Error,簡稱MSE)誤差函數把輸出向量和真實向量映射到笛卡爾 坐標系的兩個點上,通過計算這兩個點之間的歐式距離(準確地說是歐式距離的平方)來衡 量兩個向量之間差距。其公式化描述如下:
更一般的,對于數據分布D和概率密度函數p(?),均方誤差可描述為:
MSE 誤差函數的值總是大于等于0,當MSE函數達到最小值0時,輸出等于真實標簽, 此時神經網絡的參數達到最優狀態。
均方差誤差函數廣泛應用在回歸問題中。在 TensorFlow 中,可以通過函數方式或層方式實現MSE誤差計算。例如,使用函數方式實現MSE計算,代碼如下:
# 構造網絡輸出 o?=?tf.random.normal([2,10])# 構造真實值 y_onehot = tf.constant([1,3]) y_onehot = tf.one_hot(y_onehot, depth=10) # 計算均方差loss = keras.losses.MSE(y_onehot, o) # 注意,MSE 函數返回的是每個樣本的均方差,需要在樣本維度上再次平均來獲得平均樣本的均方差# 計算 batch 均方差loss?=?tf.reduce_mean(loss)?也可以通過層方式實現,對應的類為keras.losses.MeanSquaredError(),和其他層的類一樣,調用__call__函數即可完成前向計算,代碼如下:
# 創建 MSE 類 criteon = keras.losses.MeanSquaredError() # 計算 batch 均方差loss?=?criteon(y_onehot,?o)?采用sklearn方式得到的均方誤差的代碼如下:
from sklearn.metrics import mean_squared_error y_true = [3, -0.5, 2, 7]y_pred = [2.5, 0.0, 2, 8] mean_squared_error(y_true,?y_pred)假設均方誤差損失函數表達式為:
上式中1/2項用于簡化計算,也可以利用1/K進行平均,這些縮放運算均不會改變梯度方向。則它的偏導數可以展開為:
利用復合函數導數法則分解為:
考慮到,僅當k=i時才為1,其它點都為0,也就是說,偏導數,只與第i號節點相關,與其它節點無關,因此上式中的求和符號可以去掉。均方誤差函數的導數可以推導為:
R2R2(R squared, Coefficient of determination),中文翻譯為“決定系數”或者“擬合優度”,反映的是預測值對實際值的解釋程度。其取值范圍是(0,1),R2越接近1,說明擬合效果越好。其公式化描述如下:
注意:R2和相關系數的平方不是一回事(只在簡單線性回歸條件下成立).
R2分數
R2分數(R2 Score)通過將我們的模型與最簡單的可能模型相比得出。所謂最簡單的可能模型,比如我們要擬合一個散點圖,我們可以直接畫一條直線穿過這些點。然后求出該直線模型下的均方誤差。我們希望期望模型的均方誤差比這個直線模型要小,而且是小得多,從而使得R2分數趨向于1。
采用sklearn得到R2分數的代碼如下:
from sklearn_metrics import r2_score y_true = [1, 2, 4] y_pred = [1.3, 2.5, 3.7] r2_score(y_true,?y_pred)均方根誤差
均方根誤差(RootMean Square Error,RMSE),經常用于評估回歸模型的好壞。其公式化定義如下:
其中,是第i個樣本點的真實值,是第i個樣本點的預測值,n是樣本點的個數。
一般情況下,RMSE能夠很好的反映回歸模型的預測值與真實值的偏離程度。但如果存在一些偏離程度非常大的離群點,那么即使離群點數量非常少,也會讓RMSE指標變得很差。為了解決這個問題,可以使用魯棒性更強的平均絕對百分比誤差(MeanAbsolute Percent Error,MAPE)進行評估。
平均絕對百分比誤差
平均絕對百分比誤差(MeanAbsolute Percent Error,MAPE)進行評估,MAPE的定義如下:
相比RMSE,MAPE相當于把每個點的誤差進行了歸一化,降低了離群點帶來的絕對誤差的影響。
從MAPE公式中可以看出有個明顯的缺陷,當實際值趨向0時就會得到無窮大值(實際 值的絕對值<1也會過度放大誤差)。為了避免這個問題,MAPE一般用于實際值不會為 0的情形。為了解決這個問題,提出了MAAPE(mean arctangent absolute percentage error)。
MAAPE
MAAPE(mean arctangent absolute percentage error),在保持MAPE的算法思想下解決了當實際值趨向0時就會得到無窮大值的缺陷。其公式化定義為:
平均絕對誤差
平均絕對誤差(Mean Absolute Error),又被稱為L1范數損失(l1-norm loss),定義為預測值與真實值之差的絕對值,加起來求其平均。
采用sklearn得到平均絕對誤差的代碼如下:
from sklearn.metrics import mean_absolute_errorfrom sklearn.linear_model import LinearRegressionclassifier = LinearRegression()classifier.fit(X, y)guesses = classifier.predict(X)error?=?mean_absolute_error(y,?guesses)歡迎關注,一起學習
參考:王喆,深度學習推薦系統。龍書,TensorFlow深度學習。https://mp.weixin.qq.com/s/21421H7Yp-kGDXrJtGtDZAhttps://mp.weixin.qq.com/s/oBV-WFWsCbpQcN1FssYf6Ahttps://mp.weixin.qq.com/s/Epu4g7IKOwZbxJBEK8CMIghttps://mp.weixin.qq.com/s/_38dpogJ4r3JArY9rdNDOwhttps://mp.weixin.qq.com/s/R7XUko-dpvfu6WNBTv7YRwhttps://mp.weixin.qq.com/s/0WPrEeN5rKLRxFME0dneSghttps://mp.weixin.qq.com/s/pj97tGpLdcDpOHJ9rYBmTAhttps://mp.weixin.qq.com/s/vGuNd0guGzSFMpj81r3Z2Ahttps://mp.weixin.qq.com/s/93Qs0-NqLZkP_GKO373QHwhttps://mp.weixin.qq.com/s/5kWdmi8LgdDTjJ40lqz9_A總結
以上是生活随笔為你收集整理的评估指标_机器学习评估方法与评估指标总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Springboot项目启动:报错The
- 下一篇: android创建构建方法,Androi