首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为啥我不太建议优先用神经网络做回归预测

这2年很火热的机器学习的经典算法代表:神经网络,可是比较出风头。在图形、文本、语音识别等等领域出现了一个又一个的令人瞩目的成果。

这些领域都有一个本质上的相同属性:分类问题。

可在神经网络做回归和预测的领域,我看到很多论文有用这种算法做工具,却往往离不开传统的时间序列做相互验证。并且各种头条消息也比较少听到说哪个事件、哪个成果是通过神经网络算法做回归和预测得到的。

我曾经也就这种算法能够做回归和预测兴奋过,也热心的投入到不同的网络算法中去实践。不过一番热情之后,我却冷却了下来,因为我发现用这种网络的算法去做回归预测,还是有很多问题。

下面,我就说说我为啥不太建议用神经网络做回归预测,特别是当有可用的时间序列模型时。

原因一:业务语言解释不了

对于多层神经网络而言(本文主要以BP网络为例),隐藏层哪怕只有一层,这个问题就会发生。

我们举个例子,假如我们要就某个商品的销量做回归和预测,以销量为Y,3个影响因素X1,X2,X3为数据特征。

以下图为例,我们建立了一个3层的神经网络。

大家看到,输入层到隐藏层的神经元训练出两组权重出来,那么该如何解释隐藏层神经元呢?

这个问题应该不大,隐藏层第一个神经元可以理解成一个多元线性方程,

或者简单的说它代表了3个影响因素X1,X2,X3的一个加权平均值(尽管这么写不太严谨,但方便理解)。

加权平均值这个概念好理解,中学开始大家都学过,就是把不同的影响因素取不同的影响力(权重),然后求和得到一个影响力修正后的结果。而且这个结果业务上也容易说的通。

那问题来了,隐藏层的神经元到输出层的神经元,也训练出了一个权重组合。

那么这个线性组合又如何用业务语言解释呢?我如果说它代表了上一步的2个加权平均值的加权平均值,你肯定理解不了这到底代表什么。如果换成业务语言来解释,我相信怕是更能把人说的云里雾里,或者说连云和雾都生成不了呢。

并且,如果神经网络的层级更多,比方说有3个隐藏层,那么到了输出层神经元,已经经历了4次加权平均(还不考虑激活函数的作用),那么最终的结果更加难以表述了。

所以,这样一来别人如果挑战你:3个隐藏层,以及每个隐藏层的神经元个数分别代表了什么业务性质?绝对能把你怼的支支吾吾。

相反,我们如果用一个很传统很传统,传统到耳朵起茧的一元线性回归方程y=ax+b,这个反而容易用业务语言解释哦。

a代表了影响因素对销量y的变化率,也就是说影响因素x每变化10%,那么对于y来说就会增加相应的(10%x)的a倍变化。

b代表了自然的销量。也就是说即便没有影响因素x存在,y也会有刚需或自然销量b。

换做你当业务领导,或者你向领导去解释你的分析结果,你会倾向于哪种算法的选择呢?虽然见仁见智,但我会更倾向于算法能被业务所解释。

原因二:预测的时候,逆中心化(逆归一化)的难题

这个问题说的是,我们在训练网络的时候,为了消除输入层变量的量纲影响,要把特征变量进行中心化换算。但是训练得到一个输出层神经元后,却无法通过中心化算法的逆运算去得到相应的拟合值。或者我们可以采用对数化处理特征变量,对于对数种类的选择,也是一个比较难固化或说的明白的事情。

我们问题一个一个来。

中心化的计算公式是这样的,用列维-林德伯格中心极限定理进行变形

当然了,上面的式子如果是处理抽样的数据,标准差还要减一个自由度得到样本标准差。这里就不再展开说明。

这个式子为什么难以逆运算呢?

做预测时,网络的输出层输出的预测值,是一个经多次加权平均后得到的z值。那么在预测的时候,这个z值不是我们想要的结果,我们想要的是公式里的预测期里的xi。

已知z值,要想得到这个预测期的xi,就得知道所有预测期xi的均值μ和标准差σ。可问题是想要得到这2个参数,就得先算出所有预测期的xi。那就相当于还没生儿子的前提下就想抱孙子,那当然是无法算出来的。

你可能会说,MATLAB上不是有反归一化的函数吗,另外某些R高手也自己写代码在R环境下也实现了MATLAB的反归一化功能。

说实话,我确实也试过,发现预测效果很不理想,所以我不推荐用。为什么呢,我还原了下所谓的反归一化函数,原来,它是用训练集或历史数据中的μ和σ进行归一化的逆运算。

