/201604-CN

菜鸟-需求预测与分仓规划

Primary LanguageJava

线上第四名


较早期的比赛。

基本思路:最小化期望成本

对于一个待预测的商品分仓对IS,我们认为,它未来14天的非聚划算支付件数(qty_alipay_njhs,以下简称qan)之和d是随机的,并且符合某种概率分布。假设这种概率分布的概率质量函数为m(x),当将这个值预测为t时,期望成本为
Ec = Σ(C(t, x) × m(x))
式中C(t,x)表示预测值为t而真实值为x时的成本。我们的目标就是求使这个成本最小时的t。由于我们不知道也无法求出m(x)的具体形式,需要根据IS的历史信息找到合适的函数来作为m(x)的近似表示。

基线一:用频率来表示概率

对于待预测的商品分仓对IS,我们选取过去r天的数据,以14天作为一个单位分别求qan和,作为样本。我们用x在样本中出现的频率作为m(x),来寻找使Ec最小的t。可以证明,此时满足条件的t一定在样本中出现。(当改变m(x)的形式,使得这个结论不成立时,由于最优的t一定在样本的最大值和最小值之间,故可以遍历这个范围内的所有整数,或用一些算法来做更精确的选择)

关于r的选择。我们希望样本数量尽可能地多,但过于久远的数据会和待测时间段的数据差异过大。经过测试,r=28时最好。此时样本数为2。

基线二:增加样本数

我们在赛季一前期使用的方法。

在基线一的基础上,为了增加样本数,我们在选取的r天数据中,把每一天的qan乘以14作为一个样本(这样做的前提是我们没有发现数据有明显的周期性)。

基线三:频率 + 时间调整

我们在赛季一中後末期、赛季二前中期使用的方法。

在基线二的基础上,我们认为,训练序列中,越久远的样本,可信度越小,因而概率越小。因而我们用
(归一化後的)频率 / (s + C)
来作为m(x)。其中,s表示样本到测试集的天数;常数C用来平滑以更好地匹配本赛题数据分布。

基线四:频率 + 时间调整 + 融合

我们在赛季二後期使用的方法。

在基线三的基础上,我们改进了基线二中增加样本的思路。以每一天的qan乘以14作为样本,受到的异常值的影响会比较严重。如果以连续几天的qan均值乘以14作为样本,则会减轻受到的异常值的影响,但同时减少了样本数。因而可以考虑将它们融合。

我们以2天为单位,求出每连续2天的平均qan乘以14,作为样本,做出预测;再以3天为单位,求出每3天的平均qan乘以14,作为样本,用同样的方法做出预测……这样,我们分别以1~14天为单位,做出了14组预测,并将它们加权融合。由于单位数越少的,样本数越多,预测得就越准确,因而权值就要越大。我们选用(归一化後的)单位数的倒数作为权值。

优化一:分仓参照全国调整

我们在赛季二末期对分仓做的优化。

同一件商品,不同的分仓有着类似的趋势。对于某一商品某一分仓,我们用
(该分仓qan + 按比例缩小後的全国qan) / 2
来代替该分仓的qan,这里“按比例缩小”是指将全国qan整体缩小到平均值和该分仓的平均值相等。此时,我们做出的预测受该分仓的异常值的影响会很小。

优化二:去整体异常

我们在赛季二末期对整体异常做的优化。

双十一双十二节日都是比较特殊的日子,这些日子所有商品整体都有异常。为了去除这类异常对预测造成的影响,对于某一天某一个IS对,我们用
qan / 归一化後的当天所有商品全国总qan
来代替qan。

优化三:进一步改进概率质量函数

我们在赛季二末期对基线二中的常数C做的优化。

根据对一些IS对历史数据的观察的结果,我们认为,对于一个IS对,历史数据整体波动较小时,可以偏重较近的样本;而整体波动较大时,应该减轻这种偏重,即调整基线二中的C。

效果

以上每一步改进,我们实现後,线下和线上都分别取得了一定的效果,从而验证了我们的想法。

总结

本算法的主要优势:简单(思路简单,理解简单)、高效(开发高效,运行速度快)、极强的可解释性(逻辑清晰,每一步紧扣目标做设计)。