机器学习中 Cost Function 怎么理解和计算?

文章导读
Previous Quiz Next 机器学习中的成本函数 在机器学习中,cost function 是衡量机器学习模型性能好坏的指标。它是一个数学函数,输入模型的预测值和数据的真实值,输出一个标量值,表示模型预测的成本或误差。训练机器学习模型的目标是最小化成本函数。
📋 目录
  1. 机器学习中的成本函数
  2. 分类问题的成本函数
  3. 回归问题的成本函数
  4. Python 中二元交叉熵损失的实现
A A

机器学习 - 成本函数



Previous
Quiz
Next

机器学习中的成本函数

在机器学习中,cost function 是衡量机器学习模型性能好坏的指标。它是一个数学函数,输入模型的预测值和数据的真实值,输出一个标量值,表示模型预测的成本或误差。训练机器学习模型的目标是最小化成本函数。

成本函数的选择取决于具体解决问题类型。例如,在二元分类任务中,目标是预测数据点属于两个类别之一,最常用的成本函数是 binary cross-entropy 函数。在回归任务中,目标是预测连续值,通常使用 mean squared error 函数。

分类问题的成本函数

分类问题是监督机器学习任务。监督学习模型的目标是找到最优参数值以最小化成本函数。分类问题可以是二元分类或多类分类。对于二元分类,最常用的成本函数是 binary cross-entropy 函数,对于多类分类,最常用的成本函数是 categorical cross-entropy 函数。

1. Binary Cross-Entropy Loss

让我们更详细地看看 binary cross-entropy 函数。给定一个二元分类问题,有两个类别,我们称之为 class 0 和 class 1,模型预测 class 1 的概率记为“p(y=1|x)”。每个数据点的真实标签为 0 或 1。我们可以这样定义 binary cross-entropy 成本函数 —

对于单个样本,

$$\mathrm{\text{BCE} = -\left ( y\times log\left ( p \right )+\left ( 1-y \right )\times log\left ( 1-p \right ) \right )$$

对于整个数据集,

$$\mathrm{\text{BCE} = -\frac{1}{n} \sum_{i=1}^n \left[ y_i \log(p_i) + (1 - y_i) \log(1 - p_i) \right]}$$

其中 "${n}$" 是数据点数量,"${y_{i}}$" 是第 ${i}$ 个数据点的真实标签,"${p_{i}}$" 是对应的 class 1 预测概率。

Binary cross-entropy 函数具有几个理想特性。首先,它是凸函数,这意味着它有一个唯一的全局最小值,可以使用优化技术找到。其次,它是严格正函数,这意味着它会惩罚错误的预测。第三,它是可微函数,这意味着它可以与基于梯度的优化算法一起使用。

2. Categorical Cross-Entropy Loss

Categorical Cross-Entropy loss 用于多类分类问题,如图像分类等。它衡量预测概率分布与每个类真实分布之间的不相似度。

$$\mathrm{\text{CCE} = -\frac{1}{n} \sum_{i=1}^n \sum_{j=1}^k y_{ij} \log(\hat{y}_{ij})}$$

回归问题的成本函数

回归的成本函数计算实际值与模型预测值之间的差异。有不同类型的误差可以作为成本函数。回归问题最常见的成本函数是 mean absolute error (MAE) 和 mean squared error (MSE)。

1. Mean Squared Error (MSE)

Mean Square Error (MSE) 衡量预测值与实际值之间的平均平方差。

$$\mathrm{\text{MSE} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2$$

2. Mean Absolute Error (MAE)

Mean Absolute Error (MAE) 衡量预测值与实际值之间的平均绝对差。它比 MSE 对异常值不那么敏感。

$$\mathrm{ \text{MAE} = \frac{1}{n} \sum_{i=1}^n |y_i - \hat{y}_i| }$$

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 函数计算二元交叉熵损失,并返回所有数据点的平均值。

一旦我们定义了 cost function,就可以利用它通过梯度下降等优化技术来训练 machine learning model。优化的目标是找到使 cost function 最小化的模型参数集合。

示例 - Cost Function

以下是使用二元交叉熵函数在 Iris 数据集上训练 logistic regression 模型的示例,使用 scikit-learn −

import numpy as np
    
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

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()
    
# 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 class 在训练集上训练 logistic regression 模型。然后使用训练好的模型的 "predict" 方法对测试集进行预测。

为了计算二元交叉熵损失,我们使用 logistic regression 模型的 predict_proba 方法获取测试集中每个数据点的 class 1 预测概率。然后使用索引提取 class 1 的概率,并连同测试集的真实标签一起传递给我们的 binary_cross_entropy 函数。该函数计算损失并返回,我们在终端上显示它。

输出

执行此代码时,将产生以下输出 −

Loss: 1.6312339784720309

二元交叉熵损失是衡量 logistic regression 模型在测试集中预测每个数据点类别的好坏程度。损失越低,性能越好,损失为 0 表示完美性能。