如果说用历史的μ和σ进行逆运算,这就相当于默认了一个假设条件:未来的时期所有的预测数据是在历史数据的概率分布内进行再现(或者服从历史数据的概率分布)。

然而这就是不合理的。

因为历史数据服从一个均值为μ,方差为σ2的概率分布下,假如未来的数据也是服从这个均值和方差的概率分布,也就是说未来的数据会按照相同的概率,分布在历史μ的周围,离散程度为σ2,那么这本身在业务发展的场景上就很容易被人挑战。

比方说,奶粉的销量未来明显会受放开二胎政策及产科医疗设施不断完善而有上升趋势,那么未来一段时期内的奶粉销量的均值必然是上升的。但是反归一化函数却认为未来的奶粉销量均值和方差应该一直和历史水平保持不变,如果出现某个销量值预测比较高的话,也就是预测的z值变大,那么这个预测值出现的xi概率会很低(对z表达式求积分)。

这显然就是不合理的。

这种不合理不单只业务解释上说不过去,也会体现在你的预测结果不理想上,不信可以找一个带有上升趋势的数据试试,你会发现训练集的拟合很好,但是test集就会明显偏小。

所以,这种反归一化的应用,我认为最多适用于短期,也就是未来1期到2期的预测。

因为未来的1期或2期,历史的惯性依然很大,数据的突变概率不高,因此预测偏差还是可以接受。但是如果说历史数据本身是带有上升或下降趋势的,那么对未来中长期期次的预测,例如10期以上,则不会那么好看(偏差变大)。

同理,归一化也是一样。

归一化的公式是

假如在预测的阶段,我们得到一个输出层的结果是0.8,那么通过0.8想要逆运算得到xi,就得先得知xmin和xmax,可这2个值却是我们待求的。这样就又陷入到一个死循环里面了。

不过分类问题却不用面临这种逆运算的难题,因为分类器比方说采用logistics作为激活函数得到的结果是一个概率,哪个标签的概率高就可以判断出这个结果属于哪一类。因此也难怪分类问题应用比回归要广泛的多。

下面再说一下对数化的处理。

我在用AMORE神经网络做回归和预测时,发现算法虽然没有规定对特征全部要采用归一化,用对数处理也可以。但是我发现用自然对数和常对数处理,效果都差不多。见下图

那么问题来了,以后部署开这种算法的时候,你是用哪种对数处理进行固化呢?选择这种对数处理的理由呢?我想了半天,发现很难说的清楚。充其量只能说,从结果导向上看,因为第X种对数处理,训练得到的均方误差比较小,泛化效果好些。

原因三:得多次运算和调参,但调参全靠经验合耐心,调好的参数没有理论可以沉淀

其实知道神经网络算法的人都明白,各层神经元连接权值的训练,都是由一个随机生成的初始值开始的。初始值不同,那么按照相同的最速算法进行学习,得到的结果自然不同。这和参数不变,结果自然不变的传统时间序列模型相比,确实有些解释上的麻烦。这是其一。

其二,就是学习率的设定拿捏困难。设定大了,虽然结果可能收敛的比较快,但却很容易陷入一个结果不太理想的局部最优,每次的差异会比较大;设定小了,运算时间长不说,每次结果差异很小,容易产生过拟合的恐惧。

我们还是以相同的例子来进行试算,发现结果就是如此。

上图可以看到,学习率为0.0455,结果训练出来的结果的两条线还是看得出间隔的,说明训练结果有差异,而且拟合效果不咋地。学习率为0.01,训练出来的结果2条线重叠的看不出来了,但看上去很有过拟合的倾向。

综合来看,训练结果稳定性重要,拟合效果也重要,防止过拟合也很重要。如何平衡?现在来看,还没有个方法固化下来,总之就是多跑几次,多调几次,看看是否可行。调好之后,换到下一次数据训练,一切又重头开始。

而如果我们用时间序列的模型来试算的话,少担心一项结果的稳定性问题,需要平衡拟合效果和过拟合。跑完一次后,可以对参数进行假设检验。最关键的是,参数也是可以对业务进行解释的。下次再遇到类似情景,可以复制经验。

例如在时间序列状态空间模型STSM中,对经济周期的模型设定,可以借鉴前人的经验,套用2阶自回归AR(2)模型作为宏观周期因子。并且这个经验被广泛应用到很多经济现象的建模分析中。

以上3个原因,就是我经过那么多实践之后,得到的一组心得。

说实话,我也做过用神经网络做分类,发现确实分类的效果比较稳定,而且分类准确率也比较高,也难怪当前深度学习的成就,更多的出自分类的应用。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180426G1PPL200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券