自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

十個常用的損失函數(shù)解釋以及Python代碼實(shí)現(xiàn)

開發(fā) 前端
損失函數(shù)是一種衡量模型與數(shù)據(jù)吻合程度的算法。損失函數(shù)測量實(shí)際測量值和預(yù)測值之間差距的一種方式。損失函數(shù)的值越高預(yù)測就越錯誤,損失函數(shù)值越低則預(yù)測越接近真實(shí)值。

什么是損失函數(shù)?

損失函數(shù)是一種衡量模型與數(shù)據(jù)吻合程度的算法。損失函數(shù)測量實(shí)際測量值和預(yù)測值之間差距的一種方式。損失函數(shù)的值越高預(yù)測就越錯誤,損失函數(shù)值越低則預(yù)測越接近真實(shí)值。對每個單獨(dú)的觀測(數(shù)據(jù)點(diǎn))計(jì)算損失函數(shù)。將所有損失函數(shù)(loss function)的值取平均值的函數(shù)稱為代價函數(shù)(cost function),更簡單的理解就是損失函數(shù)是針對單個樣本的,而代價函數(shù)是針對所有樣本的。

損失函數(shù)與度量指標(biāo)

一些損失函數(shù)也可以被用作評價指標(biāo)。但是損失函數(shù)和度量指標(biāo)(metrics)有不同的目的。雖然度量指標(biāo)用于評估最終模型并比較不同模型的性能,但損失函數(shù)在模型構(gòu)建階段用作正在創(chuàng)建的模型的優(yōu)化器。損失函數(shù)指導(dǎo)模型如何最小化誤差。

也就是說損失函數(shù)是知道模型如何訓(xùn)練的,而度量指標(biāo)是說明模型的表現(xiàn)的。

為什么要用損失函數(shù)?

由于損失函數(shù)測量的是預(yù)測值和實(shí)際值之間的差距,因此在訓(xùn)練模型時可以使用它們來指導(dǎo)模型的改進(jìn)(通常的梯度下降法)。在構(gòu)建模型的過程中,如果特征的權(quán)重發(fā)生了變化得到了更好或更差的預(yù)測,就需要利用損失函數(shù)來判斷模型中特征的權(quán)重是否需要改變,以及改變的方向。

我們可以在機(jī)器學(xué)習(xí)中使用各種各樣的損失函數(shù),這取決于我們試圖解決的問題的類型、數(shù)據(jù)質(zhì)量和分布以及我們使用的算法,下圖為我們整理的10個常見的損失函數(shù):

回歸問題

1、均方誤差(MSE)

均方誤差是指所有預(yù)測值和真實(shí)值之間的平方差,并將其平均值。常用于回歸問題。

def MSE (y, y_predicted):sq_error = (y_predicted - y) ** 2sum_sq_error = np.sum(sq_error)mse = sum_sq_error/y.sizereturn mse

2、平均絕對誤差(MAE)

作為預(yù)測值和真實(shí)值之間的絕對差的平均值來計(jì)算的。當(dāng)數(shù)據(jù)有異常值時,這是比均方誤差更好的測量方法。

def MAE (y, y_predicted):error = y_predicted - yabsolute_error = np.absolute(error)total_absolute_error = np.sum(absolute_error)mae = total_absolute_error/y.sizereturn mae

3、均方根誤差(RMSE)

這個損失函數(shù)是均方誤差的平方根。如果我們不想懲罰更大的錯誤,這是一個理想的方法。

def RMSE (y, y_predicted):sq_error = (y_predicted - y) ** 2total_sq_error = np.sum(sq_error)mse = total_sq_error/y.sizermse = math.sqrt(mse)return rmse

4、平均偏差誤差(MBE)

類似于平均絕對誤差但不求絕對值。這個損失函數(shù)的缺點(diǎn)是負(fù)誤差和正誤差可以相互抵消,所以當(dāng)研究人員知道誤差只有一個方向時,應(yīng)用它會更好。

def MBE (y, y_predicted):error = y_predicted - ytotal_error = np.sum(error)mbe = total_error/y.sizereturn mbe

5、Huber損失

