摘要:本文介绍了机器学习中常用的代价函数及其应用。分类任务主要使用二元交叉熵(二分类)和类别交叉熵(多分类)函数,回归任务常用均方误差和平均绝对误差。文章详细解释了二元交叉熵函数的数学定义、特性及Python实现方法,并通过鸢尾花数据集示例展示了如何用scikit-learn训练逻辑回归模型并计算损失值。代价函数的选择直接影响模型优化效果,理解其原理对机器学习实践具有重要意义。
目录
[1. 二元交叉熵损失](#1. 二元交叉熵损失)
[2. 类别交叉熵损失](#2. 类别交叉熵损失)
[1. 均方误差(MSE)](#1. 均方误差(MSE))
[2. 平均绝对误差(MAE)](#2. 平均绝对误差(MAE))
[二元交叉熵损失的 Python 实现](#二元交叉熵损失的 Python 实现)
机器学习中的代价函数
在机器学习中,代价函数是衡量机器学习模型性能表现的一种指标。它是一个数学函数,输入模型的预测值和数据的真实值,输出一个单一的标量值,该标量值代表模型预测结果的代价或误差。训练机器学习模型的目标就是最小化代价函数。
代价函数的选择取决于要解决的具体问题。例如,在二分类任务中(目标是预测数据点属于两个类别中的某一个),最常用的代价函数是二元交叉熵函数;在回归任务中(目标是预测一个连续值),则常用均方误差函数。
分类问题的代价函数
分类问题属于监督式机器学习任务。监督式学习模型的目标是找到能最小化代价函数的最优参数值。分类问题可分为二分类和多分类两类:二分类问题最常用的代价函数是二元交叉熵函数,多分类问题最常用的是类别交叉熵函数。
1. 二元交叉熵损失
下面详细介绍二元交叉熵函数。假设有一个二分类问题,包含类别 0 和类别 1,用p(y=1|x)表示模型预测样本属于类别 1 的概率,每个数据点的真实标签要么是 0,要么是 1。二元交叉熵代价函数的定义如下:
-
单个样本:
-
整个数据集:
其中,n是数据点的数量,yᵢ是第i个数据点的真实标签,pᵢ是对应的模型预测该数据点属于类别 1 的概率。
二元交叉熵函数具有多个理想特性:
- 它是凸函数,这意味着存在唯一的全局最小值,可通过优化技术找到;
- 它是严格正函数,即会对错误预测进行惩罚;
- 它是可微函数,因此可用于基于梯度的优化算法。
2. 类别交叉熵损失
类别交叉熵损失适用于图像分类等多分类问题,用于衡量每个类别的预测概率分布与真实分布之间的差异。
回归问题的代价函数
回归问题的代价函数用于计算真实值与模型预测值之间的差异,有多种误差可作为代价函数,最常用的是平均绝对误差(MAE)和均方误差(MSE)。
1. 均方误差(MSE)
均方误差衡量预测值与真实值之间的平均平方差。
2. 平均绝对误差(MAE)
平均绝对误差衡量预测值与真实值之间的平均绝对差,相比 MSE,它对异常值的敏感度更低。
二元交叉熵损失的 Python 实现
下面展示如何使用 NumPy 在 Python 中实现二元交叉熵函数:
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()
在该实现中,首先对预测概率进行裁剪(clip),以避免对数运算出现数值问题,然后使用 NumPy 函数计算二元交叉熵损失,并返回所有数据点的平均值。
定义好代价函数后,可通过梯度下降等优化技术训练机器学习模型。优化的目标是找到能最小化代价函数的一组模型参数。
示例
以下示例展示如何使用二元交叉熵函数,通过 scikit-learn 库在鸢尾花(Iris)数据集上训练逻辑回归模型:
python
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# 加载鸢尾花数据集
iris = load_iris()
# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)
# 训练逻辑回归模型
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = logreg.predict(X_test)
# 计算二元交叉熵损失
loss = binary_cross_entropy(logreg.predict_proba(X_test)[:, 1], y_test)
print('损失值:', loss)
示例说明
- 首先使用 scikit-learn 的
load_iris函数加载鸢尾花数据集; - 利用
train_test_split函数将数据划分为训练集和测试集; - 使用 scikit-learn 的
LogisticRegression类在训练集上训练逻辑回归模型; - 调用训练好的模型的
predict方法在测试集上进行预测; - 为计算二元交叉熵损失,使用逻辑回归模型的
predict_proba方法获取测试集中每个数据点属于类别 1 的预测概率,通过索引提取类别 1 的概率,与测试集的真实标签一起传入binary_cross_entropy函数,计算并输出损失值。
输出结果
运行上述代码后,将得到以下输出:
plaintext
损失值: 1.6312339784720309
二元交叉熵损失值反映了逻辑回归模型对测试集中每个数据点类别的预测效果:损失值越低,模型性能越好;损失值为 0 时表示模型预测完全准确。