机器学习中的代价函数

摘要:本文介绍了机器学习中常用的代价函数及其应用。分类任务主要使用二元交叉熵(二分类)和类别交叉熵(多分类)函数,回归任务常用均方误差和平均绝对误差。文章详细解释了二元交叉熵函数的数学定义、特性及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 的概率。

二元交叉熵函数具有多个理想特性:

  1. 它是凸函数,这意味着存在唯一的全局最小值,可通过优化技术找到;
  2. 它是严格正函数,即会对错误预测进行惩罚;
  3. 它是可微函数,因此可用于基于梯度的优化算法。

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)

示例说明

  1. 首先使用 scikit-learn 的load_iris函数加载鸢尾花数据集;
  2. 利用train_test_split函数将数据划分为训练集和测试集;
  3. 使用 scikit-learn 的LogisticRegression类在训练集上训练逻辑回归模型;
  4. 调用训练好的模型的predict方法在测试集上进行预测;
  5. 为计算二元交叉熵损失,使用逻辑回归模型的predict_proba方法获取测试集中每个数据点属于类别 1 的预测概率,通过索引提取类别 1 的概率,与测试集的真实标签一起传入binary_cross_entropy函数,计算并输出损失值。

输出结果

运行上述代码后,将得到以下输出:

plaintext

复制代码
损失值: 1.6312339784720309

二元交叉熵损失值反映了逻辑回归模型对测试集中每个数据点类别的预测效果:损失值越低,模型性能越好;损失值为 0 时表示模型预测完全准确。

相关推荐
橙露2 小时前
数据特征工程:缺失值、异常值、标准化一站式解决方案
人工智能·机器学习
新加坡内哥谈技术2 小时前
OpenAI 的 Codex 团队如何工作并利用 AI
人工智能
星河耀银海2 小时前
人工智能大模型的安全与隐私保护:技术防御与合规实践
人工智能·安全·ai·隐私
love530love2 小时前
Scoop 完整迁移指南:从 C 盘到 D 盘的无缝切换
java·服务器·前端·人工智能·windows·scoop
njsgcs2 小时前
agentscope提取msg+llama_index 查询
人工智能
哈里谢顿2 小时前
Django 应用 OOM(Out of Memory)故障的定位思路和排查方法
python·django
小和尚同志3 小时前
什么?oh-my-opencode 太重了?那试试 oh-my-opencode-slim
人工智能·aigc
甄心爱学习3 小时前
【python】获取所有长度为 k 的二进制字符串
python·算法
一路往蓝-Anbo3 小时前
第 9 章:Linux 设备树 (DTS) ——屏蔽与独占外设
linux·运维·服务器·人工智能·stm32·嵌入式硬件
飞哥数智坊3 小时前
把模型焊死在芯片上,就能跑出 17,000 tokens/秒?这是一条死路,还是一条新路?
人工智能