【深度学习】一文深度解读模型评估方法
我們訓練學習好的模型,通過客觀地評估模型性能,才能更好實際運用決策。模型評估主要有:預測誤差情況、擬合程度、模型穩定性等方面。還有一些場景對于模型預測速度(吞吐量)、計算資源耗用量、可解釋性等也會有要求,這里不做展開。
一、評估預測誤差情況
機器學習模型預測誤差情況通常是評估的重點,它不僅僅是學習過程中對訓練數據有良好的學習預測能力,根本上在于要對新數據能有很好的預測能力(泛化能力),所以我們常通過測試集的指標表現評估模型的泛化性能。
評估模型的預測誤差常用損失函數作為指標來判斷,如回歸預測的均方損失。但除此之外,用損失函數作為評估指標有一些局限性且并不直觀(如像分類任務的評估還常用f1-score,可以直接展現各種類別正確分類情況)。在此,我們主要對回歸和分類預測任務分別解讀其常用誤差評估指標。
1.1 回歸任務的誤差評估指標
評估回歸模型的誤差,比較簡單的思路,可以對真實值與預測值的差異“取正”后求平均。如下:
均方誤差(MSE) 均方誤差(MSE)為實際值與預測值的差值取平方求平均。其中y是實際值,y^ 是預測值
均方根誤差(RMSE)
均方根誤差(RMSE)是對MSE的開根號
平均絕對誤差(MAE)
平均絕對誤差(MAE)是預測值與真實值之間的誤差取絕對值的平均
由于MAE用到了絕對值(不可導),很少用在訓練的損失函數。用于最終評估模型還是可以的。
均方根對數誤差(RMSLE)
上述指標的差異對比:
① 異常值敏感性:MAE也就是真實預測誤差,而RMSE,MSE都有加平方,放大了較大誤差樣本的影響(對于異常值更敏感),如果遇到個別偏離程度非常大的離群點時,即便數量很少,也會讓這兩個指標變得很差。減少異常點的影響,可以采用RMSLE,它關注的是預測誤差的比例,即便存在離群點,也可以降低這些離群點的影響。
② 量綱差異:不同于MSE做了平方,RMSE(平方后又開根號)及MAE對于原量綱是不變,會更直觀些。而RMSE 與 MAE 的盡管量綱相同,RMSE比MAE實際會大一些。這是因為RMSE是先對誤差進行平方的累加后再開方,也放大了誤差之間的差距。
③ 跨任務的量綱差異問題:實際運用中,像RMSE、MAE是有個問題的,不同任務的量綱是會變的,比如我們預測股價誤差是10元,預測房價誤差是1w,跨越了不同任務我們就沒法評估哪個模型效果更好。接下來介紹,R2分數指標,它對上面的誤差進一步做了歸一化,就有了統一的評估標準。
R^2分數
R^2分數常用于評估線性回歸擬合效果時,其定義如下:
R^2分數可以視為我們模型的均方誤差除以用實際值平均值作為預測值時的均方誤差(像baseline模型)的比值。這樣,R^2分數范圍被歸約到了[0,1],當其值為0時,意味著我們的模型沒有什么效果,和baseline模型那樣猜的效果一致。當值為1,模型效果最好,意味著模型沒有任何誤差。
補充一點,當R^2值為0時且模型為線性回歸時,也可以間接說明特征與標簽沒有線性關系。這也是常用的共線性指標VIF的原理,分別嘗試以各個特征作為標簽,用其他特征去學習擬合,得到線性模型R^2值,算出VIF。VIF為1即特征之間完全沒有共線性(共線性對線性模型穩定性及可解釋性會有影響,工程上常用VIF<10作為閾值)。
1.2 分類模型的誤差評估指標
對于分類模型的分類誤差,可以用損失函數(如交叉熵。在分類模型中交叉熵比MSE更合適,簡單來說,MSE無差別得關注全部類別上預測概率和真實概率的差。交叉熵關注的是正確類別的預測概率。)來評估:
但損失函數評估分類效果不太直觀,所以,分類任務的評估還常用f1-score、precision、recall,可以直接展現各種類別正確分類情況。
precision、recall、f1-score、accuracy
準確率(accuracy)。即所有的預測正確(TP+TN)的占總數(TP+FP+TN+FN)的比例;
查準率P(precision):是指分類器預測為Positive的正確樣本(TP)的個數占所有預測為Positive樣本個數(TP+FP)的比例;
查全率R(recall):是指分類器預測為Positive的正確樣本(TP)的個數占所有的實際為Positive樣本個數(TP+FN)的比例。
F1-score是查準率P、查全率R的調和平均:
上述指標的總結:
① 綜合各類別的準確度:準確率accuracy對于分類錯誤情況的描述是比較直接的,但是對于正負例不平衡的情況下,accuracy評價基本沒有參考價值,比如 欺詐用戶識別的分類場景,有950個正常用戶樣本(負例),50個異常用戶(正例),模型把樣本都預測為正常用戶樣本,準確率是非常好的達到95%。但實際上是分類效果很差。accuracy無法表述出少數類別錯誤分類的情況,所以更為常用的是F1-score,比較全面地考量到了查準率與查全率。
② 權衡查準率與查全率:查準率與查全率常常是矛盾的一對指標,有時要結合業務有所偏倚低地選擇“更準”或者“更全”(比如在欺詐用戶的場景里面,通常偏向于對正例識別更多“更全”,盡管會有更高的誤判?!皩幵稿e殺一百,也不放走一個”),這時可以根據不同劃分閾值下的presion與recall曲線(P-R曲線),做出兩者權衡。
kappa值
kappa是一個用于一致性檢驗的指標(對于分類問題,所謂一致性就是模型預測結果和實際分類結果是否一致)。kappa值計算也是基于混淆矩陣的,它一種能夠懲罰模型預測“偏向性”的指標,根據kappa的計算公式,越不平衡的混淆矩陣(即不同類別預測準度的差異大),kappa值就越低。
其公式含義可解釋為總準確度對比隨機準確度的提升 與 完美模型對比隨機準確度的提升的比值:
kappa取值為-1到1之間,通常大于0,可分為五組來表示不同級別的一致性:0.0~0.20極低的一致性(slight)、0.21~0.40一般的一致性(fair)、0.41~0.60 中等的一致性(moderate)、0.61~0.80 高度的一致性(substantial) 和 0.81~1幾乎完全一致(almost perfect)。
ROC曲線、AUC
ROC曲線(Receiver operating characteristic curve),其實是多個混淆矩陣的綜合結果。如果在上述模型中我們沒有固定閾值,而是將模型預測結果從高到低排序,將每個概率值依次作為動態閾值,那么就有多個混淆矩陣。
對于每個混淆矩陣,我們計算兩個指標TPR(True positive rate)和FPR(False positive rate),TPR=TP/(TP+FN)=Recall 即召回率,FPR=FP/(FP+TN),FPR即為實際負樣本中,預測為正樣本占比。最后,我們以FPR為x軸,TPR為y軸畫圖,就得到了ROC曲線。我們通過求解ROC曲線下的面積,也就是AUC(Area under Curve),AUC可以直觀的評價分類器的好壞,通常介于0.5和1之間,值越大越好。
對AUC指標的分析總結:
由于衡量ROC是“動態的閾值”,故AUC不依賴分類閾值,擺脫了固定分類閾值看分類效果的局限性。
ROC由不同閾值TPR、FPR繪制。更大的ROC面積(AUC)意味著較小的FPR下有更大的TPR,較小的FPR也就是較大的1-FPR = TN/(TN+FP)=TNR,所以AUC其實是TPR(也叫召回率、敏感度)與 TNR(也叫特異度)的綜合考慮。
由混淆矩陣可以看出,AUC的TNR(即1-FPR)、TPR 和樣本的實際好壞占比是無關的,它們都只關注相應實際類別的識別的全面度。(不像查準率precision是跨越了實際類別間情況做評估)。簡單來說:AUC對樣本的正負比例情況是不敏感,即使正例與負例的比例發生了很大變化,ROC曲線面積也不會產生大的變化
AUC是ROC曲線的面積,其數值的物理意義是:隨機給定一正一負兩個樣本,將正樣本預測分值大于負樣本的概率大小。也就是,AUC是區分能力的“排序性”指標(正樣本高于負樣本的概率分值即可),對具體的判定概率不敏感——忽略了模型的擬合效果,而對于一個優秀的模型而言,我們期望的是正負樣本的概率值是差異足夠大的。舉個栗子,模型將所有負樣本預測為0.49,正樣本預測為0.51,那這個模型auc即是1(但正負樣本的概率很接近,一有擾動 模型就預測錯了)。而我們期望模型的預測好壞的間隔盡量大,如負樣本預測為0.1以下,正樣本預測為0.8以上,此時雖然auc一樣,但這樣的模型擬合效果更好,比較有魯棒性。
AUC 對比 F1-score差異
AUC不依賴分類閾值,F1-score需指定閾值,不同閾值結果有差異;
當正負樣本比例變化時,AUC影響不大,F1-score會有比較大影響(因為查準率precision是跨越了實際類別間情況做評估);
兩者有包含召回率(正樣本識別全面度情況)并有兼顧到FP(負樣本誤識別為正樣本情況),都要求了“全”與“準”的均衡。
F1-score可以通過閾值靈活地調節查全率、查準率不同側重偏好。而AUC只能給一個籠統的信息。
二、模型擬合程度
對于模型的擬合程度,常用欠擬合、擬合良好、過擬合來表述。通常,擬合良好的模型有更好泛化能力,在未知數據(測試集)有更好的效果。
我們可以通過訓練及驗證集誤差(如損失函數)情況評估模型的擬合程度。從整體訓練過程來看,欠擬合時訓練誤差和驗證集誤差均較高,隨著訓練時間及模型復雜度的增加而下降。在到達一個擬合最優的臨界點之后,訓練誤差下降,驗證集誤差上升,這個時候模型就進入了過擬合區域。實踐中的欠擬合通常不是問題,可以通過使用強特征及較復雜的模型提高學習的準確度。而解決過擬合,即如何減少泛化誤差,提高泛化能力,通常才是優化模型效果的重點。對于解決過擬合,常用的方法在于提高數據的質量、數量以及采用適當的正則化策略。具體可見系列文章:一文深層解決模型過擬合
三、 模型穩定性
如果上線的模型不穩定,意味著模型不可控,影響決策的合理性。對于業務而言,這就是一種不確定性風險,這是不可接受的(特別對于厭惡風險的風控領域)。
我們通常用群體穩定性指標(Population Stability Index,PSI), 衡量未來的(測試集)樣本及模型訓練樣本評分的分布比例是否保持一致,以評估模型的穩定性。同理,PSI也可以用衡量特征值的分布差異,評估數據特征層面的穩定性。
PSI計算以訓練樣本的模型評分作為穩定性的參考點(預期分數占比),衡量未來的實際預測分數(實際分布占比)的誤差情況。計算公式為 SUM(各分數段的 (實際占比 - 預期占比)* ln(實際占比 / 預期占比) )具體的計算步驟及示例代碼如下:
step1:將預期數值分布(開發數據集)進行分箱離散化,統計各個分箱里的樣本占比。
step2: 按相同分箱區間,對實際分布(測試集)統計各分箱內的樣本占比。
step3:計算各分箱內的A - E和Ln(A / E),計算index = (實際占比 - 預期占比)* ln(實際占比 / 預期占比) 。
step4: 將各分箱的index進行求和,即得到最終的PSI
import?math import?numpy?as?np import?pandas?as?pddef?calculate_psi(base_list,?test_list,?bins=20,?min_sample=10):try:base_df?=?pd.DataFrame(base_list,?columns=['score'])test_df?=?pd.DataFrame(test_list,?columns=['score'])?#?1.去除缺失值后,統計兩個分布的樣本量base_notnull_cnt?=?len(list(base_df['score'].dropna()))test_notnull_cnt?=?len(list(test_df['score'].dropna()))#?空分箱base_null_cnt?=?len(base_df)?-?base_notnull_cnttest_null_cnt?=?len(test_df)?-?test_notnull_cnt#?2.最小分箱數q_list?=?[]if?type(bins)?==?int:bin_num?=?min(bins,?int(base_notnull_cnt?/?min_sample))q_list?=?[x?/?bin_num?for?x?in?range(1,?bin_num)]break_list?=?[]for?q?in?q_list:bk?=?base_df['score'].quantile(q)break_list.append(bk)break_list?=?sorted(list(set(break_list)))?#?去重復后排序score_bin_list?=?[-np.inf]?+?break_list?+?[np.inf]else:score_bin_list?=?bins#?4.統計各分箱內的樣本量base_cnt_list?=?[base_null_cnt]test_cnt_list?=?[test_null_cnt]bucket_list?=?["MISSING"]for?i?in?range(len(score_bin_list)-1):left??=?round(score_bin_list[i+0],?4)right?=?round(score_bin_list[i+1],?4)bucket_list.append("("?+?str(left)?+?','?+?str(right)?+?']')base_cnt?=?base_df[(base_df.score?>?left)?&?(base_df.score?<=?right)].shape[0]base_cnt_list.append(base_cnt)test_cnt?=?test_df[(test_df.score?>?left)?&?(test_df.score?<=?right)].shape[0]test_cnt_list.append(test_cnt)#?5.匯總統計結果????stat_df?=?pd.DataFrame({"bucket":?bucket_list,?"base_cnt":?base_cnt_list,?"test_cnt":?test_cnt_list})stat_df['base_dist']?=?stat_df['base_cnt']?/?len(base_df)stat_df['test_dist']?=?stat_df['test_cnt']?/?len(test_df)def?sub_psi(row):#?6.計算PSIbase_list?=?row['base_dist']test_dist?=?row['test_dist']#?處理某分箱內樣本量為0的情況if?base_list?==?0?and?test_dist?==?0:return?0elif?base_list?==?0?and?test_dist?>?0:base_list?=?1?/?base_notnull_cnt???elif?base_list?>?0?and?test_dist?==?0:test_dist?=?1?/?test_notnull_cntreturn?(test_dist?-?base_list)?*?np.log(test_dist?/?base_list)stat_df['psi']?=?stat_df.apply(lambda?row:?sub_psi(row),?axis=1)stat_df?=?stat_df[['bucket',?'base_cnt',?'base_dist',?'test_cnt',?'test_dist',?'psi']]psi?=?stat_df['psi'].sum()except:print('error!!!')psi?=?np.nan?stat_df?=?Nonereturn?psi,?stat_df##?也可直接調用toad包計算psi #?prob_dev模型在訓練樣本的評分,prob_test測試樣本的評分 psi?=?toad.metrics.PSI(prob_dev,prob_test)分析psi指標原理,經過公式變形,我們可以發現psi的含義等同于第一項實際分布(A)與預期分布(E)的KL散度 + 第二項預期分布(E)與實際分布(A)之間的KL散度之和,KL散度可以單向(非對稱性指標)地描述信息熵差異,上式更為綜合地描述分布的差異情況。
PSI數值越小(經驗是常以<0.1作為標準),兩個分布之間的差異就越小,代表越穩定。PSI值在實際應用中的優點在于其計算的便捷性,但需要注意的是,PSI的計算受分組數量及方式、群體樣本量和現實業務政策等多重因素影響,尤其是對業務變動劇烈的小樣本來說,PSI的值往往超出一般的經驗水平,因此需要結合實際的業務和數據情況進行具體分析。
(END)
文章首發公眾號“算法進階”,閱讀原文可訪問文章相關代碼
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載黃海廣老師《機器學習課程》視頻課黃海廣老師《機器學習課程》711頁完整版課件
本站qq群955171419,加入微信群請掃碼:
總結
以上是生活随笔為你收集整理的【深度学习】一文深度解读模型评估方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python二叉树遍历
- 下一篇: 搜狐视频app如何设置仅自己可看我的关注