10個(gè)Python常用的損失函數(shù)及代碼實(shí)現(xiàn)分享
什么是損失函數(shù)
損失函數(shù)是一種衡量模型與數(shù)據(jù)吻合程度的算法。損失函數(shù)測(cè)量實(shí)際測(cè)量值和預(yù)測(cè)值之間差距的一種方式。損失函數(shù)的值越高預(yù)測(cè)就越錯(cuò)誤,損失函數(shù)值越低則預(yù)測(cè)越接近真實(shí)值。對(duì)每個(gè)單獨(dú)的觀測(cè)(數(shù)據(jù)點(diǎn))計(jì)算損失函數(shù)。將所有損失函數(shù)(loss function)的值取平均值的函數(shù)稱(chēng)為代價(jià)函數(shù)(cost function),更簡(jiǎn)單的理解就是損失函數(shù)是針對(duì)單個(gè)樣本的,而代價(jià)函數(shù)是針對(duì)所有樣本的。
損失函數(shù)與度量指標(biāo)
一些損失函數(shù)也可以被用作評(píng)價(jià)指標(biāo)。但是損失函數(shù)和度量指標(biāo)(metrics)有不同的目的。雖然度量指標(biāo)用于評(píng)估最終模型并比較不同模型的性能,但損失函數(shù)在模型構(gòu)建階段用作正在創(chuàng)建的模型的優(yōu)化器。損失函數(shù)指導(dǎo)模型如何最小化誤差。
也就是說(shuō)損失函數(shù)是知道模型如何訓(xùn)練的,而度量指標(biāo)是說(shuō)明模型的表現(xiàn)的
為什么要用損失函數(shù)
由于損失函數(shù)測(cè)量的是預(yù)測(cè)值和實(shí)際值之間的差距,因此在訓(xùn)練模型時(shí)可以使用它們來(lái)指導(dǎo)模型的改進(jìn)(通常的梯度下降法)。在構(gòu)建模型的過(guò)程中,如果特征的權(quán)重發(fā)生了變化得到了更好或更差的預(yù)測(cè),就需要利用損失函數(shù)來(lái)判斷模型中特征的權(quán)重是否需要改變,以及改變的方向。
我們可以在機(jī)器學(xué)習(xí)中使用各種各樣的損失函數(shù),這取決于我們?cè)噲D解決的問(wèn)題的類(lèi)型、數(shù)據(jù)質(zhì)量和分布以及我們使用的算法,下圖為我們整理的10個(gè)常見(jiàn)的損失函數(shù):
回歸問(wèn)題
1、均方誤差(MSE)
均方誤差是指所有預(yù)測(cè)值和真實(shí)值之間的平方差,并將其平均值。常用于回歸問(wèn)題。
def MSE (y, y_predicted): sq_error = (y_predicted - y) ** 2 sum_sq_error = np.sum(sq_error) mse = sum_sq_error/y.size return mse
2、平均絕對(duì)誤差(MAE)
作為預(yù)測(cè)值和真實(shí)值之間的絕對(duì)差的平均值來(lái)計(jì)算的。當(dāng)數(shù)據(jù)有異常值時(shí),這是比均方誤差更好的測(cè)量方法。
def MAE (y, y_predicted): error = y_predicted - y absolute_error = np.absolute(error) total_absolute_error = np.sum(absolute_error) mae = total_absolute_error/y.size return mae
3、均方根誤差(RMSE)
這個(gè)損失函數(shù)是均方誤差的平方根。如果我們不想懲罰更大的錯(cuò)誤,這是一個(gè)理想的方法。
def RMSE (y, y_predicted): sq_error = (y_predicted - y) ** 2 total_sq_error = np.sum(sq_error) mse = total_sq_error/y.size rmse = math.sqrt(mse) return rmse
4、平均偏差誤差(MBE)
類(lèi)似于平均絕對(duì)誤差但不求絕對(duì)值。這個(gè)損失函數(shù)的缺點(diǎn)是負(fù)誤差和正誤差可以相互抵消,所以當(dāng)研究人員知道誤差只有一個(gè)方向時(shí),應(yīng)用它會(huì)更好。
def MBE (y, y_predicted): error = y_predicted - y total_error = np.sum(error) mbe = total_error/y.size return mbe
5、Huber損失
Huber損失函數(shù)結(jié)合了平均絕對(duì)誤差(MAE)和均方誤差(MSE)的優(yōu)點(diǎn)。這是因?yàn)镠ubber損失是一個(gè)有兩個(gè)分支的函數(shù)。一個(gè)分支應(yīng)用于符合期望值的MAE,另一個(gè)分支應(yīng)用于異常值。Hubber Loss一般函數(shù)為:
這里的
def hubber_loss (y, y_predicted, delta) delta = 1.35 * MAE y_size = y.size total_error = 0 for i in range (y_size): erro = np.absolute(y_predicted[i] - y[i]) if error < delta: hubber_error = (error * error) / 2 else: hubber_error = (delta * error) / (0.5 * (delta * delta)) total_error += hubber_error total_hubber_error = total_error/y.size return total_hubber_error
二元分類(lèi)
6、最大似然損失(Likelihood Loss/LHL)
該損失函數(shù)主要用于二值分類(lèi)問(wèn)題。將每一個(gè)預(yù)測(cè)值的概率相乘,得到一個(gè)損失值,相關(guān)的代價(jià)函數(shù)是所有觀測(cè)值的平均值。讓我們用以下二元分類(lèi)的示例為例,其中類(lèi)別為[0]或[1]。如果輸出概率等于或大于0.5,則預(yù)測(cè)類(lèi)為[1],否則為[0]。輸出概率的示例如下:
[0.3 , 0.7 , 0.8 , 0.5 , 0.6 , 0.4]
對(duì)應(yīng)的預(yù)測(cè)類(lèi)為:
[0 , 1 , 1 , 1 , 1 , 0]
而實(shí)際的類(lèi)為:
[0 , 1 , 1 , 0 , 1 , 0]
現(xiàn)在將使用真實(shí)的類(lèi)和輸出概率來(lái)計(jì)算損失。如果真類(lèi)是[1],我們使用輸出概率,如果真類(lèi)是[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.size return lhl
7、二元交叉熵(BCE)
這個(gè)函數(shù)是對(duì)數(shù)的似然損失的修正。對(duì)數(shù)列的疊加可以懲罰那些非常自信但是卻錯(cuò)誤的預(yù)測(cè)。二元交叉熵?fù)p失函數(shù)的一般公式為:
讓我們繼續(xù)使用上面例子的值:
1.輸出概率= [0.3、0.7、0.8、0.5、0.6、0.4]
2.實(shí)際的類(lèi)= [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
那么代價(jià)函數(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.size return bce
8、Hinge Loss 和 Squared Hinge Loss (HL and SHL)
Hinge Loss被翻譯成鉸鏈損失或者合頁(yè)損失,這里還是以英文為準(zhǔn)。
Hinge Loss主要用于支持向量機(jī)模型的評(píng)估。錯(cuò)誤的預(yù)測(cè)和不太自信的正確預(yù)測(cè)都會(huì)受到懲罰。所以一般損失函數(shù)是:
這里的t是真實(shí)結(jié)果用[1]或[-1]表示。
使用Hinge Loss的類(lèi)應(yīng)該是[1]或-1。為了在Hinge loss函數(shù)中不被懲罰,一個(gè)觀測(cè)不僅需要正確分類(lèi)而且到超平面的距離應(yīng)該大于margin(一個(gè)自信的正確預(yù)測(cè))。如果我們想進(jìn)一步懲罰更高的誤差,我們可以用與MSE類(lèi)似的方法平方Hinge損失,也就是Squared Hinge Loss。
如果你對(duì)SVM比較熟悉,應(yīng)該還記得在SVM中,超平面的邊緣(margin)越高,則某一預(yù)測(cè)就越有信心。如果這塊不熟悉,則看看這個(gè)可視化的例子:
如果一個(gè)預(yù)測(cè)的結(jié)果是1.5,并且真正的類(lèi)是[1],損失將是0(零),因?yàn)槟P褪歉叨茸孕诺摹?/p>
loss= Max (0,1 - 1* 1.5) = Max (0, -0.5) = 0
如果一個(gè)觀測(cè)結(jié)果為0(0),則表示該觀測(cè)處于邊界(超平面),真實(shí)的類(lèi)為[-1]。損失為1,模型既不正確也不錯(cuò)誤,可信度很低。
如果一次觀測(cè)結(jié)果為2,但分類(lèi)錯(cuò)誤(乘以[-1]),則距離為-2。損失是3(非常高),因?yàn)槲覀兊哪P蛯?duì)錯(cuò)誤的決策非常有信心(這個(gè)是絕不能容忍的)。
python代碼如下:
#Hinge Loss def Hinge (y, y_predicted): hinge_loss = np.sum(max(0 , 1 - (y_predicted * y))) return hinge_loss #Squared Hinge Loss def SqHinge (y, y_predicted): sq_hinge_loss = max (0 , 1 - (y_predicted * y)) ** 2 total_sq_hinge_loss = np.sum(sq_hinge_loss) return total_sq_hinge_loss
多分類(lèi)
9、交叉熵(CE)
在多分類(lèi)中,我們使用與二元交叉熵類(lèi)似的公式,但有一個(gè)額外的步驟。首先需要計(jì)算每一對(duì)[y, y_predicted]的損失,一般公式為:
如果我們有三個(gè)類(lèi),其中單個(gè)[y, y_predicted]對(duì)的輸出是:
這里實(shí)際的類(lèi)3(也就是值=1的部分),我們的模型對(duì)真正的類(lèi)是3的信任度是0.7。計(jì)算這損失如下:
為了得到代價(jià)函數(shù)的值,我們需要計(jì)算所有單個(gè)配對(duì)的損失,然后將它們相加最后乘以[-1/樣本數(shù)量]。代價(jià)函數(shù)由下式給出:
使用上面的例子,如果我們的第二對(duì):
那么成本函數(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.size return cce
10、Kullback-Leibler 散度 (KLD)
又被簡(jiǎn)化稱(chēng)為KL散度,它類(lèi)似于分類(lèi)交叉熵,但考慮了觀測(cè)值發(fā)生的概率。如果我們的類(lèi)不平衡,它特別有用。
def KL (y, y_predicted): kl = y * (np.log(y / y_predicted)) total_kl = np.sum(kl) return total_kl
到此這篇關(guān)于10個(gè)Python常用的損失函數(shù)及代碼實(shí)現(xiàn)分享的文章就介紹到這了,更多相關(guān)Python損失函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx搭建基于python的web環(huán)境的實(shí)現(xiàn)步驟
這篇文章主要介紹了nginx搭建基于python的web環(huán)境的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01Python獲取好友地區(qū)分布及好友性別分布情況代碼詳解
利用Python + wxpy 可以快速的查詢(xún)自己好友的地區(qū)分布情況,以及好友的性別分布數(shù)量。還可以批量下載好友的頭像,拼接成大圖。感興趣的朋友跟隨小編一起看看吧2019-07-07Django中URL視圖函數(shù)的一些高級(jí)概念介紹
這篇文章主要介紹了Django中URL視圖函數(shù)的一些高級(jí)概念,Django是Python重多人氣框架中最為著名的一個(gè),需要的朋友可以參考下2015-07-07舉例講解Django中數(shù)據(jù)模型訪問(wèn)外鍵值的方法
這篇文章主要介紹了舉例講解Django中數(shù)據(jù)模型訪問(wèn)外鍵值的方法,Django是最具人氣的Python web開(kāi)發(fā)框架,需要的朋友可以參考下2015-07-07使用簡(jiǎn)單工廠模式來(lái)進(jìn)行Python的設(shè)計(jì)模式編程
這篇文章主要介紹了使用簡(jiǎn)單工廠模式來(lái)進(jìn)行Python的設(shè)計(jì)模式編程的方法,需要的朋友可以參考下2016-03-03Python新手學(xué)習(xí)過(guò)程記錄之基礎(chǔ)環(huán)境:環(huán)境變量、版本區(qū)分、虛擬環(huán)境
剛開(kāi)始接觸Python開(kāi)發(fā)語(yǔ)言,可能就會(huì)遇到一些棘手的問(wèn)題,比如電腦上不知不覺(jué)已經(jīng)安裝了多個(gè)python版本,python3.8/3.10/3.11,甚至一些軟件中也集成有python解釋器;那么我編寫(xiě)的python代碼,到底是使用哪個(gè)解釋器在執(zhí)行?我通過(guò)pip包管理工具安裝的依賴(lài)包到底在那個(gè)地方2024-05-05