k均值的损失函数_机器学习者都应该知道的五种损失函数!
摘要: 还不知道这五种损失函数?你怎么在机器学习这个圈子里面混?
在机器学习中,所有的机器学习算法都或多或少的依赖于对目标函数最大化或者最小化的过程,我们常常把最小化的函数称为损失函数,它主要用于衡量机器学习模型的预测能力。在寻找最小值的过程中,我们最常用的方法是梯度下降法。
虽然损失函数可以让我们看到模型的优劣,并且为我们提供了优化的方向,但是我们必须知道没有任何一种损失函数适用于所有的模型。损失函数的选取依赖于参数的数量、异常值、机器学习算法、梯度下降的效率、导数求取的难易和预测的置信度等若干方面。这篇文章将介绍各种不同的损失函数,并帮助我们理解每种损失函数的优劣和适用范围。
由于机器学习的任务不同,损失函数一般分为分类和回归两类,回归会预测给出一个数值结果而分类则会给出一个标签。这篇文章主要集中于回归损失函数的分析。本文中所有的代码和图片都可以在这个地方找到!
回归函数预测数量,分类函数预测标签
回归损失函数
1.均方误差、平方损失——L2损失:
均方误差(MSE)是回归损失函数中最常用的误差,它是预测值与目标值之间差值的平方和,其公式如下所示:
下图是均方根误差值的曲线分布,其中最小值为预测值为目标值的位置。我们可以看到随着误差的增加损失函数增加的更为迅猛。
MSE损失(Y轴)与预测(X轴)的关系图
2.平均绝对误差——L1损失函数:
平均绝对误差(MAE)是另一种常用的回归损失函数,它是目标值与预测值之差绝对值的和,表示了预测值的平均误差幅度,而不需要考虑误差的方向(注:平均偏差误差MBE则是考虑的方向的误差,是残差的和),范围是0到∞,其公式如下所示:
MAE损失(Y轴)与预测(X轴)的关系图
平均绝对误差和均方误差(L1&L2)比较:
通常来说,利用均方差更容易求解,但平方绝对误差则对于异常值更稳健,下面让我们对这两种损失函数进行具体的分析。
无论哪一种机器学习模型,目标都是找到能使目标函数最小的点。在最小值处每一种损失函数都会得到最小值。但哪种是更好的指标呢?你可以上述笔记本地址自行运行代码,检查它们的各项指标。
让我们用具体例子看一下,下图是均方根误差和平均绝对误差的比较(其中均方根误差的目的是与平均绝对误差在量级上统一):
左边的图中预测值与目标值很接近,误差与方差都很小,而右边的图中由于异常值的存在使得误差变得很大。
由于均方误差(MSE)在误差较大点时的损失远大于平均绝对误差(MAE),它会给异常值赋予更大的权重,模型会全力减小异常值造成的误差,从而使得模型的整体表现下降。
所以当训练数据中含有较多的异常值时,平均绝对误差(MAE)更为有效。当我们对所有观测值进行处理时,如果利用MSE进行优化则我们会得到所有观测的均值,而使用MAE则能得到所有观测的中值。与均值相比,中值对于异常值的鲁棒性更好,这就意味着平均绝对误差对于异常值有着比均方误差更好的鲁棒性。
但MAE也存在一个问题,特别是对于神经网络来说,它的梯度在极值点处会有很大的跃变,及时很小的损失值也会长生很大的误差,这很不利于学习过程。为了解决这个问题,需要在解决极值点的过程中动态减小学习率。MSE在极值点却有着良好的特性,及时在固定学习率下也能收敛。MSE的梯度随着损失函数的减小而减小,这一特性使得它在最后的训练过程中能得到更精确的结果(如下图)。
在实际训练过程中,如果异常值对于实际业务十分重要需要进行检测,MSE是更好的选择,而如果在异常值极有可能是坏点的情况下MAE则会带来更好的结果。
总结:L1损失对于异常值更鲁棒,但它的导数不连续使得寻找最优解的过程低效;L2损失对于异常值敏感,但在优化过程中更为稳定和准确。更详细的L1和L2不同比较可以参考这篇文章。
但现实中还存在两种损失都很难处理的问题。例如某个任务中90%的数据都符合目标值——150,而其余的10%数据取值则在0-30之间。那么利用MAE优化的模型将会得到150的预测值而忽略的剩下的10%(倾向于中值);而对于MSE来说由于异常值会带来很大的损失,将使得模型倾向于在0-30的方向取值。这两种结果在实际的业务场景中都是我们不希望看到的。
3.Huber损失——平滑平均绝对误差
Huber损失相比于平方损失来说对于异常值不敏感,但它同样保持了可微的特性。它基于绝对误差但在误差很小的时候变成了平方误差。我们可以使用超参数δ来调节这一误差的阈值。当δ趋向于0时它就退化成了MAE,而当δ趋向于无穷时则退化为了MSE,其表达式如下,是一个连续可微的分段函数:
对于Huber损失来说,δ的选择十分重要,它决定了模型处理异常值的行为。当残差大于δ时使用L1损失,很小时则使用更为合适的L2损失来进行优化。
Huber损失函数克服了MAE和MSE的缺点,不仅可以保持损失函数具有连续的导数,同时可以利用MSE梯度随误差减小的特性来得到更精确的最小值,也对异常值具有更好的鲁棒性。
而Huber损失函数的良好表现得益于精心训练的超参数δ。
4.Log-Cosh损失函数
Log-Cosh损失函数是一种比L2更为平滑的损失函数,利用双曲余弦来计算预测误差:
它的优点在于对于很小的误差来说log(cosh(x))与(x**2)/2很相近,而对于很大的误差则与abs(x)-log2很相近。这意味着log cosh损失函数可以在拥有MSE优点的同时也不会受到异常值的太多影响。它拥有Huber的所有优点,并且在每一个点都是二次可导的。二次可导在很多机器学习模型中是十分必要的,例如使用牛顿法的XGBoost优化模型(Hessian矩阵)。
XgBoost中使用的目标函数,注意对一阶和二阶导数的依赖性
但是Log-cosh损失并不是完美无缺的,它还是会在很大误差的情况下梯度和hessian变成了常数。
Huber和Log-cosh损失函数的Python代码:
5.分位数损失(Quantile Loss)
在大多数真实世界的预测问题中,我们常常希望看到我们预测结果的不确定性。通过预测出一个取值区间而不是一个个具体的取值点对于具体业务流程中的决策至关重要。
分位数损失函数在我们需要预测结果的取值区间时是一个特别有用的工具。通常情况下我们利用最小二乘回归来预测取值区间主要基于这样的假设:取值残差的方差是常数。但很多时候对于线性模型是不满足的。这时候就需要分位数损失函数和分位数回归来拯救回归模型了。它对于预测的区间十分敏感,即使在非均匀分布的残差下也能保持良好的性能。下面让我们用两个例子看看分位数损失在异方差数据下的回归表现。
左:线性关系b / w X1和Y.具有恒定的残差方差。右:线性关系b / w X2和Y,但Y的方差随着X2增加。
上图是两种不同的数据分布,其中左图是残差的方差为常数的情况,而右图则是残差的方差变化的情况。我们利用正常的最小二乘对上述两种情况进行了估计,其中橙色线为建模的结果。但是我们却无法得到取值的区间范围,这时候就需要分位数损失函数来提供。
上图中上下两条虚线基于0.05和0.95的分位数损失得到的取值区间,从图中可以清晰地看到建模后预测值得取值范围。
了解分位数损失函数
分位数回归的目标在于估计给定预测值的条件分位数。实际上分位数回归就是平均绝对误差的一种拓展。分位数值得选择在于我们是否希望让正的或者负的误差发挥更大的价值。损失函数会基于分位数γ对过拟合和欠拟合的施加不同的惩罚。例如选取γ为0.25时意味着将要惩罚更多的过拟合而尽量保持稍小于中值的预测值。
γ的取值通常在0-1之间,图中描述了不同分位数下的损失函数情况,明显可以看到对于正负误差不平衡的状态。
分位数损失(Y轴)与预测(X轴)的关系图。
我们可以利用分位数损失函数来计算出神经网络或者树状模型的区间。下图是计算出基于梯度提升树回归器的取值区间:
使用分位数损失的预测区间(梯度提升回归器)
90%的预测值起上下边界分别是用γ值为0.95和0.05计算得到的。
比较研究:
在文章的最后,我们利用sinc(x)模拟的数据来对不同损失函数的性能进行了比较。在原始数据的基础上加入而高斯噪声和脉冲噪声(为了描述鲁棒性)。下图是GBM回归器利用不同的损失函数得到的结果,其中ABCD图分别是MSE, MAE, Huber, Quantile损失函数的结果:
将一个平滑的GBM拟合成有噪声的sinc(x)数据的示例:(E)原始sinc(x)函数;(F)符合MSE和MAE损失的平滑GBM;(G)平滑GBM,其具有Huber损耗,δ= {4,2,1};(H)光滑的GBM与α= {0.5,0.1,0.9}的分位数损失相符合。
我们可以看到MAE损失函数的预测值受到冲击噪声的影响更小,而MSE则有一定的偏差;Huber损失函数对于超参数的选取不敏感,同时分位数损失在对应的置信区间内给出了较好的估计结果。
希望小伙伴们能从这篇文章中更深入地理解损失函数,并在未来的工作中选择合适的函数来更好更快地完成工作任务。
将本文中几种损失函数都放到一个图中的结果:
本文作者:【方向】
阅读原文
本文为云栖社区原创内容,未经允许不得转载。
k均值的损失函数_机器学习者都应该知道的五种损失函数!相关推荐
- 机器学习者都应该知道的五种损失函数!
摘要: 还不知道这五种损失函数?你怎么在机器学习这个圈子里面混? 在机器学习中,所有的机器学习算法都或多或少的依赖于对目标函数最大化或者最小化的过程,我们常常把最小化的函数称为损失函数,它主要用于衡量 ...
- 边框回归的损失函数_一文搞懂常用的七种损失函数
主要内容: 0-1, Hinge, Logistic, Cross Entropy, Square, Absolute, Huber 简述: 损失函数刻画了模型与训练样本的匹配程度. 分类损失 分类L ...
- k均值例子 数据挖掘_数据挖掘的技术有很多种,常用的数据挖掘技术就这13种...
数据挖掘就是从大量的.不完全的.有噪声的.模糊的.随机的数据中,提取隐含在其中的.人们事先不知道的但又是潜在有用的信息和知识的过程.数据挖掘的任务是从数据集中发现模式,可以发现的模式有很多种,按功能可 ...
- k均值例子 数据挖掘_人工智能、数据挖掘、机器学习和深度学习的关系
一.人工智能 人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器. 实际应用比如:机器视觉,指纹识别,人脸识别,视网膜识别,虹膜识别,掌纹识 ...
- json java 数据类型_程序员都应该了解的一种数据格式之 JSON
原标题:程序员都应该了解的一种数据格式之 JSON 作者 | 猪哥 责编 | maozz JSON的诞生原因是因为XML整合到HTML中各个浏览器实现的细节不尽相同,所以道格拉斯·克罗克福特(Doug ...
- element 手机适配_解决手机移动端适配的五种方法
移动端适配的五种方法 所谓移动端适配,就是WebApp在不同尺寸的屏幕上等比显示 第一种方法:viewport适配 原理:通过设置 initial-scale , 将所有设备布局视口的宽度调整为设计图 ...
- k均值例子 数据挖掘_【十大经典数据挖掘算法】k-means
作者简介: Treant 人工智能爱好者社区专栏作者 博客专栏:https://www.cnblogs.com/en-heng 1.引言 k-means与kNN虽然都是以k打头,但却是两类算法--kN ...
- xss攻击突破转义_每个人都应该了解的7种xss漏洞
在阅读有关XSS的材料时,我们通常会看到经典的<script> alert(1)</ script>作为这种漏洞的证明(PoC –概念证明).虽然是正确的,但它并没有超出此范围 ...
- 在线八字排盘软件 源代码_所有设计师都应该知道的15种在线排版工具
排版是任何设计的基础 ,因为阅读是我们在网络上所做的最基本的事情之一. 您选择的字体会影响网站的多个方面,包括可读性,心情和整体用户体验 . 对于设计师和开发人员来说, 了解排版的基本原理以创建易于阅 ...
- 用户体验改善案例_优化用户体验案例研究的五种方法
用户体验改善案例 重点 (Top highlight) I've had the opportunity to give several portfolio reviews, and I want t ...
最新文章
- 写注册机犯法吗_逼着一个受害者去向另一个受害者道歉,不过分吗?
- php CI框架输出空行问题排查
- 阿里云新一代关系型数据库 PolarDB 剖析
- ​赠书:面向对象的两大迷思,再给你们解答一次
- TOML-to-Go : 帮你快速生成 Go 结构体
- JavaScript实用技巧(一)
- 基于DDDLite的权限管理OpenAuth.net 1.0版正式发布
- 【Rational Rose使用笔记】用例图
- C语言错误c2063,请教C语言中关于将二维数组复制到一个三维数组的问题
- 《Reids 设计与实现》第五章 对象
- 【Vue2.0】—mixin混入 (十五)
- python替换img的路径为新的路径_python – Django |连接路径位于基本路径组件之外{%static img.thumbnail.url%},错误400与whitenoise...
- 局域网DNS服务器搭建
- python光流法算法学习
- Spring Boot为什么不需要额外安装Tomcat?
- Wind7外接显示器选择拓展模式后,鼠标只能往右移动才能切换到外接显示器上,不能修改切换方向...
- c语言程序设计张新成课后习题答案,C语言练习题2
- 苹果MAC电脑双系统教程——MAC安装Windows双系统教程
- python实现千牛客服自动回复语_千牛会用到的回复语有哪些?千牛自动回复短语大全...
- 《小米商城》--购物车单条数据删除、购物车数量修改、清空购物车、查看地址功能、添加地址
热门文章
- matlab实现单词统计,MATLAB作业选登-统计文本中单词出现的次数
- Android™ 2.1 android.R.drawable Icon Resources
- java小狗的状态代码_狗屎一样的代码!快,重构我!
- 【EI会议|呼伦贝尔】天津大学等高校联合主办,第四届无线通信与智能电网国际会议
- 今天我们来聊一聊孟德尔随机化
- 蓝桥杯每日一题(数学思维)
- 科技云报道:“万物皆可云”时代,云安全比任何时候都更重要
- 《算法竞赛·快冲300题》每日一题:“游泳”
- 【云和恩墨大讲堂】李真旭 - 数套 ASM RAC 的恢复案例
- python爬虫自动翻页_python+scrapy爬虫时如何自动翻页获取内容