Huber損失函數(shù)結(jié)合了平均絕對誤差(MAE)和均方誤差(MSE)的優(yōu)點(diǎn)。這是因?yàn)镠ubber損失是一個有兩個分支的函數(shù)。一個分支應(yīng)用于符合期望值的MAE,另一個分支應(yīng)用于異常值。Hubber Loss一般函數(shù)為:

這里的

def hubber_loss (y, y_predicted, delta)delta = 1.35 * MAEy_size = y.sizetotal_error = 0for i in range (y_size):erro = np.absolute(y_predicted[i] - y[i])if error < delta:hubber_error = (error * error) / 2else:hubber_error = (delta * error) / (0.5 * (delta * delta))total_error += hubber_errortotal_hubber_error = total_error/y.sizereturn total_hubber_error

二元分類

6、最大似然損失(Likelihood Loss/LHL)

該損失函數(shù)主要用于二值分類問題。將每一個預(yù)測值的概率相乘,得到一個損失值,相關(guān)的代價函數(shù)是所有觀測值的平均值。讓我們用以下二元分類的示例為例,其中類別為[0]或[1]。如果輸出概率等于或大于0.5,則預(yù)測類為[1],否則為[0]。輸出概率的示例如下:

[0.3 , 0.7 , 0.8 , 0.5 , 0.6 , 0.4]

對應(yīng)的預(yù)測類為:

[0 , 1 , 1 , 1 , 1 , 0]

而實(shí)際的類為:

[0 , 1 , 1 , 0 , 1 , 0]

現(xiàn)在將使用真實(shí)的類和輸出概率來計(jì)算損失。如果真類是[1],我們使用輸出概率,如果真類是[0],我們使用1-概率:

((1–0.3)+0.7+0.8+(1–0.5)+0.6+(1–0.4)) / 6 = 0.65

Python代碼如下:

def LHL (y, y_predicted):likelihood_loss = (y * y_predicted) + ((1-y) * (y_predicted))total_likelihood_loss = np.sum(likelihood_loss)lhl = - total_likelihood_loss / y.sizereturn lhl

7、二元交叉熵(BCE)

這個函數(shù)是對數(shù)的似然損失的修正。對數(shù)列的疊加可以懲罰那些非常自信但是卻錯誤的預(yù)測。二元交叉熵?fù)p失函數(shù)的一般公式為:

— (y . log (p) + (1 — y) . log (1 — p))

讓我們繼續(xù)使用上面例子的值:

輸出概率= [0.3、0.7、0.8、0.5、0.6、0.4]

實(shí)際的類= [0,1,1,0,1,0]

— (0 . log (0.3) + (1–0) . log (1–0.3)) = 0.155

— (1 . log(0.7) + (1–1) . log (0.3)) = 0.155

— (1 . log(0.8) + (1–1) . log (0.2)) = 0.097

— (0 . log (0.5) + (1–0) . log (1–0.5)) = 0.301

— (1 . log(0.6) + (1–1) . log (0.4)) = 0.222

— (0 . log (0.4) + (1–0) . log (1–0.4)) = 0.222

那么代價函數(shù)的結(jié)果為:

(0.155 + 0.155 + 0.097 + 0.301 + 0.222 + 0.222) / 6 = 0.192

Python的代碼如下:

def BCE (y, y_predicted):ce_loss = y*(np.log(y_predicted))+(1-y)*(np.log(1-y_predicted))total_ce = np.sum(ce_loss)bce = - total_ce/y.sizereturn bce

8、Hinge Loss 和 Squared Hinge Loss (HL and SHL)

Hinge Loss被翻譯成鉸鏈損失或者合頁損失,這里還是以英文為準(zhǔn)。

Hinge Loss主要用于支持向量機(jī)模型的評估。錯誤的預(yù)測和不太自信的正確預(yù)測都會受到懲罰。 所以一般損失函數(shù)是:

l(y) = max (0 , 1 — t . y)

這里的t是真實(shí)結(jié)果用[1]或[-1]表示。

使用Hinge Loss的類應(yīng)該是[1]或[-1](不是[0])。為了在Hinge loss函數(shù)中不被懲罰,一個觀測不僅需要正確分類而且到超平面的距離應(yīng)該大于margin(一個自信的正確預(yù)測)。如果我們想進(jìn)一步懲罰更高的誤差,我們可以用與MSE類似的方法平方Hinge損失,也就是Squared Hinge Loss。

