如何选择我们的损失函数 – 连接统计推断和问题所在领域的桥梁

1. 从概率预测到决策函数之间的鸿沟

在统计学领域,统计学家常常不考虑能获得多少,而是考虑损失了多少,我们认为损失的负数就是获得。如何衡量损失是一件值得深入思考的事情。

0x1:例子:只考虑预测结果不考虑不同预测结果背后的实际损失带来的问题

考虑如下例子:

假设一个气象学家正在预测飓风袭击他所在城市的概率是多少。他估计飓风不袭击该城市的可能性为 99%-100%,且这一概率的可信度为 95%。气象学家非常满意他的计算精度,并建议大家不用疏散。不幸的是飓风袭击了城市,城市被淹没了。

这个典型的例子说明了单纯使用精度去度量结果时存在的缺陷,很显然,这是我们很多开发朋友包括笔者自己平时在项目中无时不刻遇到的情况。

我们很幸苦收集了大量打标样本,设计了一套特征工程以及算法模型后,又经过了很久的训练得到了一个预测模型,这时候,预测模型可以得到几千到几万不等的预测结果,其中置信度概率从0.8 ~ 0.99不等,这个时候问题来了,我们要拿哪些结果进行输出,例如输出给下游业务方或者输出给客户?

是 >= 0.99?那么是否意味着漏报了很多数据?

是 >= 0.9?那么是否意味着产生很多误报?

退一步说, >= 0.99 就一定是100%没误报的吗?我们设定的这个所谓的 D(>= 0.99)的决策函数,100%不会出问题吗?

造成这个问题的根本原因是什么呢?

笔者认为根本原因是:我们对损失函数的定义还不够完善,如本篇blog的tilte所说,损失函数的本质是”连接统计推断和问题域的桥梁“,所以损失函数就不能单纯只考虑统计推断的概率结果,还要考虑问题域的实际情况,即不同的决策结果带来的实际现实世界的损失,损失函数必须是承上启下的

0x2:大致的正确比精确的错误更好

从贝叶斯推断的世界观来看,我们不能太过于强调精确度的度量,尽管它往往是一个有吸引力和客观的度量,但会忽视了执行这项统计推断的初衷,那就是:推断的结果

此外,我们希望有一种强调“决策收益的重要性”的方法,而不仅仅是估计的精确度。

0x3:以寻找最优结果为目标的损失评价函数

在机器学习项目中,我们更在意的是得到最佳的预测结果,而不仅仅是在所有可能的参数下达到最佳精度。
寻找贝叶斯行动等价于寻找一些参数,这些参数优化的不是参数精度,而是任意某种表现。不过我们需要先定义表现(损失函数、AUC、ROC、准确率 / 召回率)

Relevant Link:

https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers

 

2. 损失函数

在开始讨论这章之前,笔者希望先抛出一句话:损失函数是连接统计推断和问题所在领域的桥梁。我们整篇文章会围绕这个观点展开讨论。

损失函数不仅仅局限于我们在机器学习和深度学习书籍里看到的最小二乘损失、交叉熵损失、0-1损失等等。实际上,损失函数是可以根据实际情况,在具体项目中进行自定义的定义,它的核心作用是将现实世界里的问题通过数学方式数字化表达,让损失这个抽象的逻辑概念可以数值化并通过优化算法进行运算和优化。

0x1:损失函数的定义

我们先来学习统计学和决策理论中的损失函数。损失函数是一个关于真实参数以及对该参数的估计的函数:

损失函数的重要性在于,他们能够衡量我们的估计的好坏:损失越大,那么损失函数得到的估计就越差。

一个简单而普遍的例子是平方误差损失函数,这是一种典型的,与误差的平方成正比的损失函数。在线性回归、无偏差统计量计算、机器学习的许多领域都有广泛的应

0x2:常见的损失函数 

1. 0-1损失函数

0-1损失非常直观和简单,非对即错,是一种阶跃函数,在实际项目很少使用到。

2. 平方损失函数 – 非线性损失评价函数

平方损失误差损失的缺点在于它过于强调大的异常值。这是因为随着估计值的偏离,损失是平方增加的,而不是线性增加的。

对3个单位偏离的惩罚要小于对5个单位偏差的惩罚;但是对3个单位偏离的惩罚却不比对1个单位偏离的惩罚大很多,虽然在一些场景下,这两种情况下偏离的差值是相同的。

