常見損失函數和評價指標總結(附公式&代碼)

網上看到一篇很實用的帖子關於常見損失函數和評價指標,收藏下來

本文轉載於https://zhuanlan.zhihu.com/p/91511706

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

目錄

一、損失函數

1.1 迴歸問題

1.2 分類問題:

二、評價指標

2.1 迴歸問題

2.2 分類問題

參考資料:

 

一、損失函數

1.1 迴歸問題

1. 平方損失函數(最小二乘法):

迴歸問題中常用的損失函數,在線性迴歸中,可以通過極大似然估計(MLE)推導。計算的是預測值與真實值之間距離的平方和。實際更常用的是均方誤差(Mean Squared Error-MSE):

2. 平均絕對值誤差(L1)-- MAE:

MAE是目標值和預測值之差的絕對值之和,可以用來衡量預測值和真實值的距離。但是它不能給出,模型的預測值是比真實值小還是大。

3. MAE(L1) VS MSE(L2):

  • MSE計算簡便,但MAE對異常點有更好的魯棒性:當數據中存在異常點時,用MSE/RMSE計算損失的模型會以犧牲了其他樣本的誤差爲代價,朝着減小異常點誤差的方向更新。然而這就會降低模型的整體性能。

直觀上可以這樣理解:如果我們最小化MSE來對所有的樣本點只給出一個預測值,那麼這個值一定是所有目標值的平均值。但如果是最小化MAE,那麼這個值,則會是所有樣本點目標值的中位數。衆所周知,對異常值而言,中位數比均值更加魯棒,因此MAE對於異常值也比MSE更穩定。

  • NN中MAE更新梯度始終相同,而MSE則不同:MSE損失的梯度隨損失增大而增大,而損失趨於0時則會減小。

  • Loss選擇建議:

    • MSE:如果異常點代表在商業中很重要的異常情況,並且需要被檢測出來

    • MAE:如果只把異常值當作受損數據

4. Huber損失:

Huber損失是絕對誤差,只是在誤差很小時,就變爲平方誤差。

  • 當Huber損失在之間時,等價爲MSE

  • 時等價爲MAE

使用MAE訓練神經網絡最大的一個問題就是不變的大梯度,這可能導致在使用梯度下降快要結束時,錯過了最小點。而對於MSE,梯度會隨着損失的減小而減小,使結果更加精確。在這種情況下,Huber損失就非常有用。它會由於梯度的減小而落在最小值附近。比起MSE,它對異常點更加魯棒。因此,Huber損失結合了MSE和MAE的優點。但是,Huber損失的問題是我們可能需要不斷調整超參數delta。

下圖是Huber跟隨的變化曲線。當很大時,等價爲MSE曲線,當很小時,等價爲MAE曲線。

 

1.2 分類問題:

1. LogLoss:

二分類任務中常用的損失函數,在LR中,通過對似然函數取對數得到。也就是交叉熵損失函數。

2. 指數損失函數:

在AdaBoost中用到的損失函數。它是前向分步加法算法的特例,是一個加和模型。在Adaboost中,經過m此迭代之後,可以得到

Adaboost每次迭代時的目的是爲了找到最小化下列式子時的參數α 和G:

而指數損失函數(exp-loss)的標準形式如下

 

可以看出,Adaboost的目標式子就是指數損失,在給定n個樣本的情況下,Adaboost的損失函數爲:

二、評價指標

如何評估機器學習算法模型是任何項目中一個非常重要的環節。分類問題一般會選擇準確率(Accuracy)或者AUC作爲metric,迴歸問題使用MSE,但這些指標並不足以評判一個模型的好壞,接下來的內容我將儘可能包括各個評價指標。因爲損失函數大部分可以直接作爲評價指標,所以損失函數中出現過的簡單介紹。

2.1 迴歸問題

1. MAE:平均絕對誤差(Mean Absolute Error),範圍

2. MSE:均方誤差(Mean Square Error),範圍

 

3. RMSE:根均方誤差(Root Mean Square Error),範圍

取均方誤差的平方根可以使得量綱一致,這對於描述和表示是有意義的。

4. MAPE:平均絕對百分比誤差(Mean Absolute Percentage Error)

注意點:當真實值有數據等於0時,存在分母0除問題,該公式不可用!

5. SMAPE:對稱平均絕對百分比誤差(Symmetric Mean Absolute Percentage Error)

注意點:真實值、預測值均等於0時,存在分母爲0,該公式不可用!

6. R Squared:

決定係數(Coefficient of determination),被人們稱爲最好的衡量線性迴歸法的指標。

如果我們使用同一個算法模型,解決不同的問題,由於不同的數據集的量綱不同,MSE、RMSE等指標不能體現此模型針對不同問題所表現的優劣,也就無法判斷模型更適合預測哪個問題。得到的性能度量都在[0, 1]之間,可以判斷此模型更適合預測哪個問題。

公式的理解:

  1. 分母代表baseline(平均值)的誤差,分子代表模型的預測結果產生的誤差;

  2. 預測結果越大越好,爲1說明完美擬合,爲0說明和baseline一致;

7. 代碼實現:

# coding=utf-8
import numpy as np
from sklearn import metrics
from sklearn.metrics import r2_score

# MAPE和SMAPE需要自己實現
def mape(y_true, y_pred):
    return np.mean(np.abs((y_pred - y_true) / y_true)) * 100

def smape(y_true, y_pred):
    return 2.0 * np.mean(np.abs(y_pred - y_true) / (np.abs(y_pred) + np.abs(y_true))) * 100

y_true = np.array([1.0, 5.0, 4.0, 3.0, 2.0, 5.0, -3.0])
y_pred = np.array([1.0, 4.5, 3.5, 5.0, 8.0, 4.5, 1.0])

