iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >10个Python常用的损失函数及代码实现分享
  • 710
分享到

10个Python常用的损失函数及代码实现分享

2024-04-02 19:04:59 710人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是损失函数损失函数与度量指标为什么要用损失函数回归问题1、均方误差(MSE)2、平均绝对误差(MAE)3、均方根误差(RMSE)4、平均偏差误差(MBE)5、Huber损失二

什么是损失函数

损失函数是一种衡量模型与数据吻合程度的算法。损失函数测量实际测量值和预测值之间差距的一种方式。损失函数的值越高预测就越错误,损失函数值越低则预测越接近真实值。对每个单独的观测(数据点)计算损失函数。将所有损失函数(loss function)的值取平均值的函数称为代价函数(cost function),更简单的理解就是损失函数是针对单个样本的,而代价函数是针对所有样本的。

损失函数与度量指标

一些损失函数也可以被用作评价指标。但是损失函数和度量指标(metrics)有不同的目的。虽然度量指标用于评估最终模型并比较不同模型的性能,但损失函数在模型构建阶段用作正在创建的模型的优化器。损失函数指导模型如何最小化误差。

也就是说损失函数是知道模型如何训练的,而度量指标是说明模型的表现的

为什么要用损失函数

由于损失函数测量的是预测值和实际值之间的差距,因此在训练模型时可以使用它们来指导模型的改进(通常的梯度下降法)。在构建模型的过程中,如果特征的权重发生了变化得到了更好或更差的预测,就需要利用损失函数来判断模型中特征的权重是否需要改变,以及改变的方向。

我们可以在机器学习中使用各种各样的损失函数,这取决于我们试图解决的问题的类型、数据质量和分布以及我们使用的算法,下图为我们整理的10个常见的损失函数:

回归问题

1、均方误差(MSE)

均方误差是指所有预测值和真实值之间的平方差,并将其平均值。常用于回归问题。

def MSE (y, y_predicted):
   sq_error = (y_predicted - y) ** 2
   sum_sq_error = np.sum(sq_error)
   mse = sum_sq_error/y.size
   return mse

2、平均绝对误差(MAE)

作为预测值和真实值之间的绝对差的平均值来计算的。当数据有异常值时,这是比均方误差更好的测量方法。

def MAE (y, y_predicted):
   error = y_predicted - y
   absolute_error = np.absolute(error)
   total_absolute_error = np.sum(absolute_error)
   mae = total_absolute_error/y.size
   return mae

3、均方根误差(RMSE)

这个损失函数是均方误差的平方根。如果我们不想惩罚更大的错误,这是一个理想的方法。

def RMSE (y, y_predicted):
   sq_error = (y_predicted - y) ** 2
   total_sq_error = np.sum(sq_error)
   mse = total_sq_error/y.size
   rmse = math.sqrt(mse)
   return rmse

4、平均偏差误差(MBE)

类似于平均绝对误差但不求绝对值。这个损失函数的缺点是负误差和正误差可以相互抵消,所以当研究人员知道误差只有一个方向时,应用它会更好。

def MBE (y, y_predicted):
   error = y_predicted -  y
   total_error = np.sum(error)
   mbe = total_error/y.size
   return mbe

5、Huber损失

Huber损失函数结合了平均绝对误差(MAE)和均方误差(MSE)的优点。这是因为Hubber损失是一个有两个分支的函数。一个分支应用于符合期望值的MAE,另一个分支应用于异常值。Hubber Loss一般函数为:

这里的

def hubber_loss (y, y_predicted, delta)
   delta = 1.35 * MAE
   y_size = y.size
   total_error = 0
   for i in range (y_size):
      erro = np.absolute(y_predicted[i] - y[i])
      if error < delta:
         hubber_error = (error * error) / 2
      else:
         hubber_error = (delta * error) / (0.5 * (delta * delta))
      total_error += hubber_error
   total_hubber_error = total_error/y.size
   return total_hubber_error

二元分类

