均方根誤差(RMSE)是對MSE的開根號

平均絕對誤差(MAE)是預(yù)測值與真實值之間的誤差取絕對值的平均

由于MAE用到了絕對值(不可導(dǎo)),很少用在訓(xùn)練的損失函數(shù)。用于最終評估模型還是可以的。

上述指標(biāo)的差異對比:

① 異常值敏感性:MAE也就是真實預(yù)測誤差,而RMSE,MSE都有加平方,放大了較大誤差樣本的影響(對于異常值更敏感),如果遇到個別偏離程度非常大的離群點時,即便數(shù)量很少,也會讓這兩個指標(biāo)變得很差。減少異常點的影響,可以采用RMSLE,它關(guān)注的是預(yù)測誤差的比例,即便存在離群點,也可以降低這些離群點的影響。

② 量綱差異:不同于MSE做了平方,RMSE(平方后又開根號)及MAE對于原量綱是不變,會更直觀些。而RMSE 與 MAE 的盡管量綱相同,RMSE比MAE實際會大一些。這是因為RMSE是先對誤差進(jìn)行平方的累加后再開方,也放大了誤差之間的差距。

③ 跨任務(wù)的量綱差異問題:實際運用中,像RMSE、MAE是有個問題的,不同任務(wù)的量綱是會變的,比如我們預(yù)測股價誤差是10元,預(yù)測房價誤差是1w,跨越了不同任務(wù)我們就沒法評估哪個模型效果更好。接下來介紹,R2分?jǐn)?shù)指標(biāo),它對上面的誤差進(jìn)一步做了歸一化,就有了統(tǒng)一的評估標(biāo)準(zhǔn)

R^2分?jǐn)?shù)常用于評估線性回歸擬合效果時,其定義如下:

R^2分?jǐn)?shù)可以視為我們模型的均方誤差除以用實際值平均值作為預(yù)測值時的均方誤差(像baseline模型)的比值。

這樣,R^2分?jǐn)?shù)范圍被歸約到了[0,1],當(dāng)其值為0時,意味著我們的模型沒有什么效果,和baseline模型那樣猜的效果一致。當(dāng)值為1,模型效果最好,意味著模型沒有任何誤差。

補(bǔ)充一點,當(dāng)R^2值為0時且模型為線性回歸時,也可以間接說明特征與標(biāo)簽沒有線性關(guān)系。

這也是常用的共線性指標(biāo)VIF的原理,分別嘗試以各個特征作為標(biāo)簽,用其他特征去學(xué)習(xí)擬合,得到線性模型R^2值,算出VIF。VIF為1即特征之間完全沒有共線性(共線性對線性模型穩(wěn)定性及可解釋性會有影響,工程上常用VIF<10作為閾值)。

1.2 分類模型的誤差評估指標(biāo)

對于分類模型的分類誤差,可以用損失函數(shù)(如交叉熵。在分類模型中交叉熵比MSE更合適,簡單來說,MSE無差別得關(guān)注全部類別上預(yù)測概率和真實概率的差。交叉熵關(guān)注的是正確類別的預(yù)測概率。)來評估:

但損失函數(shù)評估分類效果不太直觀,所以,分類任務(wù)的評估還常用f1-score、precision、recall,可以直接展現(xiàn)各種類別正確分類情況。

準(zhǔn)確率(accuracy)。即所有的預(yù)測正確(TP+TN)的占總數(shù)(TP+FP+TN+FN)的比例;

查準(zhǔn)率P(precision):是指分類器預(yù)測為Positive的正確樣本(TP)的個數(shù)占所有預(yù)測為Positive樣本個數(shù)(TP+FP)的比例;

查全率R(recall):是指分類器預(yù)測為Positive的正確樣本(TP)的個數(shù)占所有的實際為Positive樣本個數(shù)(TP+FN)的比例。

F1-score是查準(zhǔn)率P、查全率R的調(diào)和平均:

