機器學習 - 成本函式



在機器學習中,成本函式是衡量機器學習模型效能的一種指標。它是一個數學函式,它接收模型的預測值和資料的真實值,並輸出一個表示模型預測成本或誤差的單個標量值。訓練機器學習模型的目標是最小化成本函式。

成本函式的選擇取決於要解決的具體問題。例如,在二分類任務中,目標是預測資料點是否屬於兩個類別之一,最常用的成本函式是二元交叉熵函式。在迴歸任務中,目標是預測一個連續值,通常使用均方誤差函式。

讓我們仔細看看二元交叉熵函式。給定一個有兩個類別的二分類問題,我們稱之為類別 0 和類別 1,並用“p(y=1|x)”表示模型預測類別 1 的機率。每個資料點的真實標籤要麼是 0 要麼是 1。我們可以將二元交叉熵成本函式定義如下:

$$J=-\left ( \frac{1}{m} \right )\times \Sigma \left ( y\times log\left ( p \right )+\left ( 1-y \right )\times log\left ( 1-p \right ) \right )$$

其中“m”是資料點的數量,“y”是每個資料點的真實標籤,“p”是類別 1 的預測機率。

二元交叉熵函式具有幾個理想的特性。首先,它是一個凸函式,這意味著它有一個唯一的全域性最小值,可以使用最佳化技術找到。其次,它是一個嚴格的正函式,這意味著它會懲罰錯誤的預測。第三,它是一個可微函式,這意味著它可以與基於梯度的最佳化演算法一起使用。

Python 實現

現在讓我們看看如何使用 NumPy 在 Python 中實現二元交叉熵函式:

import numpy as np

def binary_cross_entropy(y_pred, y_true):
   eps = 1e-15
   y_pred = np.clip(y_pred, eps, 1 - eps)
   return -(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)).mean()

在此實現中,我們首先對預測機率進行裁剪,以避免對數運算中的數值問題。然後,我們使用 NumPy 函式計算二元交叉熵損失,並返回所有資料點的平均值。

一旦我們定義了成本函式,我們就可以使用它來訓練機器學習模型,使用諸如梯度下降之類的最佳化技術。最佳化的目標是找到使成本函式最小化的模型引數集。

示例

以下是如何使用二元交叉熵函式在 Iris 資料集上訓練邏輯迴歸模型的示例,使用 scikit-learn:

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# Load the Iris dataset
iris = load_iris()

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)

# Train a logistic regression model
logreg = LogisticRegression()
logreg.fit(X_train, y_train)

# Make predictions on the testing set
y_pred = logreg.predict(X_test)

# Compute the binary cross-entropy loss
loss = binary_cross_entropy(logreg.predict_proba(X_test)[:, 1], y_test)
print('Loss:', loss)

在上面的示例中,我們首先使用 scikit-learn 中的 `load_iris` 函式載入 Iris 資料集。然後,我們使用 `train_test_split` 函式將資料分成訓練集和測試集。我們使用 scikit-learn 中的 `LogisticRegression` 類在訓練集上訓練邏輯迴歸模型。然後,我們使用訓練模型的 `predict` 方法對測試集進行預測。

為了計算二元交叉熵損失,我們使用邏輯迴歸模型的 `predict_proba` 方法獲取測試集中每個資料點類別 1 的預測機率。然後,我們使用索引提取類別 1 的機率,並將它們與測試集的真實標籤一起傳遞給我們的 `binary_cross_entropy` 函式。該函式計算損失並返回它,我們在終端上顯示它。

輸出

當您執行此程式碼時,它將產生以下輸出:

Loss: 1.6312339784720309

二元交叉熵損失是衡量邏輯迴歸模型能夠預測測試集中每個資料點類別的能力。損失越低,效能越好,損失為 0 表示效能完美。

廣告