6、最大似然损失(Likelihood Loss/LHL)

该损失函数主要用于二值分类问题。将每一个预测值的概率相乘,得到一个损失值,相关的代价函数是所有观测值的平均值。让我们用以下二元分类的示例为例,其中类别为[0]或[1]。如果输出概率等于或大于0.5,则预测类为[1],否则为[0]。输出概率的示例如下:

[0.3 , 0.7 , 0.8 , 0.5 , 0.6 , 0.4]

对应的预测类为:

[0 , 1 , 1 , 1 , 1 , 0]

而实际的类为:

[0 , 1 , 1 , 0 , 1 , 0]

现在将使用真实的类和输出概率来计算损失。如果真类是[1],我们使用输出概率,如果真类是[0],我们使用1-概率:

((1–0.3)+0.7+0.8+(1–0.5)+0.6+(1–0.4)) / 6 = 0.65

python代码如下:

def LHL (y, y_predicted):
   likelihood_loss = (y * y_predicted) + ((1-y) * (y_predicted))
   total_likelihood_loss = np.sum(likelihood_loss)
   lhl = - total_likelihood_loss / y.size
   return lhl

7、二元交叉熵(BCE)

这个函数是对数的似然损失的修正。对数列的叠加可以惩罚那些非常自信但是却错误的预测。二元交叉熵损失函数的一般公式为:

让我们继续使用上面例子的值:

1.输出概率= [0.3、0.7、0.8、0.5、0.6、0.4]

2.实际的类= [0,1,1,0,1,0]

  • (0 . log (0.3) + (1–0) . log (1–0.3)) = 0.155
  • (1 . log(0.7) + (1–1) . log (0.3)) = 0.155
  • (1 . log(0.8) + (1–1) . log (0.2)) = 0.097
  • (0 . log (0.5) + (1–0) . log (1–0.5)) = 0.301
  • (1 . log(0.6) + (1–1) . log (0.4)) = 0.222
  • (0 . log (0.4) + (1–0) . log (1–0.4)) = 0.222

那么代价函数的结果为:

(0.155 + 0.155 + 0.097 + 0.301 + 0.222 + 0.222) / 6 = 0.192

Python的代码如下:

def BCE (y, y_predicted):
   ce_loss = y*(np.log(y_predicted))+(1-y)*(np.log(1-y_predicted))
   total_ce = np.sum(ce_loss)
   bce = - total_ce/y.size
   return bce

8、Hinge Loss 和 Squared Hinge Loss (HL and SHL)

Hinge Loss被翻译成铰链损失或者合页损失,这里还是以英文为准。

Hinge Loss主要用于支持向量机模型的评估。错误的预测和不太自信的正确预测都会受到惩罚。所以一般损失函数是:

这里的t是真实结果用[1]或[-1]表示。

使用Hinge Loss的类应该是[1]或-1。为了在Hinge loss函数中不被惩罚,一个观测不仅需要正确分类而且到超平面的距离应该大于margin(一个自信的正确预测)。如果我们想进一步惩罚更高的误差,我们可以用与MSE类似的方法平方Hinge损失,也就是Squared Hinge Loss。

如果你对SVM比较熟悉,应该还记得在SVM中,超平面的边缘(margin)越高,则某一预测就越有信心。如果这块不熟悉,则看看这个可视化的例子:

如果一个预测的结果是1.5,并且真正的类是[1],损失将是0(零),因为模型是高度自信的。

loss= Max (0,1 - 1* 1.5) = Max (0, -0.5) = 0

如果一个观测结果为0(0),则表示该观测处于边界(超平面),真实的类为[-1]。损失为1,模型既不正确也不错误,可信度很低。

如果一次观测结果为2,但分类错误(乘以[-1]),则距离为-2。损失是3(非常高),因为我们的模型对错误的决策非常有信心(这个是绝不能容忍的)。

python代码如下:

#Hinge Loss 
def Hinge (y, y_predicted): 
   hinge_loss = np.sum(max(0 , 1 - (y_predicted * y))) 
   return hinge_loss 