上述指標(biāo)的總結(jié):

① 綜合各類別的準(zhǔn)確度:準(zhǔn)確率accuracy對于分類錯誤情況的描述是比較直接的,但是對于正負(fù)例不平衡的情況下,accuracy評價基本沒有參考價值,比如 欺詐用戶識別的分類場景,有950個正常用戶樣本(負(fù)例),50個異常用戶(正例),模型把樣本都預(yù)測為正常用戶樣本,準(zhǔn)確率是非常好的達(dá)到95%。但實際上是分類效果很差。accuracy無法表述出少數(shù)類別錯誤分類的情況,所以更為常用的是F1-score,比較全面地考量到了查準(zhǔn)率與查全率。

② 權(quán)衡查準(zhǔn)率與查全率:查準(zhǔn)率與查全率常常是矛盾的一對指標(biāo),有時要結(jié)合業(yè)務(wù)有所偏倚低地選擇“更準(zhǔn)”或者“更全”(比如在欺詐用戶的場景里面,通常偏向于對正例識別更多“更全”,盡管會有更高的誤判。“寧愿錯殺一百,也不放走一個”),這時可以根據(jù)不同劃分閾值下的presion與recall曲線(P-R曲線),做出兩者權(quán)衡

其公式含義可解釋為總準(zhǔn)確度對比隨機(jī)準(zhǔn)確度的提升 與 完美模型對比隨機(jī)準(zhǔn)確度的提升的比值:

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)。

對于每個混淆矩陣,我們計算兩個指標(biāo)TPR(True positive rate)和FPR(False positive rate),TPR=TP/(TP+FN)=Recall 即召回率,F(xiàn)PR=FP/(FP+TN),F(xiàn)PR即為實際負(fù)樣本中,預(yù)測為正樣本占比。最后,我們以FPR為x軸,TPR為y軸畫圖,就得到了ROC曲線。

我們通過求解ROC曲線下的面積,也就是AUC(Area under Curve),AUC可以直觀的評價分類器的好壞,通常介于0.5和1之間,值越大越好。

對AUC指標(biāo)的分析總結(jié):

AUC 對比 F1-score差異

# 上述指標(biāo)可以直接調(diào)用 sklearn.metrics
from sklearn.metrics import precision_score, recall_score, f1_score, accuracy_score, roc_curve, auc, cohen_kappa_score,mean_squared_error
...
yhat = model.predict(x)

f1_score(y, yhat)

二、模型擬合程度

對于模型的擬合程度,常用欠擬合、擬合良好、過擬合來表述。通常,擬合良好的模型有更好泛化能力,在未知數(shù)據(jù)(測試集)有更好的效果。

我們可以通過訓(xùn)練及驗證集誤差(如損失函數(shù))情況評估模型的擬合程度。從整體訓(xùn)練過程來看,欠擬合時訓(xùn)練誤差和驗證集誤差均較高,隨著訓(xùn)練時間及模型復(fù)雜度的增加而下降。在到達(dá)一個擬合最優(yōu)的臨界點之后,訓(xùn)練誤差下降,驗證集誤差上升,這個時候模型就進(jìn)入了過擬合區(qū)域。

實踐中的欠擬合通常不是問題,可以通過使用強(qiáng)特征及較復(fù)雜的模型提高學(xué)習(xí)的準(zhǔn)確度。而解決過擬合,即如何減少泛化誤差,提高泛化能力,通常才是優(yōu)化模型效果的重點。對于解決過擬合,常用的方法在于提高數(shù)據(jù)的質(zhì)量、數(shù)量以及采用適當(dāng)?shù)恼齽t化策略。具體可見系列文章:一文深層解決模型過擬合

三、 模型穩(wěn)定性

如果上線的模型不穩(wěn)定,意味著模型不可控,影響決策的合理性。對于業(yè)務(wù)而言,這就是一種不確定性風(fēng)險,這是不可接受的(特別對于厭惡風(fēng)險的風(fēng)控領(lǐng)域)。

