常见损失函数和评价指标总结(附代码)
作者:董文辉
本文长度为4500字,建议阅读10+分钟
本文为你总结常见损失函数和评价指标。
注:本文采用markdown进行编写,用markdown打开可得更佳展示效果~
## 1. 损失函数:
### 1.1 回归问题:
#### 1. 平方损失函数(最小二乘法):
$L(Y,f(x)) = \\sum_{i=1}^n(Y-f(X))^2$
回归问题中常用的损失函数,在线性回归中,可以通过极大似然估计(MLE)推导。计算的是预测值与真实值之间距离的平方和。实际更常用的是**均方误差(MSE)**:
$L(Y,f(x)) = \\frac{1}{m}\\sum_{i=1}^n(Y-f(X))^2$
#### 2 平均绝对值误差(L1)– MAE:
$L(Y,f(x)) = \\sum_{i=1}^n|Y-f(X)|$
MAE是目标值和预测值之差的**绝对值之和**,可以用来衡量预测值和真实值的距离。**但是它不能给出,模型的预测值是比真实值小还是大。**
#### 3 MAE(L1) VS MSE(L2):
* **MSE计算简便,但MAE对异常点有更好的鲁棒性:**
当数据中存在异常点时,用RMSE计算损失的模型会以牺牲了其他样本的误差为代价,朝着减小异常点误差的方向更新。然而这就会降低模型的整体性能。
>直观上可以这样理解:如果我们最小化MSE来对所有的样本点只给出一个预测值,那么这个值一定是所有目标值的平均值。但如果是最小化MAE,那么这个值,则会是所有样本点目标值的中位数。众所周知,对异常值而言,中位数比均值更加鲁棒,因此MAE对于异常值也比MSE更稳定。
* **NN中MAE更新梯度始终相同,而MSE则不同**:
MSE损失的梯度随损失增大而增大,而损失趋于0时则会减小。
* **Loss选择建议:**
* **MSE:** 如果异常点代表在商业中很重要的异常情况,并且需要被检测出来。
* **MAE:** 如果只把异常值当作受损数据。
#### 4. Huber损失:
$
L_{\\delta}(y, f(x))=\\left\\{\\begin{array}{ll}{\\frac{1}{2}(y-f(x))^{2}} & {\\text { for }|y-f(x)| \\leq \\delta} \\\\ {\\delta|y-f(x)|-\\frac{1}{2} \\delta^{2}} & {\\text { otherwise }}\\end{array}\\right.
$
Huber损失是绝对误差,只是在误差很小时,就变为平方误差。当Huber损失在$[0-\\delta,0+\\delta]$之间时,等价为MSE,而在$[-∞,\\delta]$和$[\\delta,+∞]$时为MAE。
### 1.2 分类问题:
#### 1. LogLoss:
$
J(\\theta)=-\\frac{1}{m} \\sum_{i=1}^{m}\\left[y^{(i)} \\log h_{\\theta}\\left(x^{(i)}\\right)+\\left(1-y^{(i)}\\right) \\log \\left(1-h_{\\theta}\\left(x^{(i)}\\right)\\right)\\right]
$
**二分类**任务中常用的损失函数,在LR中,通过对似然函数取对数得到。也就是**交叉熵**损失函数。
#### 2. 指数损失函数:
$L(y,f(x)) = \\frac{1}{m} \\sum_{i=1}^n{exp[-y_if(x_i)]}$
在AdaBoost中用到的损失函数。
## 2.评价指标:
如何评估机器学习算法模型是任何项目中一个非常重要的环节。分类问题一般会选择准确率(Accuracy)或者AUC作为metric,回归问题使用MSE,但这些指标并不足以评判一个模型的好坏,接下来的内容我将尽可能包括各个评价指标。上述损失函数大部分可以直接作为评价指标来使用,上面出现过的简单介绍。
### 2.1 回归问题:
**1. MAE:
** 平均绝对误差(Mean Absolute Error),范围 $[0,+∞)$
$
MAE=\\frac{1}{n} \\sum_{i=1}^{n}\\left|\\hat{y}_{i}-y_{i}\\right|
$
**2. MSE:
** 均方误差(Mean Square Error),范围 $[0,+∞)$
$
MSE=\\frac{1}{n} \\sum_{i=1}^{n}\\left(\\hat{y}_{i}-y_{i}\\right)^{2}
$
**3. RMSE:
** 根均方误差(Root Mean Square Error),范围 $[0,+∞)$
$
RMSE =\\sqrt{\\frac{1}{n} \\sum_{i=1}^{n}\\left(\\hat{y}_{i}-y_{i}\\right)^{2}}
$
取均方误差的平方根可以使得量纲一致,这对于描述和表示是有意义的。
**4. MAPE:
** 平均绝对百分比误差(Mean Absolute Percentage Error)
$
MAPE=\\frac{100 \\%}{n} \\sum_{i=1}^{n}\\left|\\frac{\\hat{y}_{i}-y_{i}}{y_{i}}\\right|
$
**注意点**:当真实值有数据等于0时,存在分母0除问题,该公式不可用!
**5. SMAPE:
** 对称平均绝对百分比误差(Symmetric Mean Absolute Percentage Error)
$
SMAPE=\\frac{100 \\%}{n} \\sum_{i=1}^{n} \\frac{\\left|\\hat{y}_{i}-y_{i}\\right|}{\\left(\\left|\\hat{y}_{i}\\right|+\\left|y_{i}\\right|\\right) / 2}
$
**注意点:** 真实值、预测值均等于0时,存在分母为0,该公式不可用!
**6. R Squared:**
$
R^{2}=1-\\frac{\\sum_{i}\\left(\\hat{y}^{(i)}-y^{(i)}\\right)^{2}}{\\sum_{i}\\left(\\bar{y}-y^{(i)}\\right)^{2}}
$
$R^2$即**决定系数(Coefficient of determination)**,被人们称为最好的衡量线性回归法的指标。
如果我们使用同一个算法模型,解决不同的问题,由于不同的数据集的量纲不同,MSE、RMSE等指标不能体现此模型针对不同问题所表现的优劣,也就无法判断模型更适合预测哪个问题。$R^2$得到的性能度量都在[0, 1]之间,可以判断此模型更适合预测哪个问题。
**公式的理解:**
1. 分母代表baseline(平均值)的误差,分子代表模型的预测结果产生的误差;
2. 预测结果越大越好,$R^2$为1说明完美拟合,$R^2$为0说明和baseline一致;
**7. 代码实现:**
“`python
# coding=utf-8
import numpy as np
from sklearn import metrics
# MAPE和SMAPE需要自己实现
def mape(y_true, y_pred):
return np.mean(np.abs((y_pred – y_true) / y_true)) * 100
def smape(y_true, y_pred):
return 2.0 * np.mean(np.abs(y_pred – y_true) / (np.abs(y_pred) + np.abs(y_true))) * 100
y_true = np.array([1.0, 5.0, 4.0, 3.0, 2.0, 5.0, -3.0])
y_pred = np.array([1.0, 4.5, 3.5, 5.0, 8.0, 4.5, 1.0])
# MSE
print(metrics.mean_squared_error(y_true, y_pred)) # 8.107142857142858
# RMSE
print(np.sqrt(metrics.mean_squared_error(y_true, y_pred))) # 2.847304489713536
# MAE
print(metrics.mean_absolute_error(y_true, y_pred)) # 1.9285714285714286
# MAPE
print(mape(y_true, y_pred)) # 76.07142857142858
# SMAPE
print(smape(y_true, y_pred)) # 57.76942355889724
# R Squared
print(r2_score(y_true, y_pred))
“`
### 2.2 分类问题:
#### 0. Confusion Matrix(混淆矩阵):
混淆矩阵一般不直接作为模型的评价指标,但是他是后续多个指标的基础。以下为二分类的混淆矩阵,多分类的混淆矩阵和这个类似。
| |预测正例| 预测反例|
|–|–|–|
|真实正例|TP(真正例)| FN(假反例)|
|真实反例|FP(假正例)|TN(真反例)|
我们训练模型的目的是为了降低FP和FN。很难说什么时候降低FP,什么时候降低FN。基于我们不同的需求,来决定降低FP还是FN。
* **降低假负数例(FN)**:
假设在一个癌症检测问题中,每100个人中就有5个人患有癌症。在这种情况下,即使是一个非常差的模型也可以为我们提供95%的准确度。但是,为了捕获所有癌症病例,当一个人实际上没有患癌症时,我们可能最终将其归类为癌症。因为它比不识别为癌症患者的危险要小,因为我们可以进一步检查。但是,错过癌症患者将是一个巨大的错误,因为不会对其进行进一步检查。
* **降低假正例(FP)**:
假设在垃圾邮件分类任务中,垃圾邮件为正样本。如果我们收到一个正常的邮件,比如某个公司或学校的offer,模型却识别为垃圾邮件(FP),那将损失非常大。所以在这种任务中,需要尽可能降低假正例。
#### 1. Accuracy(准确率):
$
Acc=\\frac{T P+T N}{T P+T N+F P+F N}
$
准确率也就是在所有样本中,有多少样本被预测正确。
当样本类别均衡时,Accuracy是一个很好的指标。
但在样本不平衡的情况下,产生效果较差。假设我们的训练数据中只有2%的正样本,98%的负样本,那么如果模型全部预测为负样本,准确率便是98%,。分类的准确率指标很高,会给我们一种模型很好的假象。
#### 2. Precision(精准率):
$
P=\\frac{T P}{T P+F P}
$
**含义:** 预测为正例的样本中有多少实际为正;
#### 3. Recall(召回率):
$
R=\\frac{T P}{T P+F N}
$
**含义:** 实际为正例的样本有多少被预测为正;
#### 4. P-R曲线:
通过选择不同的阈值,得到Recall和Precision,以Recall为横坐标,Precision为纵坐标得到的曲线图。
**PR曲线性质:**
* 如果一个学习器的P-R曲线被另一个学习器的曲线完全包住,后者性能优于前者;
* 如果两个学习器的曲线相交,可以通过平衡点的来度量性能,它是“查准率=查全率”时的取值;
* **阈值为0时**:$TP=0 => Precision=0,Recall=0$ 所以PR 曲线经过 **(0,0)点**;
* **阈值上升**:
* **Recall**:不断增加,因为越来越多的样本被划分为正例;
* **Precision:** 震荡下降,不是严格递减;
* 如果有个划分点可以把正负样本完全区分开,那么P-R曲线面积是1*1;
#### 5. $F_{\\beta }$(加权调和平均)和 $F_1$(调和平均):
$F_{\\beta }=\\frac{(1+\\beta ^{2})*P*R}{(\\beta ^{2}*P)+R}$
* $\\beta >1$:召回率(Recall)影响更大,eg.$F_2$
* $\\beta <1$:精确率(Precision)影响更大,eg.$F_{0.5}$
$\\beta$为1的时候得到$F_1$:
$F_{1}=\\frac{2*P*R}{P+R}$
调和平均亦可推出:
$\\frac{1}{F_{1}}=\\frac{1}{2}*(\\frac{1}{R}+\\frac{1}{P})$
#### 6. ROC-AUC:
**Area Under Curve(AUC)** 是**二分类**问题中使用非常广泛的一个评价指标。**AUC的本质是,任取一个正样本和负样本,模型输出正样本的值大于负样本值的概率**。构成AUC的两个基本指标是假正例率和真正例率。
* **横轴-假正例率:** 实际为负的样本多少被预测为正;
$FPR=\\frac{FP}{TN+FP}$
* **纵轴-真正例率:** 实际为正的样本多少被预测为正;
$TPR=\\frac{TP}{TP+FN}$
TPR和FPR的范围均是[0,1],通过选择不同的阈值得到TPR和FPR,然后绘制ROC曲线。
**曲线性质:**
1. 阈值最大时,对应**坐标点为(0,0)**,阈值最小时,对应**坐标点(1,1)**;
2. ROC曲线越靠近左上角,该分类器的性能越好;
3. 对角线表示一个随机猜测分类器;
4. 若一个学习器的ROC曲线被另一个学习器的曲线完全包住,后者性能优于前者;
**AUC:** ROC曲线下的面积为AUC值。
#### 7. 代码实现:
“`python
from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score,fbeta_score
y_test = [1,1,1,1,0,0,1,1,1,0,0]
y_pred = [1,1,1,0,1,1,0,1,1,1,0]
print(\”准确率为:{0:%}\”.format(accuracy_score(y_test, y_pred)))
print(\”精确率为:{0:%}\”.format(precision_score(y_test, y_pred)))
print(\”召回率为:{0:%}\”.format(recall_score(y_test, y_pred)))
print(\”F1分数为:{0:%}\”.format(f1_score(y_test, y_pred)))
print(\”Fbeta为:{0:%}\”.format(fbeta_score(y_test, y_pred,beta =1.2)))
“`
### 参考资料:
[1. 分类问题性能评价指标详述]
(https://blog.csdn.net/foneone/article/details/88920256)
[2.AUC,ROC我看到的最透彻的讲解]
(https://blog.csdn.net/u013385925/article/details/80385873)
[3.机器学习大牛最常用的5个回归损失函数,你知道几个?]
(https://www.jiqizhixin.com/articles/2018-06-21-3)
[4.机器学习-损失函数]
(https://www.csuldw.com/2016/03/26/2016-03-26-loss-function/)
[5.损失函数jupyter notebook]
(https://nbviewer.jupyter.org/github/groverpr/Machine-Learning/blob/master/notebooks/05_Loss_Functions.ipynb)
[6.L1 vs. L2 Loss function]
(http://rishy.github.io/ml/2015/07/28/l1-vs-l2-loss/)
[7. P-R曲线深入理解]
(https://blog.csdn.net/b876144622/article/details/80009867)
编辑:于腾凯
校对:林亦霖
作者简介
董文辉,电子科技大学硕士,主要研究方向:推荐系统、自然语言处理和金融风控。希望能将算法应用在更多的行业中。
—完—
关注清华-青岛数据科学研究院官方微信公众平台“ THU数据派 ”及姊妹号“ 数据派THU ”获取更多讲座福利及优质内容。
神经网络算法 – 一文搞懂Loss Function(损失函数)
本文将从损失函数的本质、损失函数的原理、损失函数的算法三个方面,带您一文搞懂损失函数 Loss Function 。
损失函数
一、损失函数的本质
机器学习“三板斧”:选择模型家族,定义损失函数量化预测误差,通过优化算法找到最小化损失的最优模型参数。
机器学习 vs 人类学习
- 定义一个函数集合(模型选择)
- 目标:确定一个合适的假设空间或模型家族。
- 示例:线性回归、逻辑回归、神经网络、决策树等。
- 考虑因素:问题的复杂性、数据的性质、计算资源等。
- 判断函数的好坏(损失函数)
- 目标:量化模型预测与真实结果之间的差异。
- 示例:均方误差(MSE)用于回归;交叉熵损失用于分类。
- 考虑因素:损失的性质(凸性、可微性等)、易于优化、对异常值的鲁棒性等。
- 选择最好的函数(优化算法)
- 目标:在函数集合中找到最小化损失函数的模型参数。
- 主要方法:梯度下降及其变种(随机梯度下降、批量梯度下降、Adam等)。
- 考虑因素:收敛速度、计算效率、参数调整的复杂性等。
损失函数的本质:量化模型预测与真实结果之间的差异。
损失函数的本质
- 一、损失函数的概念:
- 损失函数用于量化模型预测与真实值之间的差异。
- 它是预测值与真实值之间差距的计算方法,并通过深度学习框架(如PyTorch、TensorFlow)进行封装。
- 二、损失函数的重要性:
- 在机器学习中,目标是使预测值尽可能接近真实值,因此需要通过最小化预测值和真实值之间的差异来实现。
- 损失函数的选择对于模型的训练速度和效果至关重要,因为不同的损失函数会导致不同的梯度下降速度。
- 三、损失函数的位置:
- 损失函数位于机器学习模型的向前传播和向后传播之间。
- 在向前传播阶段,模型根据输入特征生成预测值。
- 损失函数接收这些预测值,并计算与真实值之间的差异。
- 这个差异随后被用于向后传播阶段,以更新模型的参数并减少未来的预测误差。
损失函数的位置
二、损失函数的原理
- 定义:误差是指模型在对单个数据点进行预测时,其预测结果与真实值之间的差异或偏离程度。这种差异反映了模型预测的不准确性或偏差。
- 计算:误差可以通过多种数学公式来计算。其中,绝对误差是预测值与真实值之间差值的绝对值,用于量化预测偏离真实值的实际大小;平方误差则是预测值与真实值之间差值的平方,常用于平方损失函数中,以便更显著地突出较大的误差。
- 误差棒:误差棒通常以线条或矩形的形式出现在数据点的上方、下方或两侧,其长度或大小代表了误差的量级。这种可视化方法有助于识别潜在的问题区域,并指导进一步的模型改进或数据分析。
误差棒
损失(Loss):损失是衡量机器学习模型在整个数据集上预测不准确性的总体指标,通过最小化损失可以优化模型参数并改进预测性能。
- 定义:损失是衡量机器学习模型在整个数据集上预测的总体不准确性的指标。它反映了模型预测与真实值之间的差异,并将这些差异进行聚合,以提供一个标量值来表示预测的总体不准确性。
- 计算:损失的具体计算是通过损失函数来完成的。损失函数接受模型的预测值和真实值作为输入,并输出一个标量值,即损失值,表示模型在整个数据集上的总体预测误差。
- 损失曲线:损失曲线直观地呈现了模型在训练过程中损失值的变化趋势。通过绘制训练损失和验证损失随迭代次数的变化,我们能够洞察模型是否遭遇过拟合或欠拟合等问题,进而调整模型结构和训练策略。
损失曲线
三、损失函数的算法
损失函数的算法
均方差损失函数(MSE):通过计算模型预测值与真实值之间差值的平方的平均值,衡量回归任务中预测结果的准确性,旨在使预测值尽可能接近真实值。
均方差损失函数(MSE)
- 应用场景:主要用于回归问题,即预测连续值的任务。
- 公式:
均方差损失函数(MSE)公式
- 特点:
- 当预测值接近真实值时,损失值较小。
- 当预测值与真实值差距较大时,损失值迅速增大。
- 由于其梯度形式简单,易于优化。
- 优化目标:最小化均方差损失,使得模型的预测值尽可能接近真实值。
交叉熵损失函数(CE):用于衡量分类任务中模型预测的概率分布与真实标签之间的差异,旨在通过最小化损失来使模型预测更加接近真实类别。
交叉熵损失函数(CE)
- 应用场景:主要用于分类问题,尤其是多分类问题。
- 公式:
交叉熵损失函数(CE)公式
- 特点:
- 当预测概率分布与真实概率分布相近时,损失值较小。
- 对预测概率的微小变化非常敏感,尤其当真实标签的概率接近0或1时。
- 适用于概率输出的模型,如逻辑回归、softmax分类器等。
- 优化目标:最小化交叉熵损失,使得模型对于每个类别的预测概率尽可能接近真实概率分布。
下面是截图,扫码进群免费领取:扫码进群领资料
我会在群里与朋友们定期分享人工智能的发展就业情况与相关资料。
最后祝大家天天进步!!
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。