#Squared Hinge Loss 
def SqHinge (y, y_predicted): 
   sq_hinge_loss = max (0 , 1 - (y_predicted * y)) ** 2 
   total_sq_hinge_loss = np.sum(sq_hinge_loss) 
   return total_sq_hinge_loss

多分类

9、交叉熵(CE)

在多分类中,我们使用与二元交叉熵类似的公式,但有一个额外的步骤。首先需要计算每一对[y, y_predicted]的损失,一般公式为:

如果我们有三个类,其中单个[y, y_predicted]对的输出是:

这里实际的类3(也就是值=1的部分),我们的模型对真正的类是3的信任度是0.7。计算这损失如下:

为了得到代价函数的值,我们需要计算所有单个配对的损失,然后将它们相加最后乘以[-1/样本数量]。代价函数由下式给出:

使用上面的例子,如果我们的第二对:

那么成本函数计算如下:

使用Python的代码示例可以更容易理解:

def CCE (y, y_predicted): 
   cce_class = y * (np.log(y_predicted)) 
   sum_totalpair_cce = np.sum(cce_class) 
   cce = - sum_totalpair_cce / y.size 
   return cce

10、Kullback-Leibler 散度 (KLD)

又被简化称为KL散度,它类似于分类交叉熵,但考虑了观测值发生的概率。如果我们的类不平衡,它特别有用。

def KL (y, y_predicted): 
   kl = y * (np.log(y / y_predicted)) 
   total_kl = np.sum(kl) 
   return total_kl

到此这篇关于10个Python常用的损失函数及代码实现分享的文章就介绍到这了,更多相关Python损失函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 10个Python常用的损失函数及代码实现分享

