機器學習系統的開發不僅涉及模型的構建,更重要的是如何評估和最佳化模型的效能。損失函式引導模型的學習方向,而評估指標則用於衡量模型的表現。選擇合適的損失函式和評估指標是構建有效機器學習系統的關鍵。本文將探討損失函式和評估指標的選擇,並以實際案例說明其重要性。同時,文章將介紹不同型別的損失函式,例如 MSE、MAE 和焦點損失,並提供程式碼範例,幫助讀者更好地理解和應用這些概念。此外,文章還將討論如何根據專案目標選擇正確的評估指標,並提供一些實用的建議和方法。

下一步探討

在接下來的章節中,我們將探討機器學習(ML)系統的技術細節,包括選擇適當的評估指標和損失函式、定義和使用代理指標、以及資料集的選擇和處理等主題。這些內容將幫助我們更好地理解如何構建和最佳化ML系統。

選擇適當的指標和損失函式

在機器學習系統中,損失函式用於指導模型最佳化,而評估指標則用於評估模型的效能。選擇適當的損失函式和評估指標對於構建有效的ML系統至關重要。

定義和利用代理指標

代理指標是在某些情況下用於替代真實指標的衡量標準。正確地定義和使用代理指標,可以幫助我們更好地評估和最佳化ML系統。

應用指標層級

透過建立指標層級,我們可以更全面地瞭解ML系統的效能,並根據不同層級的指標進行相應的調整和最佳化。

這些內容將在接下來的章節中進行詳細闡述。

第5章:損失函式與評估指標

在機器學習(ML)系統設計中,選擇適當的損失函式(loss function)和評估指標(metrics)是至關重要的決定。一個好的損失函式能夠有效地定義模型如何從資料中學習以及如何最佳化其效能。與此同時,評估指標則用於衡量模型的表現。

5.1 損失函式

損失函式,也被稱為目標函式或成本函式,是機器學習模型的核心組成部分。它決定了模型如何學習資料之間的關係,哪些方面需要關注,哪些錯誤需要避免,以及什麼是可以接受的。因此,選擇合適的損失函式可以顯著影響模型的整體表現,即使其他條件(如特徵、目標變數、模型架構和資料集大小)保持不變。