# MSE
print(metrics.mean_squared_error(y_true, y_pred)) # 8.107142857142858
# RMSE
print(np.sqrt(metrics.mean_squared_error(y_true, y_pred))) # 2.847304489713536
# MAE
print(metrics.mean_absolute_error(y_true, y_pred)) # 1.9285714285714286
# MAPE
print(mape(y_true, y_pred)) # 76.07142857142858
# SMAPE
print(smape(y_true, y_pred)) # 57.76942355889724
# R Squared
print(r2_score(y_true, y_pred))

2.2 分類問題

0. Confusion Matrix(混淆矩陣):

混淆矩陣一般不直接作爲模型的評價指標,但是他是後續多個指標的基礎。以下爲二分類的混淆矩陣,多分類的混淆矩陣和這個類似。

  預測正例 預測反例
真實正例 TP(真正例) FN(假反例)
真實反例 FP(假正例) TN(真反例)

我們訓練模型的目的是爲了降低FP和FN。很難說什麼時候降低FP,什麼時候降低FN。基於我們不同的需求,來決定降低FP還是FN。

  • 降低假負數例(FN):假設在一個癌症檢測問題中,每100個人中就有5個人患有癌症。在這種情況下,即使是一個非常差的模型也可以爲我們提供95%的準確度。但是,爲了捕獲所有癌症病例,當一個人實際上沒有患癌症時,我們可能最終將其歸類爲癌症。因爲它比不識別爲癌症患者的危險要小,因爲我們可以進一步檢查。但是,錯過癌症患者將是一個巨大的錯誤,因爲不會對其進行進一步檢查。

  • 降低假正例(FP):假設在垃圾郵件分類任務中,垃圾郵件爲正樣本。如果我們收到一個正常的郵件,比如某個公司或學校的offer,模型卻識別爲垃圾郵件(FP),那將損失非常大。所以在這種任務中,需要儘可能降低假正例。

1. Accuracy(準確率):

準確率也就是在所有樣本中,有多少樣本被預測正確。

當樣本類別均衡時,Accuracy是一個很好的指標。

但在樣本不平衡的情況下,產生效果較差。假設我們的訓練數據中只有2%的正樣本,98%的負樣本,那麼如果模型全部預測爲負樣本,準確率便是98%,。分類的準確率指標很高,會給我們一種模型很好的假象。

2. Precision(精準率):

含義:預測爲正例的樣本中有多少實際爲正;

 

3. Recall(召回率):

含義:實際爲正例的樣本有多少被預測爲正;

4. P-R曲線:

通過選擇不同的閾值,得到Recall和Precision,以Recall爲橫座標,Precision爲縱座標得到的曲線圖。

PR曲線性質:

  • 如果一個學習器的P-R曲線被另一個學習器的曲線完全包住,後者性能優於前者;

  • 如果兩個學習器的曲線相交,可以通過平衡點(如上圖所示)來度量性能;

  • 閾值下降:

    • Recall:不斷增加,因爲越來越多的樣本被劃分爲正例,假設閾值爲0.,全都劃分爲正樣本了,此時recall爲1;

    • Precision:正例被判爲正例的變多,但負例被判爲正例的也變多了,因此precision會振盪下降,不是嚴格遞減;

  • 如果有個劃分點可以把正負樣本完全區分開,那麼P-R曲線面積是1*1;

5. (加權調和平均)和 (調和平均):

  • :召回率(Recall)影響更大,eg.

  • :精確率(Precision)影響更大,eg.

爲1的時候得到

調和平均亦可推出:

6. ROC-AUC:

Area Under Curve(AUC) 是二分類問題中使用非常廣泛的一個評價指標。AUC的本質是,任取一個正樣本和負樣本,模型輸出正樣本的值大於負樣本值的概率。構成AUC的兩個基本指標是假正例率和真正例率。

  • 橫軸-假正例率: 實際爲負的樣本多少被預測爲正;

  • 縱軸-真正例率: 實際爲正的樣本多少被預測爲正;

TPR和FPR的範圍均是[0,1],通過選擇不同的閾值得到TPR和FPR,然後繪製ROC曲線。

曲線性質:

  1. 閾值最大時,對應座標點爲(0,0),閾值最小時,對應座標點(1,1)

  2. ROC曲線越靠近左上角,該分類器的性能越好;

  3. 對角線表示一個隨機猜測分類器;

  4. 若一個學習器的ROC曲線被另一個學習器的曲線完全包住,後者性能優於前者;

AUC: ROC曲線下的面積爲AUC值。

7. 代碼實現:

 

from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score,fbeta_score

y_test = [1,1,1,1,0,0,1,1,1,0,0]
y_pred = [1,1,1,0,1,1,0,1,1,1,0]

print("準確率爲:{0:%}".format(accuracy_score(y_test, y_pred)))
print("精確率爲:{0:%}".format(precision_score(y_test, y_pred)))
print("召回率爲:{0:%}".format(recall_score(y_test, y_pred)))
print("F1分數爲:{0:%}".format(f1_score(y_test, y_pred)))
print("Fbeta爲:{0:%}".format(fbeta_score(y_test, y_pred,beta =1.2)))

參考資料:

1. 分類問題性能評價指標詳述
2.AUC,ROC我看到的最透徹的講解
3.機器學習大牛最常用的5個迴歸損失函數,你知道幾個?
4.機器學習-損失函數
5.損失函數jupyter notebook
6.L1 vs. L2 Loss function
7. P-R曲線深入理解

原文鏈接:

https://zhuanlan.zhihu.com/p/91511706

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章