農林漁牧網

您現在的位置是:首頁 > 農業

常見損失函式和評價指標總結(附程式碼)

2022-01-15由 資料派THU 發表于 農業

決定係數可以是負數嗎

常見損失函式和評價指標總結(附程式碼)

作者:董文輝

本文長度為

4500字

,建議閱讀

10+分鐘

本文為你總結常見損失函式和評價指標。

注:本文采用markdown進行編寫,用markdown開啟可得更佳展示效果~

## 1. 損失函式:

### 1。1 迴歸問題:

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

$$L(Y,f(x)) = \sum_{i=1}^n(Y-f(X))^2$$

迴歸問題中常用的損失函式,線上性迴歸中,可以透過極大似然估計(MLE)推導。計算的是預測值與真實值之間距離的平方和。實際更常用的是**

均方誤差(MSE)

**:

$$L(Y,f(x)) = \frac{1}{m}\sum_{i=1}^n(Y-f(X))^2$$

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

$$L(Y,f(x)) = \sum_{i=1}^n|Y-f(X)|$$

MAE是目標值和預測值之差的**

絕對值之和

**,可以用來衡量預測值和真實值的距離。**

但是它不能給出,模型的預測值是比真實值小還是大。

**

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

* **MSE計算簡便,但MAE對異常點有更好的魯棒性:**

當資料中存在異常點時,用RMSE計算損失的模型會以犧牲了其他樣本的誤差為代價,朝著減小異常點誤差的方向更新。然而這就會降低模型的整體效能。

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

* **NN中MAE更新梯度始終相同,而MSE則不同**:

MSE損失的梯度隨損失增大而增大,而損失趨於0時則會減小。

* **Loss選擇建議:**

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

* **MAE:** 如果只把異常值當作受損資料。

#### 4. Huber損失:

$$

