菜单

模型评估与损失函数

相关源文件

目的与范围

本文档涵盖了用于评估机器学习模型的**方法和指标**,以及在训练过程中使用的各种**损失函数**。它解释了如何衡量模型性能,为不同任务选择合适的评估指标,并理解常用损失函数的数学基础。有关使用这些损失函数进行优化的技术,请参阅 训练方法与优化

模型评估

模型评估是评估机器学习模型在给定数据上表现如何的过程。不同的指标服务于不同的目的,并适用于不同的任务。

混淆矩阵

混淆矩阵是评估分类模型性能的基本工具,尤其对于二分类问题。

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md140-147

常用评估指标

基于混淆矩阵,可以推导出多种评估指标

指标公式描述
准确率(TP+TN)/(P+N)正确分类样本的比例
错误率(FP+FN)/(P+N)错误分类样本的比例
灵敏度(召回率)TP/P实际为正例中,被正确预测为正例的比例。
特异性TN/N实际为负例且被正确识别的比例
精确率TP/(TP+FP)实际为正例且被预测为正例的比例
F1 分数2×(精确率×召回率)/(精确率+召回率)精确率和召回率的调和平均值。

对于多类别分类问题,常使用宏平均 F1 和微平均 F1

  • 宏平均 F1:分别计算每个类别的 F1 分数,然后取算术平均值
  • 微平均 F1:计算所有类别的总 TP、FP、FN,然后计算 F1 分数

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md151-179

ROC和PR曲线

  • ROC 曲线:在各种阈值设置下,绘制真实正例率(灵敏度)与假正例率(1-特异度)
  • PR 曲线:在各种阈值设置下,绘制精确率与召回率
  • AUC:ROC 曲线下的面积,值越高表示模型性能越好
  • AP:平均精确率,PR 曲线下的面积,常用于目标检测评估

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md183-192

选择合适的评估指标

准确率指标本身通常是不够的,尤其是在处理不平衡数据集时。考虑地震预测的例子,其中绝大多数样本都是负例(无地震)。

例如,在地震预测中,未能检测到实际发生的地震(假阴性)的代价远高于误报(假正例)。在这种情况下,召回率比准确率更关键。

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md193-202

损失函数

损失函数是在模型训练过程中量化预测值与实际值之间差异的数学函数。它们提供了一种通过最小化误差来优化模型参数的方法。

损失函数的作用

损失函数作为目标函数,学习算法在训练过程中试图最小化它。它将每个训练样本的误差转换为一个标量值,表示模型的性能有多好。

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md376-378 English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md71-72

常见损失函数

1. 0-1 损失函数

最简单的损失函数,对于错误预测,损失值为 1;对于正确预测,损失值为 0。

L(Y, f(x)) = {
    1, if Y ≠ f(x)
    0, if Y = f(x)
}

一个松弛版本允许设置一个容忍阈值

L(Y, f(x)) = {
    1, if |Y - f(x)| ≥ T
    0, if |Y - f(x)| < T
}

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md385-404

2. 绝对损失函数

衡量预测值与实际值之间的绝对差值

L(Y, f(x)) = |Y - f(x)|

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md406-411

3. 均方损失函数

衡量预测值与实际值之间的平方差

L(Y, f(x)) = (Y - f(x))²

此损失函数常用于回归问题,是最小二乘法等方法的基础。

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md413-419

4. 对数损失函数(交叉熵损失)

用于二分类

L(Y, P(Y|X)) = -log(P(Y|X))

其中 P(Y|X) 是给定输入 X 的正确类别 Y 的预测概率。

二分类交叉熵损失

L(y, p) = -[y·log(p) + (1-y)·log(1-p)]

其中 y 是实际值(0 或 1),p 是预测概率。

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md421-428 English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md329-340

5. 指数损失函数

用于 AdaBoost 等算法

L(Y, f(x)) = exp(-Y·f(x))

其中 Y 为 -1 或 1,f(x) 为预测值。

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md430-436

6. Hinge 损失函数

用于支持向量机

L(Y) = max(0, 1-T·y)

其中 y 是 -1 到 1 范围内的预测值,T 是目标值(-1 或 1)。

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md438-458

损失函数与成本函数的关系

在机器学习术语中,“损失函数”和“成本函数”经常互换使用,但它们可能存在细微的差别。

  • 损失函数:衡量单个训练样本的误差
  • 成本函数:衡量整个训练集上的平均误差

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md270-302

选择正确的损失函数

损失函数的选择取决于问题的性质、数据的分布以及应用的具体要求。

损失函数选择指南

  1. 分类问题:

    • 二分类:对数损失(二元交叉熵)
    • 多分类:分类交叉熵
    • 关心异常值时:Hinge 损失
  2. 回归问题:

    • 标准情况:均方误差(MSE)
    • 关心异常值时:平均绝对误差(MAE)或 Huber 损失
  3. 特殊注意事项:

    • 不平衡数据集可能需要自定义损失函数或类别加权
    • 二次成本函数适用于输出神经元是线性的情况
    • 交叉熵成本函数适用于输出神经元使用 Sigmoid 激活函数的情况
    • 对于 Softmax 输出,通常使用对数似然成本

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md356-354

框架实现

大多数深度学习框架都提供了常见损失函数的内置实现。

  • TensorFlow:

    • 带 Sigmoid 的交叉熵:tf.nn.sigmoid_cross_entropy_with_logits()
    • 带 Softmax 的交叉熵:tf.nn.softmax_cross_entropy_with_logits()
  • PyTorch:

    • 带 Sigmoid 的交叉熵:torch.nn.BCEWithLogitsLoss()
    • 带 Softmax 的交叉熵:torch.nn.CrossEntropyLoss()

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md348-354

案例研究:为什么交叉熵优于二次成本

神经网络训练中一个常见的问题是,为什么在分类问题上,交叉熵损失比二次成本(MSE)更受青睐。关键的洞察来自于对梯度公式的分析。

  1. 二次成本函数梯度:

    ∂J/∂w = (a-y)σ'(z)x
    ∂J/∂b = (a-y)σ'(z)
    
  2. 交叉熵成本函数梯度:

    ∂J/∂w = (σ(z)-y)x
    ∂J/∂b = (σ(z)-y)
    

二次成本的梯度包含 σ'(z),即 Sigmoid 函数的导数。当 Sigmoid 输出接近 0 或 1 时,该导数变得非常小,导致“梯度消失问题”,减缓学习速度。交叉熵消除了这个项,使得在误差较大时学习速度更快。

这使得交叉熵对于输出层带有 Sigmoid 或 Softmax 激活函数的分类任务特别有效。

来源: English version/ch02_MachineLearningFoundation/Chapter 2_TheBasisOfMachineLearning.md357-370