我們通常用群體穩(wěn)定性指標(biāo)(Population Stability Index,PSI),?衡量未來的(測試集)樣本及模型訓(xùn)練樣本評分的分布比例是否保持一致,以評估模型的穩(wěn)定性。同理,PSI也可以用衡量特征值的分布差異,評估數(shù)據(jù)特征層面的穩(wěn)定性。

PSI計算以訓(xùn)練樣本的模型評分作為穩(wěn)定性的參考點(預(yù)期分?jǐn)?shù)占比),衡量未來的實際預(yù)測分?jǐn)?shù)(實際分布占比)的誤差情況。計算公式為 SUM(各分?jǐn)?shù)段的 (實際占比 – 預(yù)期占比)* ln(實際占比 / 預(yù)期占比) )

具體的計算步驟及示例代碼如下:step1:將預(yù)期數(shù)值分布(開發(fā)數(shù)據(jù)集)進(jìn)行分箱離散化,統(tǒng)計各個分箱里的樣本占比。step2: 按相同分箱區(qū)間,對實際分布(測試集)統(tǒng)計各分箱內(nèi)的樣本占比。step3:計算各分箱內(nèi)的A – E和Ln(A / E),計算index = (實際占比 – 預(yù)期占比)* ln(實際占比 / 預(yù)期占比) 。step4: 將各分箱的index進(jìn)行求和,即得到最終的PSI

import?math
import?numpy?as?np
import?pandas?as?pd

def?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.去除缺失值后,統(tǒng)計兩個分布的樣本量
????????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_cnt
????????test_null_cnt?=?len(test_df)?-?test_notnull_cnt
????????
????????#?2.最小分箱數(shù)
????????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)))?#?去重復(fù)后排序
????????????score_bin_list?=?[-np.inf]?+?break_list?+?[np.inf]
????????else:
????????????score_bin_list?=?bins
????????
????????#?4.統(tǒng)計各分箱內(nèi)的樣本量
????????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.匯總統(tǒng)計結(jié)果????
????????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.計算PSI
????????????base_list?=?row['base_dist']
????????????test_dist?=?row['test_dist']
????????????#?處理某分箱內(nèi)樣本量為0的情況
????????????if?base_list?==?0?and?test_dist?==?0:
????????????????return?0
????????????elif?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_cnt
????????????????
????????????return?(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?=?None
????return?psi,?stat_df

##?也可直接調(diào)用toad包計算psi
#?prob_dev模型在訓(xùn)練樣本的評分,prob_test測試樣本的評分
psi?=?toad.metrics.PSI(prob_dev,prob_test)

分析psi指標(biāo)原理,經(jīng)過公式變形,我們可以發(fā)現(xiàn)psi的含義等同于第一項實際分布(A)與預(yù)期分布(E)的KL散度 + 第二項預(yù)期分布(E)與實際分布(A)之間的KL散度之和,KL散度可以單向(非對稱性指標(biāo))地描述信息熵差異,上式更為綜合地描述分布的差異情況。

PSI數(shù)值越小(經(jīng)驗是常以<0.1作為標(biāo)準(zhǔn)),兩個分布之間的差異就越小,代表越穩(wěn)定。

PSI值在實際應(yīng)用中的優(yōu)點在于其計算的便捷性,但需要注意的是,PSI的計算受分組數(shù)量及方式、群體樣本量和現(xiàn)實業(yè)務(wù)政策等多重因素影響,尤其是對業(yè)務(wù)變動劇烈的小樣本來說,PSI的值往往超出一般的經(jīng)驗水平,因此需要結(jié)合實際的業(yè)務(wù)和數(shù)據(jù)情況進(jìn)行具體分析。

文章轉(zhuǎn)自微信公眾號@算法進(jìn)階

上一篇:

一文通俗講透樹模型

下一篇:

機(jī)器學(xué)習(xí)降維算法匯總!
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費