如果你對SVM比較熟悉,應(yīng)該還記得在SVM中,超平面的邊緣(margin)越高,則某一預(yù)測就越有信心。如果這塊不熟悉,則看看這個可視化的例子:

如果一個預(yù)測的結(jié)果是1.5,并且真正的類是[1],損失將是0(零),因?yàn)槟P褪歉叨茸孕诺摹?/p>

loss= Max (0,1 - 1* 1.5) = Max (0, -0.5) = 0

如果一個觀測結(jié)果為0(0),則表示該觀測處于邊界(超平面),真實(shí)的類為[-1]。損失為1,模型既不正確也不錯誤,可信度很低。

loss = max (0 , 1–(-1) * 0) = max (0 , 1) = 1

如果一次觀測結(jié)果為2,但分類錯誤(乘以[-1]),則距離為-2。損失是3(非常高),因?yàn)槲覀兊哪P蛯﹀e誤的決策非常有信心(這個是絕不能容忍的)。

loss = max (0 , 1 — (-1) . 2) = max (0 , 1+2) = max (0 , 3) = 3

python代碼如下:

#Hinge Lossdef Hinge (y, y_predicted):hinge_loss = np.sum(max(0 , 1 - (y_predicted * y)))return hinge_loss#Squared Hinge Lossdef SqHinge (y, y_predicted):sq_hinge_loss = max (0 , 1 - (y_predicted * y)) ** 2total_sq_hinge_loss = np.sum(sq_hinge_loss)return total_sq_hinge_loss

多分類

9、交叉熵(CE)

在多分類中,我們使用與二元交叉熵類似的公式,但有一個額外的步驟。首先需要計(jì)算每一對[y, y_predicted]的損失,一般公式為:

如果我們有三個類,其中單個[y, y_predicted]對的輸出是:

這里實(shí)際的類3(也就是值=1的部分),我們的模型對真正的類是3的信任度是0.7。計(jì)算這損失如下:

Loss = 0 . log (0.1) + 0 . log (0.2) + 1 . log (0.7) = -0.155

為了得到代價函數(shù)的值,我們需要計(jì)算所有單個配對的損失,然后將它們相加最后乘以[-1/樣本數(shù)量]。代價函數(shù)由下式給出:

使用上面的例子,如果我們的第二對:

Loss = 0 . log (0.4) + 1. log (0.4) + 0. log (0.2) = -0.40

那么成本函數(shù)計(jì)算如下:

使用Python的代碼示例可以更容易理解:

def CCE (y, y_predicted):cce_class = y * (np.log(y_predicted))sum_totalpair_cce = np.sum(cce_class)cce = - sum_totalpair_cce / y.sizereturn cce

10、Kullback-Leibler 散度 (KLD)

又被簡化稱為KL散度,它類似于分類交叉熵,但考慮了觀測值發(fā)生的概率。 如果我們的類不平衡,它特別有用。

def KL (y, y_predicted):kl = y * (np.log(y / y_predicted))total_kl = np.sum(kl)return total_kl

以上就是常見的10個損失函數(shù),希望對你有所幫助。

責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2022-08-27 15:03:43

Python損失函數(shù)算法

2024-06-26 13:11:40

2024-01-24 13:14:00

Python內(nèi)置函數(shù)工具

2024-07-18 15:08:27

2023-02-14 08:10:14

Python人工智能XAI

2023-12-22 15:44:43

2024-10-30 10:00:00

Python函數(shù)

2009-09-03 10:08:27

JavaScript自

2024-11-25 16:08:57

Python代碼代碼調(diào)試

2024-08-26 14:57:36

2024-06-21 10:46:44

2024-05-21 12:18:57

Python代碼重構(gòu)

2016-08-03 16:27:47

GitLinux開源

2024-12-03 09:23:20

2024-08-22 12:53:25

2024-05-15 08:59:52

Python編程

2023-05-24 10:24:56

代碼Python

2024-11-26 14:18:44

Python代碼技巧

2024-01-03 16:37:26

Jupyter工具開源

2021-12-13 23:02:41

Python語言開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號