热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深度学习分位数回归实现区间预测

点击“算法数据侠”,“星标”公众号第一时间获取最新推文与资源分享小侠客们周末愉快呀,又到了每周的学习时间,我是oubahe。今天我们探讨一下如何使用深度学习模型做到对目标值的区间预测。使用神经网络做回

点击“算法数据侠”,“星标”公众号

第一时间获取最新推文与资源分享

小侠客们周末愉快呀,又到了每周的学习时间,我是oubahe。今天我们探讨一下如何使用深度学习模型做到对目标值的区间预测使用神经网络做回归任务,我们使用MSE、MAE作为损失函数,最终得到的输出y通常会被近似为y的期望值,例如有两个样本:(x=1, y=3)和(x=1, y=2),那只用这两个样本训练模型,预测x=1时y的值就是2.5。但有些情况下目标值y的空间可能会比较大,只预测一个期望值并不能帮助我们做进一步的决策。我们想知道x=1时,y的值最小会是多少,最大会是多少,使用MSE、MAE这些损失函数来构建预测输出区间模型时候,往往需要对样本进行非常复杂的处理才能达到目的,而且因为数据的预处理需要加入很强的先验信息,建模效果肯定会打折扣,再一个如果数据规模比较大,那将会在数据预处理上浪费大量的时间。来吧,展示~

01

引言

这里介绍一个特殊的损失函数——分位数损失,利用分位数损失我们不需要对数据进行任何先验的处理,就可以轻松做到预测输出y的某一分位数水平值,例如5%分位数或95%分位数,利用这个输出很自然就完成预测输出范围的回归模型。分位数损失函数的表达式如下:

其中,γ是损失函数的参数,从实际意义上可以理解为是我们需要的分位数,这个损失函数从结构上看,就是以一定的概率γ惩罚预测值大于实际值,同时鼓励预测值小于实际值,这样的效果就是学得了目标y的γ分位数期望值。对于分位数损失函数的具体应用可以参考下边的例子。

02

分位数损失函数

我们这里以波士顿房价数据集为例理解一下分位数损失函数的效果。首先加载数据并进行分割,另外为了可视化方便,我们将x_test进行PCA降维并排序:

boston_data = load_boston()
x = boston_data['data']
y = boston_data['target']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=77)
# PCA对数据进行降维处理,方便可视化
pca = PCA(n_compOnents=1)
x_test_after_pca = pca.fit_transform(x_test, y_test)
# 对数据进行排序
x_sort_id = np.argsort(x_test, axis=None)
x_test = x_test[x_sort_id]
y_test = y_test[x_sort_id]
x_for_visual = x_test_after_pca[x_sort_id]

第二步就是损失函数的定义,在Tensorflow2.0中没有分位数函数的定义,可以根据公式来进行定义:

def quantile_loss(y_pred, y_true, r=0.5):
greater_mask = K.cast((y_true <= y_pred), 'float32')
smaller_mask = K.cast((y_true > y_pred), 'float32')
return K.sum((r-1)*K.abs(smaller_mask*(y_true-y_pred)), -1)+K.sum(r*K.abs(greater_mask*(y_true-y_pred)), -1)

在这里,我们给出一种更简洁的定义方式:

def tilted_loss(q, y_true, y_pred):
e = (y_true-y_pred)
return K.mean(K.maximum(q*e, (q-1)*e), axis=-1)

进一步地,我们构建一个最简单的模型:

def gen_model(ipt_dim):
l1 = Input(shape=(ipt_dim,))
l2 = Dense(10, activation='relu', kernel_initializer=glorot_normal(), bias_initializer=zeros())(l1)
l3 = Dense(5, activation='relu', kernel_initializer=glorot_normal(), bias_initializer=zeros())(l2)
l4 = Dense(1, activation='relu', kernel_initializer=glorot_normal(), bias_initializer=zeros())(l3)
m_model = Model(inputs=l1, outputs=l4)
return m_model

调用模型,并且对结果进行可视化:

plt.figure()
plt.scatter(x_for_visual, y_test, label='actual')
q_list = [0.1, 0.5, 0.9]

for quantile in q_list:
model = gen_model(in_dims)
model.compile(loss=lambda y_t, y_p: tilted_loss(quantile, y_t, y_p), optimizer='adam')
model.fit(x_train, y_train, epochs=5, batch_size=8, verbose=1)
y_ = model.predict(x_test)
plt.plot(x_for_visual, y_, label=quantile)

plt.legend()
plt.show()

可视化的最终结果如下图所示,我们可以看到学习到的三个档位的分位数回归模型。其中0.5的与普通MAE回归结果是等价的,只不过0.5预测的是中位数而MAE预测的是期望值;0.1和0.9的两条曲线可以作为预测结果的上下界,能够包含其中80%的数据结果,如果我们追求更高的区间置信度,可以选择更低的下界分位数和更高的上界分位数。

03

总结

以上就是深度学习分位数回归实现区间预测的所有内容了,一般来说,大家在深度回归模型中分别使用1/4中位数和3/4中位数作为上下界分位数损失函数,得到的上下界分位数回归结果是具有95%置信度的。

在回归任务中,我们可以轻松构建能够预测输出值范围的模型,并且不依赖对数据的先验处理,是一种非常高效的方法;另外分位数损失函数的实现,推荐使用文中的第二种方法,涉及的计算步骤更少,效率更高;分位数损失函数与MAE损失类似,是一种线性的损失函数,在loss在0附近的区间内同样存在导数不连续的问题,各位聪明的小侠客如果能有简单的方法可以规避这个缺点,则会更加好用好啦,今天的内容就到这里啦,我是oubahe,我们下次再见咯~
码字虽少,原创不易。分享是快乐的源泉,来个素质三连 —>点击左下角分享 —> 右下角点赞+在看本文,可以汇聚好运气召唤神龙哟~


推荐阅读
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • ZooKeeper集群脑裂问题及其解决方案
    本文深入探讨了ZooKeeper集群中可能出现的脑裂问题,分析其成因,并提供了多种有效的解决方案,确保集群在高可用性环境下的稳定运行。 ... [详细]
author-avatar
花颖年华
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有