
作者 | KHYATI MAHENDRU
編譯 | CDA數(shù)據(jù)分析師
損失函數(shù)實際上是我們經(jīng)常使用的這些技術(shù)的核心,本文介紹了多種損失函數(shù),他們的工作位置以及如何在Python中進行編碼。
首先想象一下一個場景–你已經(jīng)在給定的數(shù)據(jù)集上訓練了一個機器學習模型,并且已經(jīng)準備將其放在客戶面前。但是,這個時候你應(yīng)該如何確定該模型會給出最優(yōu)的結(jié)果呢?是否有一種度量標準或技術(shù)可以幫助你快速評估數(shù)據(jù)集中的模型?
當然有了—簡單的說,這就是損失函數(shù)在機器學習中發(fā)揮作用的地方。
損失函數(shù)是我們喜歡使用的機器學習算法的核心。但是可以看到大多數(shù)初學者和愛好者對如何使用損失函數(shù)們以及在哪里使用損失函數(shù)感到非常困惑。
損失函數(shù)并不是那么的難以理解,并且如果掌握了它將無限地增強你對機器學習算法的理解。那么,損失函數(shù)是什么,我們應(yīng)該如何把握損失函數(shù)的意義呢?
在本文中,我們將討論機器學習中使用的7種常見的損失函數(shù),并說明每個函數(shù)中在什么地方使用。 我們將在本文中介紹很多內(nèi)容,所以讓我們現(xiàn)在開始吧!
假設(shè)你現(xiàn)在在山頂上,這個時候需要往下走。你應(yīng)該怎么決定你往哪個方向走?
假如是我的話,我會這么做:
我剛剛只是憑借我的直接來判斷我的決定的么?當然不是,這些決定正是損失函數(shù)所提供的。
損失函數(shù)將決策映射到相關(guān)的成本上。
決策認為上坡會浪費我們的精力和時間。決定認為向下對我們來說更有利。因此,它具有負成本。
在有監(jiān)督的機器學習算法中,我們希望在學習過程中將每個訓練樣本的誤差最小化。這可以通過一些優(yōu)化策略(例如梯度下降)來完成。這個誤差就來自損失函數(shù)。
損失函數(shù)和成本函數(shù)有什么區(qū)別?
首先需要在這里強調(diào)一下,盡管成本函數(shù)和損失函數(shù)是同義詞,可以互換使用,但是它們是不同的。
損失函數(shù)僅用于單個訓練樣本。有時也稱為錯誤函數(shù)。另一方面,成本函數(shù)是整個訓練數(shù)據(jù)集的平均損失。優(yōu)化策略的目標是最小化成本函數(shù)。
此時,你應(yīng)該非常熟悉線性回歸了。它涉及對因變量 Y和幾個自變量 X_i 之間的線性關(guān)系建模。因此,我們實際上在這些變量上在空間上擬合了一條空間線。
我們將使用給定的數(shù)據(jù)點來找到系數(shù)a0,a1,...,an。
我們將使用著名的波士頓住房數(shù)據(jù)集來理解這一概念。為了簡單起見,我們將只使用一個特征- 每個住宅的平均房間數(shù)(X),來預測因變量,以1000美元為單位的房屋的中位數(shù)價值(Y)。
我們將使用“ 梯度下降”作為一個優(yōu)化策略來找到回歸線。我不會詳細介紹有關(guān)“梯度下降”的復雜細節(jié),但是這里有一個關(guān)于權(quán)重更新規(guī)則的提示”:
在這里,theta_j是要更新的權(quán)重,alpha是學習率,J是成本函數(shù)。成本函數(shù)由theta參數(shù)化。我們的目標是找到產(chǎn)生最小總成本的theta值。
我已經(jīng)定義了以下每個損失函數(shù)要遵循的步驟:
1.平方誤差損失
每個訓練樣本的平方誤差損失(也稱為L2損失)是實際值與預測值之差的平方:
相應(yīng)的成本函數(shù)是這些平方誤差(MSE)的均值
我覺得在你參考下面的這些代碼之前,先自己嘗試找到梯度下降的梯度。
def update_weights_MSE(m, b, X, Y, learning_rate): m_deriv = 0 b_deriv = 0 N = len(X) for i in range(N): # Calculate partial derivatives # -2x(y - (mx + b)) m_deriv += -2*X[i] * (Y[i] - (m*X[i] + b)) # -2(y - (mx + b)) b_deriv += -2*(Y[i] - (m*X[i] + b)) # We subtract because the derivatives point in direction of steepest ascent m -= (m_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m, b
我在波士頓數(shù)據(jù)上使用了這段代碼,以獲取500次迭代中不同的學習率值:
接下來你可以嘗試以0.1的學習率再次運行該代碼500次迭代。
讓我們再多談一下MSE損失函數(shù)。它是一個二次函數(shù)
其中a> 0),還記得它的是什么樣子么?
二次函數(shù)僅具有全局最小值。由于沒有局部最小值,因此我們永遠不會陷入局部最小值的困境。因此,它始終可以確?!疤荻认陆怠笔諗浚ㄈ绻耆諗浚┑饺肿钚≈怠?/span>
MSE損失函數(shù)通過對錯誤進行平方來懲罰模型,以免產(chǎn)生大的錯誤。平方大會使它更大,對嗎?但是在這里有一個警告。此屬性使MSE成本函數(shù)對異常值的魯棒性(Robust)降低。因此,如果我們的數(shù)據(jù)容易出現(xiàn)異常值,則不應(yīng)使用此方法。
2.絕對誤差損失
每個訓練樣本的絕對誤差是預測值與實際值之間的距離,而與符號無關(guān)。絕對誤差也稱為L1損失:
正如我之前提到的,代價是這些絕對誤差(MAE)的均值。
與MSE相比,MAE成本對于異常值更為穩(wěn)健。但是,在處理數(shù)學方程中的絕對或模運算并不容易。我相信你們中的很多人都會同意這一點!我們可以認為這是MAE的一個缺點。
這是帶有MAE成本的update_weight函數(shù)的代碼:
def update_weights_MAE(m, b, X, Y, learning_rate): m_deriv = 0 b_deriv = 0 N = len(X) for i in range(N): # Calculate partial derivatives # -x(y - (mx + b)) / |mx + b| m_deriv += - X[i] * (Y[i] - (m*X[i] + b)) / abs(Y[i] - (m*X[i] + b)) # -(y - (mx + b)) / |mx + b| b_deriv += -(Y[i] - (m*X[i] + b)) / abs(Y[i] - (m*X[i] + b)) # We subtract because the derivatives point in direction of steepest ascent m -= (m_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m, b
在以不同的學習率運行代碼500次的迭代后,我們得到以下圖表:
3.Huber Loss
Huber損失綜合了MSE和MAE的最佳性能。對于較小的誤差,它是平方的;對于其他誤差,它是線性的(對于梯度,也是類似)。由其delta參數(shù)進行標識:
上方是針對較小的誤差是平方的,下方是針對其他誤差為線性的。
def update_weights_Huber(m, b, X, Y, delta, learning_rate): m_deriv = 0 b_deriv = 0 N = len(X) for i in range(N): # derivative of quadratic for small values and of linear for large values if abs(Y[i] - m*X[i] - b) <= delta: m_deriv += -X[i] * (Y[i] - (m*X[i] + b)) b_deriv += - (Y[i] - (m*X[i] + b)) else: m_deriv += delta * X[i] * ((m*X[i] + b) - Y[i]) / abs((m*X[i] + b) - Y[i]) b_deriv += delta * ((m*X[i] + b) - Y[i]) / abs((m*X[i] + b) - Y[i]) # We subtract because the derivatives point in direction of steepest ascent m -= (m_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m, b
對于delta參數(shù)的不同值,我們以 0.0001的學習率獲得了500次權(quán)重更新的迭代,獲得了如下圖表:[
與MSE相比,Huber損失對異常值的魯棒性更高。它被使用與穩(wěn)健回歸,M-估計和疊加模型。在分類中也使用了Huber Loss的一種變體。
從看到這個名字就應(yīng)該不言自明了。二分類是指將一個對象分配給兩個類別中的一個。這種分類基于應(yīng)用于輸入特征向量的規(guī)則。例如,根據(jù)電子郵件的主題,將電子郵件分為垃圾郵件或非垃圾郵件,這是一種二進制分類。
我將在乳腺癌數(shù)據(jù)集上說明這些二分類損失函數(shù)。
我們希望根據(jù)平均半徑,面積,周長等特征將腫瘤分類為“惡性”或“良性”。為簡化起見,我們將僅使用兩個輸入特征(X1和X2),即“最差面積”和“平均對稱”進行分類。目標值Y可以為0(惡性)或1(良性)。
這是我們數(shù)據(jù)的散點圖:
1.二元交叉熵損失
讓我們首先了解“熵”一詞。 通常,我們使用熵來表示混亂或不確定性。對于具有概率分布p(X)的隨機變量X進行測量:
負號是用于使總量為正的。
概率分布的熵值越大,表示分布的不確定性越大。同樣,較小的值表示更確定的分布。
這使得二元交叉熵適合作為損失函數(shù)– 使其值最小化。我們將二進制交叉熵損失用于分類模型,該模型輸出一個概率p。
元素屬于1類(或正類)的概率= p 然后,元素屬于0類(或負類)的概率= 1-p
然后,輸出標簽y(可以取值0和1)和預測概率p的交叉熵損失定義為:
這也稱為對數(shù)丟失。要計算概率p,我們可以使用Sigmoid函數(shù)。在此,z是我們輸入特性的函數(shù):
Sigmoid函數(shù)的范圍是[0,1],使其適合于計算概率。
嘗試自己輸入一下代碼,然再后查看下面的update_weight函數(shù)的代碼。
def update_weights_BCE(m1, m2, b, X1, X2, Y, learning_rate): m1_deriv = 0 m2_deriv = 0 b_deriv = 0 N = len(X1) for i in range(N): s = 1 / (1 / (1 + math.exp(-m1*X1[i] - m2*X2[i] - b))) # Calculate partial derivatives m1_deriv += -X1[i] * (s - Y[i]) m2_deriv += -X2[i] * (s - Y[i]) b_deriv += -(s - Y[i]) # We subtract because the derivatives point in direction of steepest ascent m1 -= (m1_deriv / float(N)) * learning_rate m2 -= (m2_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m1, m2, b
關(guān)于使用權(quán)重更新規(guī)則進行1000次迭代(具有不同的alpha值),我得到以下圖表:
2.鉸鏈損失(Hinge Loss)
鉸鏈損失主要用于支持標簽為-1和1的支持向量機(SVM)分類器。因此,請確保將數(shù)據(jù)集中“Malignant”類的標簽從0更改為-1。
鉸鏈損失不僅會懲罰錯誤的預測,還會懲罰不確定的正確預測。
輸入輸出對(x,y)的鉸鏈損失為:
def update_weights_Hinge(m1, m2, b, X1, X2, Y, learning_rate): m1_deriv = 0 m2_deriv = 0 b_deriv = 0 N = len(X1) for i in range(N): # Calculate partial derivatives if Y[i]*(m1*X1[i] + m2*X2[i] + b) <= 1: m1_deriv += -X1[i] * Y[i] m2_deriv += -X2[i] * Y[i] b_deriv += -Y[i] # else derivatives are zero # We subtract because the derivatives point in direction of steepest ascent m1 -= (m1_deriv / float(N)) * learning_rate m2 -= (m2_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m1, m2, b
在使用三個不同的alpha值對2000次迭代運行update函數(shù)之后,我們獲得了以下圖:
鉸鏈損失簡化了SVM的數(shù)學運算,同時使損失最大化(與對數(shù)損失相比)。當我們要做出實時決策而并不是高度關(guān)注準確性時,就可以使用它。
現(xiàn)在電子郵件不只是被歸類為垃圾郵件或非垃圾郵件(現(xiàn)在已經(jīng)不是90年代了?。?。它們可以被分為其他各種類別-工作,家庭,社交,晉升等。在現(xiàn)在郵件分類是一個多類別分類用例。
我們將使用鳶尾花數(shù)據(jù)集來了解其余兩個損失函數(shù)。我們將使用2個特征X1(萼片長度)和特征X2(花瓣寬度)來預測鳶尾花(Setosa,Versicolor或Virginica)的類別(Y)
我們的任務(wù)是使用神經(jīng)網(wǎng)絡(luò)模型和Keras中內(nèi)置的Adam優(yōu)化器來實現(xiàn)分類。這是因為隨著參數(shù)數(shù)量的增加,數(shù)學以及代碼將變得難以理解。
這是我們數(shù)據(jù)的散點圖:
1.多分類交叉熵損失
多分類交叉熵損失是二分類交叉熵損失的概括。輸入向量Xi和相應(yīng)的單編碼目標向量Yi的損耗為:
我們使用softmax函數(shù)來找到概率p_ij:
“ Softmax是通過在輸出層之前的神經(jīng)網(wǎng)絡(luò)層實現(xiàn)的。Softmax層必須具有與輸出層相同數(shù)量的節(jié)點?!?/span>
最后,我們的輸出是給定輸入具有最大概率的類別。
我們使用一個輸入層和一個輸出層來進行構(gòu)建模型,并以不同的學習率對其進行編譯。在model.compile()語句中將損失參數(shù)指定為“ categorical_crossentropy”:
# importing requirements from keras.layers import Dense from keras.models import Sequential from keras.optimizers import adam # alpha = 0.001 as given in the lr parameter in adam() optimizer # build the model model_alpha1 = Sequential() model_alpha1.add(Dense(50, input_dim=2, activation='relu')) model_alpha1.add(Dense(3, activation='softmax')) # compile the model opt_alpha1 = adam(lr=0.001) model_alpha1.compile(loss='categorical_crossentropy', optimizer=opt_alpha1, metrics=['accuracy']) # fit the model # dummy_Y is the one-hot encoded # history_alpha1 is used to score the validation and accuracy scores for plotting history_alpha1 = model_alpha1.fit(dataX, dummy_Y, validation_data=(dataX, dummy_Y), epochs=200, verbose=0)
這是經(jīng)過200個時期訓練后的成本和準確率圖:
2. KL散度(KL-Divergence)
KL散度是度量一個概率分布與另一個分布之間的差異的指標。KL散度為零表示分布相同。
請注意,散度函數(shù)不是對稱的。
這就是為什么KL散度不能用作距離度量的原因。
我將介紹使用KL-散度作為損失函數(shù)而不涉及其數(shù)學的基本方法。我們想要得到目標變量關(guān)于輸入特征的真實概率分布P的近似值,給出一個近似分布q。由于kl散度不是對稱的,我們可以用兩種方法來實現(xiàn):
第一種方法用于監(jiān)督學習中,第二種方法用于強化學習中。KL-散度在功能上類似于多分類交叉熵,并且也稱為P相對于Q的相對熵:
我們像以前對多類交叉熵損失所做的那樣,在compile()函數(shù)中將'kullbackleiblerdivergence'指定為損失參數(shù)的值。
# importing requirements from keras.layers import Dense from keras.models import Sequential from keras.optimizers import adam # alpha = 0.001 as given in the lr parameter in adam() optimizer # build the model model_alpha1 = Sequential() model_alpha1.add(Dense(50, input_dim=2, activation='relu')) model_alpha1.add(Dense(3, activation='softmax')) # compile the model opt_alpha1 = adam(lr=0.001) model_alpha1.compile(loss='kullback_leibler_divergence', optimizer=opt_alpha1, metrics=['accuracy']) # fit the model # dummy_Y is the one-hot encoded # history_alpha1 is used to score the validation and accuracy scores for plotting history_alpha1 = model_alpha1.fit(dataX, dummy_Y, validation_data=(dataX, dummy_Y), epochs=200, verbose=0)
與多類分類相比,KL-散度更常用于近似復雜函數(shù)。我們在使用深度自動生成模型(如變分自動編碼器(VAE))時經(jīng)常遇到KL-散度。
哇!到這里為止我們已經(jīng)講了很多了。一直看到最后的你,給你自己一點鼓勵吧。這篇文章中是我們通常在機器學習中使用的損失函數(shù)的詳細列表。
在這里呢建議你在繼續(xù)進行機器學習的過程中,多讀幾遍。因為這不是一次努力就可以全部理解的。需要一些閱讀時間和經(jīng)驗才能了解這些損失函數(shù)的工作方式和位置。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預期算子的內(nèi)涵、作用與應(yīng)用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計學領(lǐng)域,假設(shè)檢驗是驗證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務(wù)價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10