選擇正確的損失函式是設計機器學習系統時最關鍵的決定之一。這就像最佳化平均值一樣,當比爾·蓋茨走進酒吧時,酒吧裡所有人的平均財富會大幅增加(https://mng.bz/M1w8)。這表明,使用不當的評估方法可能會導致誤導性的結果。

並非所有的函式都可以用作損失函式。一般來說,一個損失函式需要具備兩個特性:

  1. 全域性連續性:預測值的變化會導致損失值的變化。
  2. 可微分性:其梯度可以被計算,以便根據梯度下降的最佳化演算法能夠使用。

雖然這兩個特性對於任何損失函式都是相關的,但選擇一個最符合特定問題和最終目標的損失函式是非常重要的。

高階的損失函式提供了一種改進模型的誘人方式。與操縱特徵或模型本身不同,這些函式通常不會影響執行時的效能,也就是說,所有的程式碼更改都只與訓練流程相關,將更改隔離到系統的一小部分始終是一個好的設計屬性。

然而,很多時候,機器學習工程師(尤其是新畢業的學生)會堅持使用特定的損失函式,只因為他們習慣於將其應用於類別似的問題。例如,迴歸問題中均方誤差(MSE)或平均絕對誤差(MAE)損失函式常常被用作預設選擇,甚至是許多從業者的唯一選擇。

使用MSE和MAE的範例

假設我們有一個目標值向量 Y = [100, 100, 100, 100, 100, 100, 100, 100, 100, 1000] 和一個對於所有樣本都相同的獨立變數向量 X。如果我們使用MSE作為損失函式來訓練模型,它將輸出預測向量 Y_hat = [190, 190, 190, 190, 190, 190, 190, 190, 190, 190]。如果我們使用MAE作為損失函式,模型將輸出 Y_hat = [100, 100, 100, 100, 100, 100, 100, 100, 100, 100]

程式碼範例:計算MSE和MAE

import numpy as np

# 定義目標值向量Y和預測值向量Y_hat_MSE、Y_hat_MAE
Y = np.array([100, 100, 100, 100, 100, 100, 100, 100, 100, 1000])
Y_hat_MSE = np.array([190, 190, 190, 190, 190, 190, 190, 190, 190, 190])
Y_hat_MAE = np.array([100, 100, 100, 100, 100, 100, 100, 100, 100, 100])

# 定義計算MSE和MAE的函式
def calculate_MSE(Y, Y_hat):
    return np.mean((Y - Y_hat) ** 2)

def calculate_MAE(Y, Y_hat):
    return np.mean(np.abs(Y - Y_hat))

# #### 內容解密:
# 這裡定義了兩個函式,分別用於計算均方誤差(MSE)和平均絕對誤差(MAE)。這兩個指標用於評估模型的表現。
# - `calculate_MSE`函式透過計算預測值與實際值之間差異的平方的平均值來得到MSE。
# - `calculate_MAE`函式則是計算預測值與實際值之間絕對差異的平均值來得到MAE。

# 分別計算使用MSE和MAE損失函式時的MSE和MAE
MSE_MSE_loss = calculate_MSE(Y, Y_hat_MSE)
MAE_MSE_loss = calculate_MAE(Y, Y_hat_MSE)

MSE_MAE_loss = calculate_MSE(Y, Y_hat_MAE)
MAE_MAE_loss = calculate_MAE(Y, Y_hat_MAE)

print(f"MSE loss時,MSE = {MSE_MSE_loss}, MAE = {MAE_MSE_loss}")
print(f"MAE loss時,MSE = {MSE_MAE_loss}, MAE = {MAE_MAE_loss}")

圖表說明:殘差分佈

此圖示展示了最佳化均值後的殘差分佈情況,其中平均值為0,中位數為-90。

內容解密:

  • 圖表顯示了使用特定損失函式最佳化後的殘差分佈情況。
  • 平均值為0,表明殘差在整體上是平衡的。
  • 中位數為-90,表明有一半的殘差小於-90,這可能指示模型對某些樣本的預測存在系統性偏差。

選擇合適的損失函式對於設計一個有效的機器學習系統至關重要。不同的損失函式會導致模型學習不同的模式,因此需要根據具體問題和目標進行選擇。透過深入理解不同損失函式的特性和影響,可以更好地設計和最佳化機器學習模型。

損失函式與評估指標

當我們為一個以平均絕對誤差(MAE)為損失函式的模型計算均方誤差(MSE)和MAE時,結果會是MSE = 81,000,MAE = 90,其中殘差的平均值等於90,殘差的中位數等於0(圖5.2)。毫無疑問,為MSE最佳化的模型會產生更好的MSE,而由於MSE試圖最小化平均值,因此平均殘差表現更好。另一方面,為MAE最佳化的模型會產生更好的MAE,而由於MAE試圖最佳化中位數,因此中位數殘差表現更好。但這對我們來說意味著什麼?哪個損失函式更好?這取決於我們的應用場景。

不同的應用場景,不同的損失函式選擇

假設我們正在最佳化飛機的導航系統,而誤差大於850意味著飛機將偏離跑道並墜毀。在這種情況下,最佳化MAE並不是一個理想的選擇。當然,我們可以說10次中有9次結果是完美的,只有1次飛機被毀,這是不可接受的。我們必須不惜一切代價避免異常值,或者對它們進行懲罰,因此使用MSE甚至一些更高次的修改是合理的。

程式碼範例:計算MSE和MAE

import numpy as np

def calculate_mse(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)

def calculate_mae(y_true, y_pred):
    return np.mean(np.abs(y_true - y_pred))

# 假設y_true和y_pred是實際值和預測值
y_true = np.array([1, 2, 3, 4, 5])
y_pred = np.array([1.1, 1.9, 3.2, 4.1, 5.0])

mse = calculate_mse(y_true, y_pred)
mae = calculate_mae(y_true, y_pred)

print(f"MSE: {mse}, MAE: {mae}")

內容解密:

  1. calculate_mse函式計算均方誤差(MSE),它對預測誤差進行平方運算,然後求平均值。這樣可以放大較大的誤差,使模型對這些誤差更加敏感。
  2. calculate_mae函式計算平均絕對誤差(MAE),它對預測誤差取絕對值後求平均值。這樣可以給所有誤差相同的權重,使模型對所有誤差同等對待。
  3. 程式碼中使用numpy函式庫進行數值運算,提高了計算效率。

但如果我們正在最佳化加密貨幣交易所每天所需的流動性,那麼情況就不同了。流動性是指加密貨幣在不損失價值的情況下轉換為現金或其他加密貨幣的能力,這對於所有加密貨幣交易所都至關重要。高流動性意味著市場動態且穩定,允許參與者在合理的價格下快速交易。然而,過多的流動性意味著分配的資源沒有被有效利用。在這種情況下,9次中有9次保留比所需更多的現金是遠遠不理想的。從另一個角度來看,最佳化MSE的模型過度分配了810個單位,而最佳化MAE的模型則有9次準確預測,並且少分配了900個單位,這看起來是一個更好的決定(如果少分配的損失小於過度分配的9倍)。這說明,即使我們使用MSE和MAE來訓練模型,我們在評估它們時也使用了不同的標準。

損失函式的技巧

在根據深度學習的系統中,特別是那些處理文字、影像或音訊資料的系統,損失函式的選擇至關重要。適當選擇的損失函式可以幫助解決許多與模型訓練相關的問題,尤其是對於複雜的模型和/或資料領域。例如,交叉熵損失是分類別問題的經典解決方案。其中一個問題與類別不平衡有關。如果一個類別被嚴重過度代表,最佳化熵損失的模型可能會面臨所謂的模式當機——即對於任何輸入都輸出一個常數(流行的類別)。研究人員透過設計一種能夠解決這個問題的損失函式來解決這個問題;最值得注意的結果可能是Lin等人的工作(“Focal Loss for Dense Object Detection”),這種損失現在在幫助解決資料不平衡問題的工具中佔有一席之地。

焦點損失函式

焦點損失(Focal Loss)是一種動態縮放的交叉熵損失,其中縮放因子隨著對正確類別的信心增加而衰減到零。直觀地說,這個縮放因子可以在訓練過程中自動降低容易示例的貢獻,並迅速將模型集中在困難示例上。

程式碼範例:焦點損失函式

import torch
import torch.nn as nn
import torch.nn.functional as F

class FocalLoss(nn.Module):
    def __init__(self, gamma=2, alpha=0.25):
        super(FocalLoss, self).__init__()
        self.gamma = gamma
        self.alpha = alpha

    def forward(self, inputs, targets):
        BCE_loss = F.binary_cross_entropy_with_logits(inputs, targets, reduction='none')
        pt = torch.exp(-BCE_loss)
        loss = self.alpha * (1-pt)**self.gamma * BCE_loss
        return loss.mean()

# 使用FocalLoss作為損失函式
criterion = FocalLoss()
inputs = torch.randn(10, requires_grad=True)
targets = torch.randint(0, 2, (10,)).float()
loss = criterion(inputs, targets)
print(loss)

內容解密:

  1. FocalLoss類別繼承自nn.Module,定義了一個焦點損失函式。gammaalpha是超引數,分別控制縮放因子的衰減速率和權重。
  2. forward方法中,首先計算二元交叉熵損失(BCE_loss),然後計算pt,即正確類別的機率。最後,計算焦點損失,並傳回其平均值。
  3. 焦點損失函式透過降低容易分類別樣本的權重,使模型更關注難以分類別的樣本,從而提高模型的效能。

評估指標

我們最佳化的損失函式和用來評估模型效能的指標可以非常不同。回想一下,第4章中超級市場需求預測系統的最終目標是減少交付和銷售物品之間的差距,使其盡可能窄,同時避免缺貨情況。如果我們試圖將管道視覺化,它可能看起來像圖5.4。我們知道,一個合適的損失函式是必不可少的,但評估指標呢?難道我們不能選擇一些標準指標,評估多種模型,選擇最好的,佈署它,並透過A/B測試來估計潛在的成功嗎?

圖表說明

此圖示展示了需求預測系統的工作流程,從資料輸入到模型評估。

圖表內容解密:

  1. 圖表展示了需求預測系統的工作流程,首先是資料輸入,然後是模型訓練。
  2. 在模型訓練過程中,會計算損失函式,以最佳化模型的效能。
  3. 同時,也會計算評估指標,以評估模型的效能。
  4. 最後,根據評估結果佈署模型。

總之,損失函式和評估指標在機器學習中扮演著不同的角色。選擇合適的損失函式可以幫助模型更好地學習資料,而選擇合適的評估指標可以幫助我們更好地評估模型的效能。

選擇正確的評估指標:機器學習專案成功的關鍵

在機器學習(ML)專案中,選擇正確的評估指標(Metrics)與選擇適當的損失函式(Loss Functions)同等重要。錯誤的評估指標可能導致模型最佳化方向錯誤,最終影響專案在實際應用中的表現。因此,精心挑選評估指標是確保專案成功的關鍵步驟。

為什麼評估指標如此重要?

評估指標用於衡量模型的效能,並指導模型的訓練方向。一個不恰當的評估指標可能會導致模型過度最佳化於無關緊要的目標,從而在實際應用中表現不佳。這種情況可能導致開發團隊需要回溯多個步驟,浪費大量時間和資源。

案例研究:銀行債務催收系統

曾經有一個為銀行開發的機器學習系統,旨在減少逾期付款並提高客戶的回應率。最初選擇的評估指標是客戶從逾期狀態轉變為正常付款狀態的轉換率(Conversion Rate)。系統實施後,在驗證階段顯示出高達0.9的轉換率,但實際執行兩週後,轉換率卻驟降至0.35。

#### 內容解密:

這個案例突顯了選擇正確評估指標的重要性。初始評估指標未能準確反映系統在實際環境中的表現。進一步分析發現,問題在於資料函式庫更新延遲與客戶回饋機制之間的矛盾。客戶在還款後,因資料函式庫未及時更新而被誤判為逾期,並收到催款簡訊。客戶在回覆簡訊時,因系統限制無法輸入早於當前日期的還款日期,導致系統誤判客戶承諾還款但未履約。

如何選擇正確的評估指標?

選擇評估指標的基本原則是盡量貼近最終目標。然而,實際操作中這可能相當具有挑戰性。以下是一些建議的方法:

  1. 利用指標層級結構:如果存在指標層級結構,可以利用它來導航至所需的評估指標。

  2. 尋求專業部門協助:某些公司設有專門的部門負責制定評估指標,可以利用他們的專業知識。

  3. 與產品經理和資料科學家合作:共同開發最合適的評估指標。

  4. 借鑒過往經驗:如果曾經解決過類別似問題,可以參考過往專案的評估指標,並根據需要進行調整。

#### 內容解密:

這些方法提供了不同的途徑來幫助選擇合適的評估指標。無論是利用內部資源還是借鑒外部經驗,關鍵都在於確保所選指標能夠準確反映專案目標和實際應用中的效能。

此圖示說明瞭機器學習專案從開始到持續監控的流程,強調了選擇正確評估指標的重要性。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
skinparam arrow {
    color #262626
    thickness 2
}
skinparam package {
    borderColor #262626
    backgroundColor #F2F2F2
    fontColor #262626
}
skinparam component {
    borderColor #262626
    backgroundColor #FFFFFF
    fontColor #262626
}

title 損失函式與評估指標的選擇與應用

package "問題定義" {
    [專案目標] as Goal
    [問題類型 (迴歸/分類)] as ProblemType
}

package "指標選擇策略" {
    [問題類型匹配] as Match
    [專案目標對齊] as Align
    [可解釋性考量] as Interpret
}

package "損失函式" {
    component "選擇" as LossChoice
    note right of LossChoice
        - MSE (對異常值敏感)
        - MAE (對異常值穩健)
        - 交叉熵
        - 焦點損失 (處理類別不平衡)
    end note
    
    component "特性" as LossProperties {
        [全域性連續性]
        --
        [可微分性]
    }
}

package "評估指標" {
    component "選擇" as MetricChoice
    note right of MetricChoice
      **模型指標**
      - MSE, MAE
      - 準確率, F1-Score
      - AUC-ROC
      **業務指標**
      - 轉換率
      - 營收
    end note
}

package "模型開發" {
    [模型訓練] as Training
    [模型評估] as Evaluation
}

Goal -> Align
ProblemType -> Match
Align -> MetricChoice
Match -> MetricChoice
Interpret -> MetricChoice

ProblemType -> LossChoice
LossChoice -> Training
MetricChoice -> Evaluation

Training -> Evaluation : <&transfer>

@enduml

此圖示詳細展示了銀行債務催收系統中的問題流程,包括客戶回覆簡訊、系統限制和資料函式庫更新延遲等因素如何導致轉換率下降。

最終建議

在機器學習專案中,精心挑選和持續最佳化評估指標是確保專案成功的關鍵。透過結合專案需求、專業知識和持續監控,可以最大限度地提高模型的效能和專案的實際應用價值。