什麼是損失函數?
損失函數是一種衡量模型與資料吻合程度的演算法。損失函數測量實際測量值和預測值之間差距的一種方式。損失函數的值越高預測就越錯誤,損失函數值越低則預測越接近真實值。對每個單獨的觀測(數據點)計算損失函數。將所有損失函數(loss function)的值取平均值的函數稱為代價函數(cost function),更簡單的理解就是損失函數是針對單一樣本的,而代價函數是針對所有樣本的。
損失函數與度量指標
一些損失函數也可以被用來作為評估指標。但是損失函數和度量指標(metrics)有不同的目的。雖然度量指標用於評估最終模型並比較不同模型的性能,但損失函數在模型建立階段用作正在創建的模型的最佳化器。損失函數指導模型如何最小化誤差。
也就是說損失函數是知道模型如何訓練的,而度量指標是說明模型的表現的
#為什麼要用損失函數?
由於損失函數測量的是預測值和實際值之間的差距,因此在訓練模型時可以使用它們來指導模型的改進(通常的梯度下降法)。在建構模型的過程中,如果特徵的權重發生了變化得到了更好或更差的預測,就需要利用損失函數來判斷模型中特徵的權重是否需要改變,以及改變的方向。
我們可以在機器學習中使用各種各樣的損失函數,這取決於我們試圖解決的問題的類型、資料品質和分佈以及我們使用的演算法,下圖為我們整理的10個常見的損失函數:
迴歸問題
1、均方誤差(MSE)
均方誤差是指所有預測值和真實值之間的平方差,並將其平均值。常用於回歸問題。
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、平均絕對誤差(MAE)
作為預測值和真實值之間的絕對差的平均值來計算的。當數據有異常值時,這是比均方誤差更好的測量方法。
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)
這個損失函數是均方誤差的平方根。如果我們不想懲罰更大的錯誤,這是一個理想的方法。
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)
#類似平均絕對誤差但不求絕對值。這個損失函數的缺點是負誤差和正誤差可以互相抵消,所以當研究人員知道誤差只有一個方向時,應用它會更好。
def MBE (y, y_predicted): error = y_predicted -y total_error = np.sum(error) mbe = total_error/y.size return mbe
5、Huber損失
Huber損失函數結合了平均絕對誤差(MAE)和均方誤差(MSE)的優點。這是因為Hubber損失是一個有兩個分支的函數。一個分支應用於符合期望值的MAE,另一個分支應用於異常值。 Hubber Loss一般函數為:
這裡的
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
二元分類
6.最大似然損失(Likelihood Loss/LHL)
此損失函數主要用於二值分類問題。將每一個預測值的機率相乘,得到一個損失值,相關的代價函數是所有觀測值的平均值。讓我們用以下二元分類的範例為例,其中類別為[0]或[1]。若輸出機率等於或大於0.5,則預測類別為[1],否則為[0]。輸出機率的範例如下:
[0.3 , 0.7 , 0.8 , 0.5 , 0.6 , 0.4]
對應的預測類別為:
[0 , 1 , 1 , 1 , 1 , 0]
而實際的類別為:
[0 , 1 , 1 , 0 , 1 , 0]
現在將使用真實的類別和輸出機率來計算損失。如果真類別是[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.size return lhl
7、二元交叉熵(BCE)
這個函數是對數的似然損失的修正。數列的疊加可以懲罰那些非常有自信但是卻是錯誤的預測。二元交叉熵損失函數的一般公式為:
#讓我們繼續使用上面範例的值:
- #輸出機率= [0.3、0.7、0.8、0.5、0.6、0.4]
- 實際的類別= [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
那麼代價函數的結果為:
(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被翻譯成鉸鏈損失或合頁損失,這裡還是以英文為準。
Hinge Loss主要用于支持向量机模型的评估。错误的预测和不太自信的正确预测都会受到惩罚。所以一般损失函数是:
这里的t是真实结果用[1]或[-1]表示。
使用Hinge Loss的类应该是[1]或-1。为了在Hinge loss函数中不被惩罚,一个观测不仅需要正确分类而且到超平面的距离应该大于margin(一个自信的正确预测)。如果我们想进一步惩罚更高的误差,我们可以用与MSE类似的方法平方Hinge损失,也就是Squared Hinge Loss。
如果你对SVM比较熟悉,应该还记得在SVM中,超平面的边缘(margin)越高,则某一预测就越有信心。如果这块不熟悉,则看看这个可视化的例子:
如果一个预测的结果是1.5,并且真正的类是[1],损失将是0(零),因为模型是高度自信的。
loss= Max (0,1 - 1* 1.5) = Max (0, -0.5) = 0
如果一个观测结果为0(0),则表示该观测处于边界(超平面),真实的类为[-1]。损失为1,模型既不正确也不错误,可信度很低。
如果一次观测结果为2,但分类错误(乘以[-1]),则距离为-2。损失是3(非常高),因为我们的模型对错误的决策非常有信心(这个是绝不能容忍的)。
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
多分类
9、交叉熵(CE)
在多分类中,我们使用与二元交叉熵类似的公式,但有一个额外的步骤。首先需要计算每一对[y, y_predicted]的损失,一般公式为:
如果我们有三个类,其中单个[y, y_predicted]对的输出是:
这里实际的类3(也就是值=1的部分),我们的模型对真正的类是3的信任度是0.7。计算这损失如下:
为了得到代价函数的值,我们需要计算所有单个配对的损失,然后将它们相加最后乘以[-1/样本数量]。代价函数由下式给出:
使用上面的例子,如果我们的第二对:
那么成本函数计算如下:
使用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)
又被简化称为KL散度,它类似于分类交叉熵,但考虑了观测值发生的概率。如果我们的类不平衡,它特别有用。
def KL (y, y_predicted): kl = y * (np.log(y / y_predicted)) total_kl = np.sum(kl) return total_kl
以上就是常见的10个损失函数,希望对你有所帮助。
以上是常用的損失函數及Python實作範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),