L_{\delta}(y, f(x))=\left\{\begin{array}{ll}{\frac{1}{2}(y-f(x))^{2}} & {\text { for }|y-f(x)| \leq \delta} \\ {\delta|y-f(x)|-\frac{1}{2} \delta^{2}} & {\text { otherwise }}\end{array}\right。

$$

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

[0-\delta,0+\delta]

$之間時,等價為MSE,而在$

[-∞,\delta]

$和$

[\delta,+∞]

$時為MAE。

常見損失函式和評價指標總結(附程式碼)

### 1。2 分類問題:

#### 1. LogLoss:

$$

J(\theta)=-\frac{1}{m} \sum_{i=1}^{m}\left

[y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right]

$$

**

二分類

**任務中常用的損失函式,在LR中,透過對似然函式取對數得到。也就是**

交叉熵

**損失函式。

#### 2. 指數損失函式:

$$L(y,f(x)) = \frac{1}{m} \sum_{i=1}^n{exp

[-y_if(x_i)]

}$$

在AdaBoost中用到的損失函式。

## 2.評價指標:

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

### 2。1 迴歸問題:

**1. MAE:

** 平均絕對誤差(Mean Absolute Error),範圍 $

[0,+∞)

$

$$

MAE=\frac{1}{n} \sum_{i=1}^{n}\left|\hat{y}_{i}-y_{i}\right|

$$

**2. MSE:

** 均方誤差(Mean Square Error),範圍 $[0,+∞)$

$$

MSE=\frac{1}{n} \sum_{i=1}^{n}\left(\hat{y}_{i}-y_{i}\right)^{2}

$$

**3. RMSE:

** 根均方誤差(Root Mean Square Error),範圍 $[0,+∞)$

$$

RMSE =\sqrt{\frac{1}{n} \sum_{i=1}^{n}\left(\hat{y}_{i}-y_{i}\right)^{2}}

$$

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

**4. MAPE:

** 平均絕對百分比誤差(Mean Absolute Percentage Error)

$$

MAPE=\frac{100 \%}{n} \sum_{i=1}^{n}\left|\frac{\hat{y}_{i}-y_{i}}{y_{i}}\right|

$$

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

**5. SMAPE:

** 對稱平均絕對百分比誤差(Symmetric Mean Absolute Percentage Error)

$$

SMAPE=\frac{100 \%}{n} \sum_{i=1}^{n} \frac{\left|\hat{y}_{i}-y_{i}\right|}{\left(\left|\hat{y}_{i}\right|+\left|y_{i}\right|\right) / 2}

$$

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

**6. R Squared:**

$$

R^{2}=1-\frac{\sum_{i}\left(\hat{y}^{(i)}-y^{(i)}\right)^{2}}{\sum_{i}\left(\bar{y}-y^{(i)}\right)^{2}}

$$

$R^2$即**決定係數(Coefficient of determination)**,被人們稱為最好的衡量線性迴歸法的指標。

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

之間,可以判斷此模型更適合預測哪個問題。

**公式的理解:**

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

2。 預測結果越大越好,$R^2$為1說明完美擬合,$R^2$為0說明和baseline一致;

**7. 程式碼實現:**

```python

# coding=utf-8

import numpy as np

from sklearn import metrics

# 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(準確率):

$$

Acc=\frac{T P+T N}{T P+T N+F P+F N}

$$

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

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

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

#### 2. Precision(精準率):

$$

P=\frac{T P}{T P+F P}

$$

**

含義

:** 預測為正例的樣本中有多少實際為正;

#### 3. Recall(召回率):

$$

R=\frac{T P}{T P+F N}

$$

**

含義

:** 實際為正例的樣本有多少被預測為正;

#### 4. P-R曲線:

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

常見損失函式和評價指標總結(附程式碼)

**PR曲線性質:**

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

* 如果兩個學習器的曲線相交,可以透過平衡點的來度量效能,它是“查準率=查全率”時的取值;

* **閾值為0時**:$TP=0 => Precision=0,Recall=0$ 所以PR 曲線經過 **(0,0)點**;

* **閾值上升**:

* **Recall**:不斷增加,因為越來越多的樣本被劃分為正例;

* **Precision:** 震盪下降,不是嚴格遞減;

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

#### 5. $F_{\beta }$(加權調和平均)和 $F_1$(調和平均):

$$F_{\beta }=\frac{(1+\beta ^{2})*P*R}{(\beta ^{2}*P)+R}$$

* $\beta >1$:召回率(Recall)影響更大,eg。$F_2$

* $\beta <1$:精確率(Precision)影響更大,eg。$F_{0。5}$

$\beta$為1的時候得到$F_1$:

$$F_{1}=\frac{2*P*R}{P+R}$$

調和平均亦可推出:

$$\frac{1}{F_{1}}=\frac{1}{2}*(\frac{1}{R}+\frac{1}{P})$$

#### 6. ROC-AUC:

**Area Under Curve(AUC)** 是**

二分類

**問題中使用非常廣泛的一個評價指標。**

AUC的本質是,任取一個正樣本和負樣本,模型輸出正樣本的值大於負樣本值的機率

**。構成AUC的兩個基本指標是假正例率和真正例率。

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

$$FPR=\frac{FP}{TN+FP}$$

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

$$TPR=\frac{TP}{TP+FN}$$

TPR和FPR的範圍均是

[0,1]

,透過選擇不同的閾值得到TPR和FPR,然後繪製ROC曲線。

常見損失函式和評價指標總結(附程式碼)

**曲線性質:**

1。 閾值最大時,對應**

座標點為(0,0)

**,閾值最小時,對應**

座標點(1,1)

**;

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

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

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

**AUC:**

ROC曲線下的面積為AUC值。

#### 7. 程式碼實現:

```python

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。 分類問題效能評價指標詳述]

(https://blog。csdn。net/foneone/article/details/88920256)

[2。AUC,ROC我看到的最透徹的講解]

(https://blog。csdn。net/u013385925/article/details/80385873)

[3。機器學習大牛最常用的5個迴歸損失函式,你知道幾個?]

(https://www。jiqizhixin。com/articles/2018-06-21-3)

[4。機器學習-損失函式]

(https://www。csuldw。com/2016/03/26/2016-03-26-loss-function/)

[5。損失函式jupyter notebook]

(https://nbviewer。jupyter。org/github/groverpr/Machine-Learning/blob/master/notebooks/05_Loss_Functions。ipynb)

[6。L1 vs。 L2 Loss function]

(http://rishy。github。io/ml/2015/07/28/l1-vs-l2-loss/)

[7。 P-R曲線深入理解]

(https://blog。csdn。net/b876144622/article/details/80009867)

編輯:於騰凱

作者簡介

董文輝,電子科技大學碩士,主要研究方向:推薦系統、自然語言處理和金融風控。希望能將演算法應用在更多的行業中。

—完—

關注清華-青島資料科學研究院官方微信公眾平臺“

THU資料派

”及姊妹號“

資料派THU

”獲取更多講座福利及優質內容。