均方损失的这种不线性,意味着较大的误差会导致糟糕的结果。在实际项目中,是否可以使用需要数据科学家自己根据经验去权衡。

如果我们的问题是回归分析的场景,我们是希望拟合模型能尽量地概括数据的分布,离得越远就意味着回归拟合能力越差,因为惩罚也越大,因此可能均方损失的这种非线性特性反而是合理的。

因此要选择损失函数的时候,需要我们对问题场景要非常的了解,知道选择不同的损失函数对最终获得的结果意味着什么。

3. 对数损失函数(交叉熵损失函数)

交叉熵损失函数基于信息论中的熵值概念,将损失看成是当前系统不确定性的度量,预测值和目标值差距越大,意味着不确定性越大,熵值也就越大,损失也就越大。

4. 绝对值损失函数 – 强调偏离度的线性损失评价函数

一种更稳健的损失函数是误差的绝对值函数,公式如下:

可以看到,绝对值损失函数不考虑预测值和目标值是”左偏“还是”右偏“,它只是线性地衡量”预测值和目标值的距离“。

绝对值损失函数是机器学习和稳定统计中经常使用的损失函数。

笔者插入:可以很容易地看到,绝对损失函数没有对偏离的正负进行区分。but!这个重要吗?截止目前为止,这个问题笔者很难作出回答,我自己也在摸索中,从笔者目前为止为数不多的项目经验来看,两种情况都会遇到,你需要自己灵活判断。

假如你需要的预测的一台机器的恶意网络发包行为的可疑程度,我们对网络established行为进行建模,进行回归分析,回归模型拟合的值其实是一个阈值,低于或者高于这个回归值的行为模式都被认为是有一定可疑程度的。但是很显然,从安全业务场景里去定义这个问题时,低于这个阈值被认为是可疑程度相对较低的,高于这个阈值的被认为是可疑程度相对较高的,这个时候,绝对值损失函数就不能100%客观地表征我对这个业务场景的理解了,我可能需要将绝对值损失函数进行改造,改为分段函数,并在负分段和正分段分别赋予不同的惩罚因子

我们在下个小节会讨论的分段损失函数,可以缓解这个问题。

0x3:面向具体业务场景的自定义损失函数

从笔者的理解上来看,目前数据科学家和数据工程师们选择损失函数主要基于如下两方面:

1. 数学计算上的便利性,由于计算机在数学上的便利性,我们可以自由地设计自己的损失函数;
2. 应用上的稳健性,即损失函数可以客观的对损失进行度量。损失函数确实是客观的,它们都是估计值和真值之差的函数,不管该误差是正还是负,和估计的收益对象无关;
3. 损失函数是”可优化的“,这涉及到凸优化理论,理论上说,只有凸函数可以通过计算进行优化,但是值得注意的是,现在对非凸函数的优化也有大量的研究,有兴趣的朋友可以google相关资料;

我们文章开头说过,损失函数的定义需要承上启下,既要能够对概率问题进行数值化,也要考虑实际问题域的情况。这就要求我们对常规损失函数进行定制。

再次考虑以上飓风的例子,统计学家也可以这样预测:

飓风袭击的概率在 0%到 1%之间,但是如果发生飓风的损失是巨大的。99%的概率没有飓风,没有飓风带来的收益有限。基于这种损失评价体系,统计学家最后给出的建议可能截然不同。

很显然,这种改动意味着我们把关注的重心从更精确的概率估计转到概率估计带来的现实结果上来,即损失函数要更加关注决策结果和业务收益。

1. 分段区间非对称平方误差损失函数

设想一种场景,预测值低于目标值造成的损失,小于预测值高于目标值。我们可以用一种非对称的均方误差损失函数来描述这种关系:

上式表明,这种损失函数对预测值小于目标值的情况,惩罚更严重。在这种损失函数的驱动下,模型会尽量避免让预测值小于目标值。

这种损失函数形式更适合于估计下个月的网络流量,因为为了避免服务器资源分配不足情况,在对服务器资源分配进行估计时要多分配一些。

从这个例子可以看到,损失函数并不一定都是简单的说去衡量模型的预测值和目标值之间的数值差异,而是更加贴近我们的业务目标。损失函数衡量的是我们的模型预测结果对我们的业务目标的贡献程度

2. 强调参数估计结果更接近 0 或者 1 的损失函数

该损失函数更倾向于估计靠近0或者1位置的参数

版权声明:本文为LittleHann原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/LittleHann/p/9608599.html