作者:董文辉

本文长度为4500字,建议阅读10+分钟

本文为你总结常见损失函数和评价指标。

目录

  • 一、损失函数

    • 1.1 回归问题

    • 1.2 分类问题

  • 二、评价指标

    • 2.1 回归问题

    • 2.2 分类问题

  • 参考资料

一、损失函数

1.1 回归问题

1. 平方损失函数(最小二乘法):

回归问题中常用的损失函数,在线性回归中,可以通过极大似然估计(MLE)推导。计算的是预测值与真实值之间距离的平方和。实际更常用的是均方误差(Mean Squared Error-MSE):

2. 平均绝对值误差(L1)-- MAE:

MAE是目标值和预测值之差的绝对值之和,可以用来衡量预测值和真实值的距离。但是它不能给出,模型的预测值是比真实值小还是大。

3. MAE(L1) VS MSE(L2):

  • MSE计算简便,但MAE对异常点有更好的鲁棒性:当数据中存在异常点时,用MSE/RMSE计算损失的模型会以牺牲了其他样本的误差为代价,朝着减小异常点误差的方向更新。然而这就会降低模型的整体性能。

直观上可以这样理解:如果我们最小化MSE来对所有的样本点只给出一个预测值,那么这个值一定是所有目标值的平均值。但如果是最小化MAE,那么这个值,则会是所有样本点目标值的中位数。众所周知,对异常值而言,中位数比均值更加鲁棒,因此MAE对于异常值也比MSE更稳定。

  • NN中MAE更新梯度始终相同,而MSE则不同:MSE损失的梯度随损失增大而增大,而损失趋于0时则会减小。

  • Loss选择建议:

    • MSE:如果异常点代表在商业中很重要的异常情况,并且需要被检测出来

    • MAE:如果只把异常值当作受损数据

4. Huber损失:

Huber损失是绝对误差,只是在误差很小时,就变为平方误差。

  • 当Huber损失在 之间时,等价为MSE

  • 在 和 时等价为MAE

使用MAE训练神经网络最大的一个问题就是不变的大梯度,这可能导致在使用梯度下降快要结束时,错过了最小点。而对于MSE,梯度会随着损失的减小而减小,使结果更加精确。在这种情况下,Huber损失就非常有用。它会由于梯度的减小而落在最小值附近。比起MSE,它对异常点更加鲁棒。因此,Huber损失结合了MSE和MAE的优点。但是,Huber损失的问题是我们可能需要不断调整超参数delta。

下图是Huber跟随 的变化曲线。当 很大时,等价为MSE曲线,当 很小时,等价为MAE曲线。

1.2 分类问题:

1. LogLoss:

二分类任务中常用的损失函数,在LR中,通过对似然函数取对数得到。也就是交叉熵损失函数。

2. 指数损失函数:

在AdaBoost中用到的损失函数。它是前向分步加法算法的特例,是一个加和模型。在Adaboost中,经过m此迭代之后,可以得到 :

Adaboost每次迭代时的目的是为了找到最小化下列式子时的参数α 和G:

而指数损失函数(exp-loss)的标准形式如下

可以看出,Adaboost的目标式子就是指数损失,在给定n个样本的情况下,Adaboost的损失函数为:

二、评价指标

如何评估机器学习算法模型是任何项目中一个非常重要的环节。分类问题一般会选择准确率(Accuracy)或者AUC作为metric,回归问题使用MSE,但这些指标并不足以评判一个模型的好坏,接下来的内容我将尽可能包括各个评价指标。因为损失函数大部分可以直接作为评价指标,所以损失函数中出现过的简单介绍。

2.1 回归问题

1. MAE:平均绝对误差(Mean Absolute Error),范围

2. MSE:均方误差(Mean Square Error),范围

3. RMSE:根均方误差(Root Mean Square Error),范围

取均方误差的平方根可以使得量纲一致,这对于描述和表示是有意义的。

4. MAPE:平均绝对百分比误差(Mean Absolute Percentage Error)

注意点:当真实值有数据等于0时,存在分母0除问题,该公式不可用!

5. SMAPE:对称平均绝对百分比误差(Symmetric Mean Absolute Percentage Error)

注意点:真实值、预测值均等于0时,存在分母为0,该公式不可用!

6. R Squared:

决定系数(Coefficient of determination),被人们称为最好的衡量线性回归法的指标。

