当前位置:首页>编程日记>正文

根据标签分布来选择损失函数

来自 | 知乎   作者丨马东什么

来源丨https://zhuanlan.zhihu.com/p/304462034

编辑丨极市平台

本文仅作学术交流,如有侵权,请联系后台删除。

本文约2000字,建议阅读5分钟

本文介绍了损失函数与标签分布的联系。

首先回到经典的面试问题:

为什么线性回归使用mse作为损失函数?

为什么逻辑回归二分类常用二元交叉熵作为损失函数?

熟悉lgb、xgb或者是sklearn中的各类回归模型包括了线性回归,tweedie回归等等应该都比较熟悉,我们在模型的框架之下可以选择不同的损失函数,以lightgbm为例:

针对于回归问题有非常多的备选损失函数,那么这些损失函数什么时候用,为什么?

回到基本面试问题,首先我们需要知道的是,使用特定损失函数的前提是我们对标签的分布进行了某种假设,在这种假设的前提下通过极大似然法推出所有样本构成的极大似然公式,然后再使用凸优化的方法比如常见的梯度下降法进行求解。

以常见的二分类问题和回归问题为例:

二分类问题的常见假设就是标签服从伯努利分布:

伯努利分布是一个离散型机率分布。试验成功,随机变量取值为1;试验失败,随机变量取值为0。成功机率为p,失败机率为q =1-p,N次试验后,成功期望为N*p,方差为N*p*(1-p) ,所以伯努利分布又称两点分布。

观察到的数据为D1,D2,D3,...,DN,极大似然的目标:

联合分布难计算,我们因此引入一个假设,独立同分布(i.i.d.)(机器学习的基本假设),目标公式改变为:

将函数取对数,函数的极值点不会改变,公式变为:

伯努利分布下随机变量的最大似然计算方法,P(X=1)=p,P(X=0)=1-p:

这样就得到了我们熟悉的二元交叉熵的公式了,注意,二元交叉熵的名字有很多,有的地方把它叫logloss的类别数为2的特例之类的balabala,记住一个名字能辨别同义不同名就行了。

然后是经典的回归的mse的损失函数,这个之前写过了,参考这篇即可:

马东什么:线性回归面经总结——from 牛客

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

线性回归要求因变量服从正态分布_lyh的专栏-CSDN博客

https://blog.csdn.net/u010462995/article/details/70847146

我们在使用线性回归的时候的基本假设是噪声服从正态分布,当噪声符合正态分布N(0,delta^2)时,因变量则符合正态分布N(ax(i)+b,delta^2),其中预测函数y=ax(i)+b。这个结论可以由正态分布的概率密度函数得到。也就是说当噪声符合正态分布时,其因变量必然也符合正态分布。因此,我们使用mse的时候实际上是假设y服从正态分布的。

然而生活中的很多回归问题并不符合正态分布,例如典型的奢侈品商城的销量,用户到商城中闲逛,大部分用户基本不买东西,只有少部分用户会进行购买,极少部分用户会购买大量的奢侈品,因此分布常常是这样的:

横轴代表了销量取件从小到达排列,纵轴代表了某个销量区间对应的用户数量,这样的分布情况明显不符合高斯分布。

需要注意,从不均衡学习的角度来说,当正负样本数量相差极大的时候,

例如上图,

此时,其实仍旧是满足二元交叉熵分布的,因此分类问题并不是特别好从基本假设的角度出发去思考损失函数的选择,更多的是偏工程话的一些解释,例如典型的不均衡样本为什么会影响模型的表现,核心原因是少类样本的数量太少,模型学习不到太多的规律,但是如果少类样本的数量很少,例如1000w:10w这样的比例,虽然比例上也是不均衡,但是每个类别的数量都很多足够模型充分学习,实际应用上来看,这种情况基本不需要进行不均衡处理,因此严格来说,这种情况不属于不均衡学习的问题,不均衡学习针对的更多是“绝对不均衡”的问题,即样本的绝对数量很稀少而不是比例。


回到回归问题上,在回归问题的领域基本不会谈论不均衡问题,因为连续的标签没有不均衡的概念,取而代之的是标签分布诡异的情况,因此简单来说,我们可以把这类标签分布不符合高斯分布从而使得以mse作为损失函数的模型拟合效果差的问题作为回归问题中的“不均衡问题”,这类不均衡问题就比较棘手,因为某些情况下的标签的分布情况和样本数量没关系,比如前面说到的奢侈品销量的问题,就是典型的非高斯分布的形式,这个时候,我们就需要使用一些方法来应对这种问题了,和不均衡学习类似,我们可以在样本层面进行一些采样的操作。

这里,我们可以对销量为0的用户进行下采样,这样整体分布看起来会更加符合高斯分布一点,不过这种做法其实意义不大,因为我们未来要预测的样本的分布被破坏了,即使模型拟合出好的效果也没用,这就好比我们进行电商销量预测的时候把双十一的销量样本砍掉,会发现mse变得很优美,但是预测的时候,对于未来的双十一的预测效果会特别差。

因此,更加常见的做法是在标签层面或者损失函数方面进行修正,例如使用对数变换或者更大一点,使用boxcox变换来使得标签尽量接近高斯分布然后使用mse:

比如这个例子:

所以有时候我们会发现处理回归问题的时候进行对数变换效果更好了。如果标签存在负数,则所有的标签加上一个min_data+1然后进行对数变换即可,或者直接使用boxcox变换。

但是在处理电商销量问题的时候,我发现这种方法并不奏效,因为如果标签分布本身是非常畸形的,可能你处理了半天还是莫得用,处理完的分布还是畸形的,这个时候我们就要考虑使用其它损失函数来进行处理了。

例如使用tweedie loss、possion loss等损失函数替代mse,例如:

这是tweedie分布的典型例子,tweedie loss的实现并不复杂,下次处理回归问题遇到模型效果很差的问题的时候,可以看一下标签的分布情况,然后考虑选择使用不同的损失函数进行测试。

当然,如果懒得看或者看不出来,把损失函数作为超参数进行调参也是可以的。

编辑:于腾凯

校对:洪舒越


http://www.coolblog.cn/news/b41295a3ecbcf37d.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • jquery 使用小技巧
  • 2019-9
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • linux批量创建用户和密码
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • js常用阻止冒泡事件
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • 【设计模式】 模式PK:策略模式VS状态模式
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • CSS小技巧——CSS滚动条美化
  • JS实现-页面数据无限加载
  • 阿里巴巴分布式服务框架 Dubbo
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • 两张超级大表join优化
  • 第九天函数
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 《看透springmvc源码分析与实践》读书笔记一
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • Arm芯片的新革命在缓缓上演
  • nagios自写插件—check_file
  • python3 错误 Max retries exceeded with url 解决方法
  • 行为模式之Template Method模式
  • 通过Spark进行ALS离线和Stream实时推荐