分位数回归和分位数损失在神经网络中的应用
来源:51CTO.COM
时间:2024-01-01 23:05:13 143浏览 收藏
偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《分位数回归和分位数损失在神经网络中的应用》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!
在构建预测模型时,我们不仅仅关注预测值,还希望了解预测值落在某个范围内的可能性。这种预测范围被称为区间预测。举个例子,当我们需要进行需求预测时,如果只准备最可能的需求预测量,那么缺货的概率会很高。但是如果我们将库存储备在预测的第95个百分位数,即需求有95%的可能性小于或等于该值,那么缺货数量将减少到大约20分之1的程度。通过区间预测,我们可以更好地评估不确定性,并采取相应的措施来减少风险。
要获得这些百分位数值,有几种机器学习方法可供选择:
- scikit-learn:GradientBoostingRegressor(loss='quantile, alpha=alpha)
- LightGBM: LGBMRegressor(objective='quantile', alpha=alpha)
- XGBoost: XGBoostRegressor(objective='reg:quantileerror', quantile_alpha=alpha) (version 2.0~)
这些机器学习方法中,一种被称为分位数回归的技术,用来预测值落在某个范围内的可能性。而在这些方法中,使用了一种叫做Quantile Loss的损失函数。
Quantile loss是一种用于评估分位数回归模型性能的损失函数。在分位数回归中,我们不仅关注预测的中心趋势(如均值),还关注在分布的不同分位数处的预测准确性。Quantile loss的作用是允许我们根据所关注的分位数来量化预测的不确定性。通过使用Quantile loss,我们可以更全面地评估分位数回归模型的性能,提高对不同分位数预测的准确性。
对于给定的预测问题,我们希望预测一个连续型变量的分布,并且关注不同的分位数,比如中位数、0.25分位数、0.75分位数等。为了评估预测的准确性,我们可以使用Quantile Loss进行衡量。 Quantile Loss是一种损失函数,用于衡量预测分布与实际分布之间的差异。对于第q分位数,Quantile Loss的定义如下: L(q, y, \hat{y}) = (1-q)|y-\hat{y}| \cdot \mathbb{1}(y \leq \hat{y}) + q|y-\hat{y}| \cdot \mathbb{1}(
在《文字玩出花》游戏中,有一个非常受欢迎的关卡叫做怀旧大扫除。每天都会有新的挑战等待着我们。这个关卡要求我们仔细观察图像,并找出12个与时代不符的细节。为了帮助那些还没有通过
- yy 是真实值。
- yy 是模型的预测值。
- qq 是目标分位数,取值范围为0,10,1。
这个损失函数的核心思想是,考虑到模型预测值与真实值之间的差异,通过乘以一个参数q来实现不同分位数的不同惩罚。当模型的预测值超过真实值时,损失函数会将差值乘以q;而当预测值低于真实值时,损失函数会将差值乘以1-q。这样做的目的是确保对于不同分位数,我们有不同的惩罚权重。例如,如果我们更关注较小的分位数(如中位数),我们可以设定较小的q值;反之,如果我们更关注较大的分位数,我们可以设定较大的q值。
用Pytorch实现分位数损失
以下是一个使用PyTorch定义自定义损失函数的示例,其中将分位数损失作为示例。 ```python import torch import torch.nn as nn class QuantileLoss(nn.Module): def __init__(self, quantile): super(QuantileLoss, self).__init__() self.quantile = quantile def forward(self, predictions, targets): errors = targets - predictions loss = torch.max((self.quantile - 1) * errors, self.quantile * errors) return loss.mean() # 示例用法 predictions = torch.tensor([1,
import torch def quantile_loss(y_true, y_pred, quantile): errors = y_true - y_pred loss = torch.mean(torch.max((quantile - 1) * errors, quantile * errors)) return loss
对于训练来说,跟正常的训练方法一样:
for epoch in range(num_epochs):for batch_x, batch_y in dataloader:optimizer.zero_grad()outputs = model(batch_x)loss = quantile_loss(outputs, batch_y, quantile)loss.backward()optimizer.step()
让我们看看这个自定义的损失函数是否如预期的那样工作。
Pytorch分位数损失测试
首先,我们尝试为x生成均匀随机分布(-5~5),为y生成与x指数成比例的正态随机分布,看看是否可以从x预测y的分位数点。
# Generate dummy data num_samples = 10000 shape = (num_samples, 1) torch.manual_seed(0) # x is uniform random from -5 to 5 # y is random normal distribution * exp(scaled x) x_tensor = torch.rand(shape) * 10 - 5 x_scaled = x_tensor / 5 y_tensor = torch.randn(shape) * torch.exp(x_scaled) # Convert values to NumPy array (for graphs) x = x_tensor.numpy() y = y_tensor.numpy()
网络结构很简单,两个中间层64个节点+每层relu。在没有任何正则化或提前停止的情况下使用100次epoch。待预测的四分位数(百分位数)在列中为[0.500,0.700,0.950,0.990,0.995],在行中为批大小[1,4,16,64,256],总共有25个预测。在10,000个训练数据实例(蓝色)中,低于预测输出值(红色)的实例的比率在图中被标记为“实际”值。
低于指定百分位数值的样本百分比通常接近指定值,并且输出分位数预测的是非常直接的。
再考虑一个稍微复杂的例子,其中y=clip(x, - 2,2) + randn。其中clip(x, - 2,2)是剪辑函数(将值限制在指定范围内)。当数字超出给定范围时,该函数将其限制到最近的边界(如果将范围设置为-2到2,并输入-5的输入值,该函数将返回-2;如果输入10,它将返回2),而randn是遵循正态分布的随机数。网络结构和其他设置与前一种情况相同。
与前一种情况一样,低于指定百分位数值的样本百分比通常接近指定值。分位数预测的理想形状总是左上角图中红线的形状。它应该随着指定的百分位数的增加而平行向上移动。当移动到图的右下方时,预测的红线呈现出更线性的形状,这不是一个理想的结果。
让我们用一个更复杂的形状,我们的目标是y=2sin(x) + randn。其他设置与前一种情况相同。
可以看到低于指定百分位数值的样本百分比通常接近指定值。当向5x5图的右下方移动时,分位数预测的形状偏离了正弦形状。在图的右下方,预测值的红线变得更加线性。
如何选择Q
我们看到,如果设置过高的quantile,会得到扁平化的值,那么如何判断使用Quantile Loss得到的结果是否“扁平”,如何“避免扁平呢”?
检测“扁平化”的方法之一是一起计算第50、68和95个百分位值,并检查这些值之间的关系,即使要获得的最终值是99.5百分位值。如果样本分布服从正态分布,以μ为均值,σ为标准差
在μ±σ区间内的概率约为68;在μ±2σ区间内的概率约为95;在μ±3σ区间内的概率约为99.7
如果第68百分位-第50百分位、第95百分位-第50百分位和99.5百分位-第50百分位值的比值明显偏离1:2:3,我们可以确定偏离的百分位值已经“变平”。
避免扁平化”的第一种方法是减少批量大小,如上面的实验所示。较小的批量大小避免了这个问题,并且不太可能产生平坦的预测。但是减少批大小也有缺点,比如收敛不稳定和增加训练时间,所以它只是有时一个容易采用的选择。
第二种方法是在同一批次中收集相似的样本,而不是随机生成批次。这避免了“在批内低于和高于预测值的样本比例与指定的百分位数值之间的平衡”。
最后"扁平化"是无法避免的,我们只能进行缓解,下列符号用于下列方程。
- P0:第50个百分位值
- P1:第68个百分位值
- P2:第95百分位值
- P3: 99.5百分位值
使用上述变量,可以使用以下流程图获得适当的99.5%百分位数值。
总结
分位数回归是一种强大的统计工具,对于那些关注数据分布中不同区域的问题,以及需要更加灵活建模的情况,都是一种有价值的方法。
本文将介绍了在神经网络种自定义损失实现分位数回归,并且介绍了如何检测和缓解预测结果的"扁平化"问题。Quantile loss在一些应用中很有用,特别是在金融领域的风险管理问题中,因为它提供了一个在不同分位数下评估模型性能的方法。
文中关于机器学习,神经网络的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《分位数回归和分位数损失在神经网络中的应用》文章吧,也可关注golang学习网公众号了解相关技术文章。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
234 收藏
-
465 收藏
-
100 收藏
-
307 收藏
-
280 收藏
-
121 收藏
-
194 收藏
-
417 收藏
-
430 收藏
-
315 收藏
-
319 收藏
-
170 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习