如果我们使用同一个算法模型,解决不同的问题,由于不同的数据集的量纲不同,MSE、RMSE等指标不能体现此模型针对不同问题所表现的优劣,也就无法判断模型更适合预测哪个问题。 得到的性能度量都在[0, 1]之间,可以判断此模型更适合预测哪个问题。

公式的理解:

  1. 分母代表baseline(平均值)的误差,分子代表模型的预测结果产生的误差;

  2. 预测结果越大越好, 为1说明完美拟合, 为0说明和baseline一致;

7. 代码实现:

# coding=utf-8
import numpy as np
from sklearn import metrics
from sklearn.metrics import r2_score# MAPE和SMAPE需要自己实现
def mape(y_true, y_pred):return np.mean(np.abs((y_pred - y_true) / y_true)) * 100def smape(y_true, y_pred):return 2.0 * np.mean(np.abs(y_pred - y_true) / (np.abs(y_pred) + np.abs(y_true))) * 100y_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(准确率):

准确率也就是在所有样本中,有多少样本被预测正确。

当样本类别均衡时,Accuracy是一个很好的指标。

但在样本不平衡的情况下,产生效果较差。假设我们的训练数据中只有2%的正样本,98%的负样本,那么如果模型全部预测为负样本,准确率便是98%,。分类的准确率指标很高,会给我们一种模型很好的假象。

2. Precision(精准率):

含义:预测为正例的样本中有多少实际为正;

3. Recall(召回率):

含义:实际为正例的样本有多少被预测为正;

4. P-R曲线:

通过选择不同的阈值,得到Recall和Precision,以Recall为横坐标,Precision为纵坐标得到的曲线图。

PR曲线性质:

  • 如果一个学习器的P-R曲线被另一个学习器的曲线完全包住,后者性能优于前者;

  • 如果两个学习器的曲线相交,可以通过平衡点(如上图所示)来度量性能;

  • 阈值下降:

    • Recall:不断增加,因为越来越多的样本被划分为正例,假设阈值为0.,全都划分为正样本了,此时recall为1;

    • Precision:正例被判为正例的变多,但负例被判为正例的也变多了,因此precision会振荡下降,不是严格递减;

  • 如果有个划分点可以把正负样本完全区分开,那么P-R曲线面积是1*1;

5.  (加权调和平均)和  (调和平均):

  • :召回率(Recall)影响更大,eg.

  • :精确率(Precision)影响更大,eg.

为1的时候得到 :

调和平均亦可推出:

6. ROC-AUC:

Area Under Curve(AUC) 是二分类问题中使用非常广泛的一个评价指标。AUC的本质是,任取一个正样本和负样本,模型输出正样本的值大于负样本值的概率。构成AUC的两个基本指标是假正例率和真正例率。

  • 横轴-假正例率: 实际为负的样本多少被预测为正;

  • 纵轴-真正例率: 实际为正的样本多少被预测为正;

TPR和FPR的范围均是[0,1],通过选择不同的阈值得到TPR和FPR,然后绘制ROC曲线。

曲线性质:

  1. 阈值最大时,对应坐标点为(0,0),阈值最小时,对应坐标点(1,1)

  2. ROC曲线越靠近左上角,该分类器的性能越好;

  3. 对角线表示一个随机猜测分类器;

  4. 若一个学习器的ROC曲线被另一个学习器的曲线完全包住,后者性能优于前者;

AUC: ROC曲线下的面积为AUC值。

7. 代码实现:

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

原文链接:

https://zhuanlan.zhihu.com/p/91511706

END


转自: 数据派THU 公众号

版权声明:本号内容部分来自互联网,转载请注明原文链接和作者,如有侵权或出处有误请和我们联系。


合作请加QQ:365242293  

数据分析(ID : ecshujufenxi )互联网科技与数据圈自己的微信,也是WeMedia自媒体联盟成员之一,WeMedia联盟覆盖5000万人群。

