大家下午好,我是来自法伯科技的黄鑫,今天我跟大家分享的题目是预测技术在医药行业的应用。接下来我会分为三部分跟大家介绍我要分享的内容,一个是在日常的业务中会用到的预测技术的常见的场景。第二个是预测的常用的算法和模型,以及各自优缺点的比较。第三个是跟大家分享我们做过的一个预测的项目。
首先,我们来看我常见的预测场景。
从市场角度而言,公司的战略部门很想知道在未来的一段时间,某一个治疗领域的发展状况会是什么样,然后根据这个发展状况,我们对这个治疗领域做一个宏观的评估,然后根据这个评估,我们可以对公司的产品结构做一个优化,包括是否开发一些新药,或者是可不可以通过商业操作来买入或者是卖出公司的产品,使公司的获益最大化。
第二个角度,新产品的角度,我们可以通过预测,看到新产品在将来的一段时间增长情况是怎么样,会有什么样的潜力。根据这个潜力评估,可以制定相应的新产品上市的规划,包括调整促销的预算,以及人员的调配。这些都是有意义的。
第三个角度是从已经上市的产品的角度,我们可以通过预测技术看到产品在将来的12个月或者是一到三年的增长趋势是怎么样,它有什么样的潜力,跟新产品一样,得到一个评估,通过这个做一系列相应的促销的调整。同时还可以通过预测技术达到对现有的销售进行监测预警的目的,比如说我们看到未来的一个季度的销售指标是否能达成。基于这些场景需求,这样的预测怎么来进行呢?我们有一个基本的方法,就是基于事件的预测方法,分为两步,第一步是定量研究,就是我们所说的基线预测,这部分纯粹从数据出发,运用相应的数学或者是统计模型,算法来挖掘其中的规律,然后用这个规律来预测未来的发展状况。这是我们今天侧重的部分。
第二步是定性研究,在未来的一段时间里有一些事件会发生,这个事件可能会影响到产品的销量。但是,这个事件,在我们的定量研究部分,有的时候是很难或者是不能在这个模型里得到体现,所以说只能通过定性研究来达到量化事件的目的,对我们定量的部分的预测做一个调整,或者说修正。使我们的预测结果更加合理和准确。
大家知道,一个不准确的预测所带来的损失是无法计算的,举个例子,如果一家企业想运用预测模型来估算未来一段时间里,它在某一个疫苗产品的市场需求,如果过高的估算需求的话,会对这个公司造成很高的库存压力,同时大家知道,这些疫苗产品是很容易过期,这样的话会带来一定的损失。如果过低的预测市场的需求,这个产品会在市场上出现断货的现象,同时会使公司造成生意上的损失。如果这个疫苗产品在这个季节是刚性的产品,可能还会引起社会的影响。所以说,得到合理准确的预测结果是做预测的追求。
那么怎样来选择一个最佳的预测模型呢,可以基于下面四点来做权衡或者是折中。
首先是准确度的要求。对于不同的需求,对于误差范围的容忍度是不一样的。如果只是从宏观上看一下市场的规模怎么样,它对这个误差允许的范围的话相对来说比较高。但是我想要估算下一个季度销售的指标,那么这样的话,对于误差的容忍相对来说是很低的。这样的话,就造成了所选择的模型不一样,误差范围高的模型相对比较简单,误差容忍范围低的模型相对比较复杂。
第二是预测对象的复杂度。比如说数据的离散度很高,要想得到合理准确的预测结果,需要的模型也是相对来说比较复杂。
第三个是预测的周期,如果是一个短期的一次性的预测,运用的模型相对来说比较简单一点。
第四是模型的可解释性。如果模型越复杂,模型的可解释性越低。要选择一个最佳的预测模型,使得预测结果准备合理的话,应该从这四方面做一个权衡。
接下来想跟大家分享我们基线预测要用到的具体模型,说到模型大家可能想到回归分析,我们将预测变量作为因变量Y,然后找到这些相关的影响因素作为自变量X,然后经过线性回归找到Y和X的关系,然后通过这个关系来对未来的状况进行预测。这是我们常用的一个方法。也在某一些场景里也确实能够解决很多问题。但是,现在这些问题来了,一,如果影响因素X和预测变量Y之间不存在线性关系;二,或者是用X来预测外的X不是很容易找到,比如说有一些因素我们一时半会可能找不到与Y匹配的,所以说在这种情况下,回归分析就显得有点无能为力。而直接用基于时间序列的方法进行预测的话可以解决这样的问题。
接下来给大家介绍几种基于时间序列预测的方法。首先大家看到这样的场景,这是某一个产品在某一家医院最近一年半的销售数据,大家可以看到,这些销售数据基本是在3万的水平上波动。我们的需求是想快速的估算接下来季度的销量是多少,很简单,画一条线,这条线的均值就可以预测下一季度的销量。确实是这样。我们可以用平均值的方法来对它进行粗略的预测,就是说,我将来的销量就是图中蓝线的部分,等于所有的之前的历史数据的均值。还有更简单的,就是朴素的预测方法,接下来几期的预测等于当期的值,第三种方法,季节朴素方法,如果存在季节性,但是还是相对稳定的话,可以通过这种方法来对接下来的几期进行预测。这个预测的方式,就是说接下来预测值等于最近一个周期的历史同期值,这跟同期的概念差不多。
第四个是漂移的预测方法,就是说这种方法粗略地把序列中的趋势考虑了进来,接下来几期的预测值等于当期的观测值加上要预测的期数乘以这个序列的平均的变化程度。以上这些方法相对来说比较简单粗暴,在一些非常简单的场景上,或者是需求上能够很好的解决一些问题。
接下来是第二种情况。大家可以看到,这个图也是最近两年某一个产品在某一家医院的销售状况。有一个明显的增长趋势,波动相对来说也比较大,有一定的季节的现象在里面。而且现在需求也变了,并不单单只是简单的看一下接下来一个季度的销量是多少,而是要对下一季度的该医院该产品的销售指标进行设置,这就导致我们的预测值将会和代表的奖金挂钩,所以我们要保证一定的预测精度。
接下来这几种方法将可以解决这些问题。首先是指数平滑模型,这应该是大家用的比较多的模型。它的表达式如下,接下来一期的预测跟当期的观测值以及当期的预测值是有关的,这个关系是通过α来表示,也叫平滑系数,α值越大,当期的实际值对后期的预测值影响很大的。下一期的预测跟当期的实际值是比较靠近的,大家可以将公式中这个Xt-1后面的这部分,按照这个公式一直展开下去,我们可以看到,下期的预测值跟这个序列的所有的数据历史数据相关,而且数据越新,这个数据上获得的权重比较大,数据越旧,获得的权重是比较小,而且这种小是呈指数递减的。如果我们再把季节因素,以及趋势加进去的话,这个平滑模型会变得越来越复杂,可以演示出将近30种的平滑模型里。而且这种平滑模型在医药领域里对销售数据预测的话相对来说还是比较有效的。有一个统计软件包专门用这个指数模型做销售预测。
接下来来到了时间序列的ARIMA模型,它的思想是下一期的预测不但跟最近几期的历史数据有关,还跟历史数据以及历史数据预测值之间的残差有关。这分两部分,一个是AR部分,一个是MA部分,AR部分是最近几期的历史数据,MA部分是最级极其的残差部分,就是预测值和观测值之间的差。大家可以把ARIMA模型看作是过滤盒子,我们可以调整PDQ三个参数来调整,然后预测下一期的数据。PDQ到底等于多少,可以通过具体的ACF和PACF图来得到。然后是季节ARIMA,跟ARIMA差不多,只是增加了季节的因素,季节自回归和季节移动平均部分。它的最大好处是有一个很完备的统计系统在里面,有很完备的统计支持,所得出来的系数能够得到统计检验,所作出的预测值有一个严格的上下限的置信区间。同时,它的这些例子里面包含了之前提到的平滑部分,平滑部分的很多的实例都是ARIMA的一个特例。
最后一种是神经网络自回归模型,是神经网络跟ARIMA模型结合的变种,他们之间结合在一块,它有自己独特的一些特点。神经网络,是基于人脑的中枢神经系统构造的模型,结构如图所示,分成三层,一个是输入层,第二个是隐藏层,第三个是输出层,输出层是输入原始的变量,这是数据滞后项,通过这些交织在一起的线段做线性变换,然后输出到隐藏层上,这里设置了一个结点,得到了这三个新的变量作为最后输出层的输入,在隐藏层上我们对新生成的变量做了非线性变换,这样的话能够捕捉到时间序列里非线性的关系。最后在隐藏层和输出层之间,通过一个线性变换到达了输出层,这是损失函数,再通过特定的算法,把这里面所涉及大的参数全部求出来,这就形成了我们预测所需要的一系列的系数,并将这些系数运用到以后的运算中去。这个模型的特点,首先就是它不用像ARIMA的模型那样考虑时间序列的平稳性,不管你平稳不平稳,只要把这些东西带进来的话都可以给你一个最优的结果,第二是在一些很复杂的时间序列上有很优异的预测性能。
综上是我对这些常用到的模型的介绍,还有其它的预测模型,包括向量自回归模型,以及动态回归模型,它们都可以用到时间序列预测的上来。
接下来我对刚才提到的几种预测方法做一个总结。我们在预测这个过程中,首先很重要的一点是考虑异常值的影响,在所有建模当中都会遇到这个,它的影响是相当严重的。因为它会干扰模型,使得模型在以后的预测中会产生偏差。这在进行建模之前必须要把这个处理好。
ARIMA建模的时候必须检验时间序列的平稳性,ARIMA模型适用的条件是时间序列必须得平稳,如果说不平稳,比如说有趋势,或者是有季节影响的话,必须把它过滤掉再来用ARIMA做预测。
第三个是最优参数选取,之前我们看到PDQ的选择,我们只是通过这些图来做的选取,这里我们可以多选几个备选的组合,将这些被选的组合依次带到模型中,根据选取标准,选择最优的参数组合。
第四个是过渡拟合,大家可能会说我的模型拟合的越好,可能预测中表现的更好,其实不是这样的。当我们用这个模型做预测的时候,相当于把它往外推,这些数据没有包含在我们构建序列模型的数据里面,如果这里预测的数据和模型训练集数据有一点不一致的话,预测会发生很大的偏差,所以我们得避免过渡拟合。怎么来缓解过度拟合,采用传统的交叉验证,我们拟合多次,将数据分成两部分,一个是测试集,一部分作为训练集,然后我们看模型在训练集的表现,然后看模型在多个训练集上的表现,将它们平均起来,得到最终的衡量这个模型预测性能的评判指标。
这是传统的交叉验证的方法,对于时间序列的交叉方法,而不能按照传统的来,主要是因为时间序列必须得考虑时间的连续性,我们也是借鉴了前面的,只是说具体的操作有不同。假设我这里有30个数据参与这个模型的构建。我们首先选取20个,先来建立一个模型,然后看这个模型在往外推一个点的时候的表现是什么样的,然后记录下来。接下来让这个训练集再增加一部分,包含第一步的红色点,再来建立一个模型,然后看接下来另外一个点,这个模型在这个点上的表现怎么样,以特类推,这里进行了大概十次,然后这个模型在红点上的具体的表现,把它平均起来,让它作为一个我们预测模型的性能的评判指标。第五部分是交叉验证部分,来缓解过度拟合用到的。然后是模型的预测性能的评价,有很多评价指标可以衡量预测模型的预测性能,比如说MAE,PMAE都可以来衡量它,我们可以来算出它,综合评判这个模型到底怎么样。
最后一个是在做完这些预测模型后,必须做残差的白噪声检验,如果模型通不过残差的白噪声检验的话,说明我们的模型还没有完全提取出序列中的信号,所以我们得重新来构建。只有通过了残差的白噪声检验后,才可以拿这些模型来做往外推的预测。
第二,我们对前面介绍的五种模型,从多个维度做了横向的比较,从考虑的因素来看,回归方法,如果能找全影响因素的话也是相对来说比较全的,然后是神经网络,我们考虑的是预测序列的滞后项,然后把影响因素也放进来,这样也可以提高他的预测精度。从数据量上来看神经网络所需要的数据量是最大的。其实,不需要数据量的就是指数平滑,如果你有两个点的话都可以做。然后这是长期的准确性,相对来说神经网络和ARIMA的回归相对来说好一点。
接下来跟大家分享我们所作的实际的项目,这个项目的背景是这样的,客户想要知道他们的产品在所有的目标医院上接下来一个季度的具体销量是多少。从而来监测他们在这些目标医院上的代表能否完成他们的销售指标。他们给了我们将近6000家医院,有将近10几个产品来做预测。这个项目有两个挑战点,一个是怎么保证精度,第二个是怎么算出这么多模型,因为这样的计算量是相当大的,有将近十几万个模型要出来。我们的做法是把前面所提到的预测模型的例子作为备选的模型空间,然后通过模型选择的自动化选择一个最优的模型作为最佳的,就是在这个产品在这个医院上的最佳的预测模型。然后往外来预测接下来一个季度的销量。最后的表现效果上,相对还是不错的,也达到了将近80%的预测精度。
这是我今天要分享的内容,谢谢大家。
|