本文链接: https://www.lsjlt.com/news/120500.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 10个Python常用的损失函数及代码实现分享
    目录什么是损失函数损失函数与度量指标为什么要用损失函数回归问题1、均方误差(MSE)2、平均绝对误差(MAE)3、均方根误差(RMSE)4、平均偏差误差(MBE)5、Huber损失二...
    99+
    2024-04-02
  • 十个常用的损失函数解释以及Python代码实现
    什么是损失函数?损失函数是一种衡量模型与数据吻合程度的算法。损失函数测量实际测量值和预测值之间差距的一种方式。损失函数的值越高预测就越错误,损失函数值越低则预测越接近真实值。对每个单独的观测(数据点)计算损失函数。将所有损失函数(loss ...
    99+
    2023-05-14
    算法 Python 损失函数
  • Python中常用功能的实现代码分享
    目录1. 新建文件夹2. 后台运行并保存log3. 文件读取4. 字符串判断5. 统计list元素出现次数6. timestamp 转换标准时间7. 排序8. 文件路径获取9. 同一...
    99+
    2023-05-16
    Python常用功能实现 Python常用功能 Python功能
  • 35个JS中实用工具函数的代码分享
    目录1.Js天数相加获取新日期2.获取当前日期(yyyyMMdd格式)3.四舍五入4.Js将数字转成中文大写数字5.判断数据是否为空6.字符串日期比较7.验证邮件8.判断是否为日期数...
    99+
    2024-04-02
  • 分享13个非常有用的Python代码片段
    目录1.将两个列表合并成一个字典2.将两个或多个列表合并为一个包含列表的列表3.对字典列表进行排序4.对字符串列表进行排序5.根据另一个列表对列表进行排序6.将列表映射到字典7.合并...
    99+
    2024-04-02
  • 分享python中几个常用函数的正确用法
    这篇文章主要讲解了“分享python中几个常用函数的正确用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分享python中几个常用函数的正确用法”吧!1 lambda匿名函数,用法如下:#...
    99+
    2023-06-25
  • 分享四个python接口常用封装函数
    目录1.封装上传图片的函数2. 封装车牌号的函数3. 封装生成UUid 函数4. 封装连接数据库的函数前言: 又到每日分享Python小技巧的时光了,今天给大家分享的是Python接...
    99+
    2024-04-02
  • Python中10个常用的内置函数详解
    目录complex()dir()divmod(a,b)enumerate(iterable,start=0)eval(expression,globals,locals)filter...
    99+
    2024-04-02
  • 20非常有用的Python单行代码分享
    目录1 一行 For 循环2 一行 While 循环3 一行 IF Else 语句4 一行合并字典5 一行函数6 一行递归7 一行数组过滤8 一行异常处理9 一行列表转字典10 一行...
    99+
    2022-11-16
    Python单行代码 Python 常用 代码
  • 20个解决日常编程问题的Python代码分享
    目录1. 简单的 HTTP Web 服务器2.单行循环List3.更新字典4.拆分多行字符串5. 跟踪列表中元素的频率6. 不使用 Pandas 读取 CSV 文件7. 将列表压缩成...
    99+
    2023-01-28
    Python解决编程问题代码 Python 编程代码
  • 分享3个非常实用的 Python 模块
    目录一、Psutil二、Pendulum三、Pyfiglet一、Psutil Python当中的Psutil模块是个跨平台库,它能够轻松获取系统运行的进程和系统利用率,包括CPU、内...
    99+
    2024-04-02
  • 分享2个方便调试Python代码的实用工具
    目录1. 引言2. 动机3. Loguru3.1 安装3.2 举个栗子3.3 使用Loguru4. Snoop4.1 安装4.2 举例4.3 使用factorial5. 总结1. 引...
    99+
    2024-04-02
  • 好程序员web前端分享用JavaScript实现的5个常见函数
    好程序员web前端分享用JavaScript实现的5个常见函数,在学习JavaScript,或者前端面试中,有人会问你节流函数、防抖函数、递归函数等,本文分享了5个常见函数,希望对大家有所帮助。 在 JavaScript 中有一些...
    99+
    2023-06-03
  • 利用Python实现绘制3D爱心的代码分享
    目录环境介绍第一步,绘制一个三维的爱心亿点点细节加入时间序列加入心脏的跳动一个好的展示完整代码环境介绍 python3.8 numpy matplotlib 第一步,绘制一个三维的爱...
    99+
    2022-11-16
    Python绘制3D爱心 Python 3D爱心 Python 爱心
  • 10个实用的.htaccess代码片段分别是什么
    这篇文章将为大家详细讲解有关10个实用的.htaccess代码片段分别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。下面介绍了10个实用的.htacc...
    99+
    2024-04-02
  • vbs实现zip压缩与unzip解压缩函数的代码分享
    本篇内容主要讲解“vbs实现zip压缩与unzip解压缩函数的代码分享”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vbs实现zip压缩与unzip解压缩函数的代码分享”吧!压缩代码: 复制代码...
    99+
    2023-06-08
  • 进行数据处理的6个 Python 代码块分享
    目录1、选取有空值的行2、快速替换列值3、对列进行分区4、将一列分为多列5、中文筛选6、更改列的位置前言: 大家好,今天和大家分享自己总结的6个常用的 Python 数据处理代码,对...
    99+
    2024-04-02
  • python字典添加值的方法及实例代码分享
    对于字典的操作,本篇介绍的是在其中添加值的方法,下面带来详细的介绍。 1、通过键=值的方式进行添加。如果键存在,则会将旧的值进行覆盖,如果不存在则添加。 addDic1 = { ...
    99+
    2022-11-21
    python 字典 添加值
  • python中函数的返回值及类型实例代码分析
    这篇“python中函数的返回值及类型实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python中函数的返回值及...
    99+
    2023-07-05
  • python e指数函数,常用的e指数代码
      在 python中,有一种函数叫做e指数函数(exponential function),它的名称非常的直接,是我们在进行数值计算时经常用到的一种函数。下面就让我们一起来学习一下这种函数。 1.首先在 python中创建一个函数,这个...
    99+
    2023-10-19
    python 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作