推荐 :常见损失函数和评价指标总结(附公式代码)相关推荐

  1. 基于阈值的损失函数_推荐 :常见损失函数和评价指标总结(附公式amp;代码)...

    作者:董文辉 本文长度为4500字,建议阅读10+分钟 本文为你总结常见损失函数和评价指标. 目录 一.损失函数 1.1 回归问题 1.2 分类问题 二.评价指标 2.1 回归问题 2.2 分类问题 ...

  2. 原创 | 常见损失函数和评价指标总结(附公式代码)

    作者:董文辉 本文长度为4500字,建议阅读10+分钟 本文为你总结常见损失函数和评价指标. 目录 一.损失函数 1.1 回归问题 1.2 分类问题 二.评价指标 2.1 回归问题 2.2 分类问题 ...

  3. 原创 | 常见损失函数和评价指标总结(附代码)

    作者:董文辉 本文长度为4500字,建议阅读10+分钟 本文为你总结常见损失函数和评价指标. 注:本文采用markdown进行编写,用markdown打开可得更佳展示效果- ## 1. 损失函数: # ...

  4. 基于阈值的损失函数_【代码+推导】常见损失函数和评价指标总结

    (给机器学习算法与Python学习加星标,提升AI技能) 作者:董文辉 本文长度为4500字,建议阅读10+分钟 本文为你总结常见损失函数和评价指标. 目录 一.损失函数 1.1 回归问题 1.2 分 ...

  5. 常见损失函数和评价指标总结

    作者:董文辉 本文长度为4500字,建议阅读10+分钟 本文为你总结常见损失函数和评价指标. 注:本文采用markdown进行编写,用markdown打开可得更佳展示效果- ## 1. 损失函数: # ...

  6. 【推荐收藏】机器学习12种回归评价指标(附Python代码)

    你是否曾经遇到各种评价指标而不知道含义?或者不知道如何使用Numpy进行计算? 在本文我们将介绍常见的回归评价指标,并包含公式和Numpy计算代码. 文章目录 技术提升 Mean Absolute E ...

  7. display函数怎么使用_损失函数—深度学习常见损失函数总结【图像分类|上】

    点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 学习 笔记 常见损失函数总结-图像分类篇[上] 一.前言在深度学习中,损失函数扮演着至关重要的角色.通过最小化损失函数,使模型达到收敛状态,减少 ...

  8. python随机森林变量重要性_推荐 :一文读懂随机森林的解释和实现(附python代码)...

    原标题:推荐 :一文读懂随机森林的解释和实现(附python代码) 作者:WilliamKoehrsen:翻译:和中华:校对:李润嘉 本文约6000字,建议阅读15分钟. 本文从单棵决策树讲起,然后逐 ...

  9. 机器学习中的 7 大损失函数实战总结(附Python演练)

    介绍 想象一下-你已经在给定的数据集上训练了机器学习模型,并准备好将它交付给客户.但是,你如何确定该模型能够提供最佳结果?是否有指标或技术可以帮助你快速评估数据集上的模型? 当然是有的,简而言之,机器 ...

最新文章

  1. python socket编程
  2. 车联网支持实现无人驾驶的思考
  3. LOJ P10149 凸多边形的划分 题解
  4. 1-3 交换变量(算法竞赛入门经典)
  5. 上云七步走,助力垂直电商降本增效
  6. linux系统如何挂载新硬盘,Linux系统挂载新硬盘操作流程
  7. C#中Invoke 和 BeginInvoke 的区别
  8. C#如何解决对ListView控件更新以及更新时界面闪烁问题
  9. html加载swf 进度条,教你用FLASH如何制作完整的loading
  10. [RMAN]使用RMAN删除过期归档日志
  11. pyaudio usb playback_电脑USB接口怎么禁用?系统禁用USB端口的两种方法
  12. 【学习笔记】浅识差分隐私
  13. 这是我转载的一篇,真的是不错《把SWF变回FLA》大家可以试试
  14. Docker 安装教程
  15. VS2015安装失败KB3022398 KB3165756
  16. Java实现 LeetCode 838 推多米诺(暴力模拟)
  17. 拯救007(升级版) 解题报告
  18. 番茄花园 Windows All In One DVD 特别版
  19. QQ音乐远程控制,旧iPhone连音响当播放器,另一个手机远程控制
  20. PR LUT预设 25个漂亮的Instagram风格抖音视频调色预设

热门文章

  1. Java SE基础知识详解第[13]期—不可变集合、Stream流、异常
  2. Browsersync:省时的浏览器同步测试工具
  3. 必备!半导体测试行业术语中英文对照表
  4. 【BZOJ 1925】【SDOI 2010】地精部落
  5. 从环境部署到运营推广,蚂蚁特色的一站式小程序开发体验
  6. 信息发布服务器出问题,电力网故障信息发布系统
  7. java字符串转义反转义,把lt; gt;转换成大于小于字符
  8. 小学计算机教师面试试题及答案,2019上半年小学信息技术教师资格面试真题及答案(第一批)...
  9. 杰力科创手持小风扇芯片——DLTAP703SC
  10. java.lang.IllegalStateException: Shutdown in progress 异常已解决