当前位置:   article > 正文

阿里云天池供应链大赛(一)_天池阿里云竞赛思路

天池阿里云竞赛思路

image-20211113204739804

image-20211113210746415

  • 使用历史平均来预测未来的需求

image-20211114194325223

  • 使用测试集真实数据进行过拟合的结果

一、问题描述

名词定义

库存水位

在仓库存数量,用来满足需求。

补货时长(交货时间,lead_time

从下达补货指令到货物到仓可用的时长。

本赛题初赛时的补货时长为14天,即假设1号A货物的库存水位为0,此时下达A货物补货指令,补货量为10,则1号至14号A货物的库存水位均为0,15号时A货物的库存水位为10。

补货在途

下达补货指令后还未到仓的货物量总和。

上例中1号至14号A货物的补货在途为10,其他时段为0。

若在8号再次下达补货量为10的补货指令,那么1号至7号的补货在途为10,8号至14号的补货在途为20,15号至21号的补货在途为10,其他时段为0。

补货策略

本赛题场景使用周期性盘点的补货策略,每周一为补货决策日,决定货物的补货量。

历史需求

货物历史需求量的时间序列,值得注意的是,因为云产品有购买与释放的概念,所以本赛题场景下需求量会为负数,即云产品被用户释放。

补货单元

货物的唯一标识。

赛题场景

基于给定过去一段时间的历史需求数据,同时结合当前的库存数据、补货时长、补货在途以及补货单元的相关信息(产品维度与地理纬度),参赛者需要自己提出方案,在补货决策日确定每一补货单元的补货量。最直接的方案,可通过历史需求数据,对未来的需求进行预测,结合当前库存水位以及补货在途的货物判断14天后的库存水位能否满足14天后的一系列需求(因为当日补货14天后才能到货),考虑对应的补货量,达到在保障一定服务水平的情况下,实现最低库存成本的效果;当然也可采用end to end的整体优化方案,实现该目标。库存量视角的变化过程如下图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bCCNFdZW-1639014735168)(C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]

我们会给一个训练集,供参赛选手训练模型并验证模型效果使用。同时,初赛时我们会提供一个测试集,选手需要为按时间读取20210302-20210607的需求数据,并根据历史需求数据以及补货在途,决定补货量,并把决策结果CSV文件输出到指定位置。(由于赛题特殊与评价机制的问题,初赛时给选手透出了未来数据,选手在初赛时将其作为未知数据调整算法,不允许在决策时使用当前日之后的未来数据。)

由于库存控制是一个前后相关的决策过程,两次补货决策并不独立,因此我们会提供一段时间的数据,由选手在时间轴上进行多次补货决策,最后在较长的时间段内评价选手方案的好坏。在复赛时,选手需要提交一个docker镜像,镜像中需要包含用来进行库存管理所需的所有内容,如模型、脚本等,未来的需求数据以及到货时间将通过流评测的方式给出。镜像中的脚本需要能根据所得的需求量,根据历史需求数据以及先前所做的决策,决定补货量,并把决策结果CSV文件输出到指定位置;初赛时测试集文件将线下交给选手。

相关参考

https://web.mit.edu/2.810/www/files/readings/King_SafetyStock.pdf

https://abcsupplychain.com/safety-stock-formula-calculation/

数据描述

训练集包含如下信息:

虚拟资源使用量历史数据

demand_train.csv为虚拟资源使用量历史数据,包含7列。每列的含义如下:

字段说明
unit单元
ts日期
qty资源使用量
geography地理信息
geography_level地理聚合维度
product产品信息
product_level产品聚合维度

inventory_info.csv为虚拟资源库存数据,包含7列。每列的含义如下:

字段说明
unit单元
ts日期
qty库存量
geography地理信息
geography_level地理聚合维度
product产品信息
product_level产品聚合维度

geography_tuopu.csv为地理拓扑数据,包含3列。每列的含义如下:

字段说明
geography_level_1地理层级1
geography_level_2地理层级2
geography_level_3地理层级3

product_tuopu.csv为产品层级信息,包含2列。每列的含义如下:

字段说明
product_level_1产品层级1
product_level_2产品层级2

unit_weight.csv为库存单元的库存信息,包含2列。每列的含义如下:

字段说明
unit单元
weight权重

复赛阶段,测试集的数据格式和初赛阶段相同,但是测试集的内容不会提供给参赛选手。选手需要在docker代码中从指定的数据集目录中读取测试集内容,进行特征工程和模型预测,最后输出的格式和初赛一致,输出后续一段时间内决策日需要补货的集合(如果有预训练权重则docker代码中需包含本地训练好的模型)。

提交格式

在初赛中,预测结果的提交格式为CSV压缩的ZIP文件。文件中的每一行表示在未来的时间段内每个决策日每个库存单元需要补充的量,具体包含:补货单元、日期和补货量(用逗号隔开),形式如下:

"unit1","20210308",12

"unit1","20210315",11

"unit1","20210322",9

**注:在复赛中,参赛选手需
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

要提交docker镜像,具体的提交方式及规范请参见到时发布的容器镜像提交说明。**

评价指标

综合指标

enter image description here

enter image description here

另外
enter image description here

评测时按时间顺序更新上述变量,完毕后用上述公式计算指标。

#初赛评测程序伪代码如下
#intransit 是用来记录预计到达的资源的中间变量
init intransit[][] = 0
for i in I:
    for d in D:
        #初始库存值已给出
        qty_inventory[i,d] = qty_inventory[i,d - 1]

        #qty_replenish即为选手提交的补货决策
        if qty_replenish[i,d] > 0:
            #lead_time 为交货时间,在交货时间之后供应会到达
            intransit[i,d + lead_time] += qty_replenish[i,d]
            
        # 可用库存加上到达的库存
        qty_inventory[i,d] = max(qty_inventory[i,d] + intransit[i,d], 0)
        
        # 需求没有被满足的量,当天需求量和可用库存量进行比较
        stockout[i,d] = max(demand[i,d] - qty_inventory[i,d], 0)
        if demand[i,d] < 0:
            # 净需求为负时候,表示释放,可用库存会增加,释放的量和已使用的量取小
            qty_inventory[i,d] = max(qty_inventory[i,d] + min(abs(demand[i,d]),qty_using[i,d - 1]), 0)
        else:
            # 净需求为正的时候,可用库存进行扣减,>=0
            qty_inventory[i,d] = max(qty_inventory[i,d] - demand[i,d], 0)
        # 前一天的保有量+今天被满足的量
        qty_using[i,d] = max(qty_using[i,d - 1] + demand[i,d] - stockout[i,d], 0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

二、解题思路:

28w+训练数据

6w+测试数据

思路:

针对代码中的forecast_function进行修改,目前baseline用的是历史数据的平均值

目前的预处理采用的是通过unit的这一个值来对历史上的数据进行逐个分析(测试集2021.3.2之前)

qty:历史的当日资源使用量,同样作为重要的特征进行计算,这个可以考虑结合geography这个进行多时序之间的关联性去做预测;

geography_level:目前这个变量还没有做预处理,全部都是一个值

geography:这里目前看到的是每个unit对应的是同一个值,因为是地址所以脱敏了,但是同样官方给出了geo_topo的一个对应关系表,可以通过一定的与处理手段将此特征作为一个聚合的指标。

product_level2:表示的是商品的大类

product:表示是某个类型的商品目前也是脱敏状态,同样的也有product_topo对应关系表,需要构思如何去处理好这个特征;

聚合的方法:一阶平滑二阶平滑;

每个仓位的历史数据长度:

Unit_Length

632个仓位信息:

image-20211113194131956

image-20211113194144632

地理信息地址81个

19个商品product

**举例18个Unit的历史数据趋势:**分别对应的是0-9和10-18这几个Unit,因为这个变量脱敏了我们考虑后期转为数值型方便计算存储。

unit_0-9_history_qty

unit_9-18_history_qty

  1. 目前的baseline思路:

在每次日期来到补货日的时候进行该Unit的历史数据搜索,并取历史数据的平均值,然后将平均值copy90份返回,在补货策略部分,将这90份中的前14份,也就是一个补货周期在途时间,加上安全库存作为补货判断阈值条件也就是未来14天可能需要的存货量。如果在途的加上目前的库存大于这个值就不用补货,小于就要补货。注意如果补货策略为肯定的,那么在途补货量需要更新一次。

  1. 目前需要解决的问题:

实际上这与传统的时间序列预测会略有不同,传统的可能相对容易,针对的是1个对象未来的某项指标进行预测;可能是未来的某一段时间(一周或者一个月)当然这个预测的周期越长难度越大。目前我们暂时如果按照baseline的补货策略,我们需要获得每个Unit在每个补货周期日的未来14天需求,像这样的Unit之前说了一共有632个,那么补货周期日光在测试集里面。

  1. 数据预处理的思路:(特征工程)
  • 不同于baseline我们首先希望用上geography_level, product_level进行分层次预测。然后目前有81个地理位置,和632个仓位,如果用lstm的话初步的策略是进行labelencoder对这些标签进行编码,如果可行的话可以考虑one-hot-encode,这个时候qty是作为label的,目前进行了尝试不论是独热编码还是labelencoder都是学不到任何东西的。
  • 当然LSTM我们首先还是考虑单变量的形式,目前测试某个仓位的结果如下:

image-20211114225118268

  • 如果采用ARIMA这种自相关的模型,那么我们考虑的因素就只是历史的qty

pred_true_compare

image-20211115195841371
在这里插入图片描述

image-20211117155050041

存在的问题:每次预测用了最新的真实观测值来更新模型,所以拟合的非常的好,这样的结果也很假,B榜肯定是不可行的,但是单变量-》多变量的转换还仍旧是个大问题。

image-20211117170610266

值得参考的优胜方案:

  • https://www.kaggle.com/ceshine/lgbm-starter 同样是单变量的问题
  1. 仔细阅读数据描述和概述。如果可能,可以尝试探索领域知识。
  2. 在阅读任何论文、讨论或Notebook之前,尝试自己创建一个基线。这有助于在将您的思想锁定在其他人所说的内容之前产生全新的想法。
  3. 建立可行的交叉验证策略并提交到排行榜。确保您的CV策略也适用于 LB,这一点很重要。
  4. 阅读,阅读和学习!充分探索与该主题相关的论文,在论坛和笔记本中寻找灵感。
  5. 开始在模型方面或功能方面调整基线。一次只调整一件事,所以你知道是什么导致模型改进/表现更差。
  6. 尽可能多地探索新方法,不要在行不通的事情上纠缠太久。
  7. 如果其他一切都让你失望,模型集成是最稳定的改进方式。
  8. 选择具有良好 CV 分数的提交。

特征选择删除不重要的特征,有助于减少数据中的噪声。在 Mechanism of Action 竞赛期间,论坛和讨论帖中的方法对我们设计的模型没有帮助。在这种情况下,不要害怕深入研究并阅读论文。由于我处理的案例多标签分类并不常见,因此我找不到任何简单的教程。我找到了一篇论文,旨在比较使用问题转换的多标签特征选择。

阅读研究论文似乎令人生畏,但能够浏览它们并从长页技术术语中掌握关键词是一项至关重要的技能。对于像我这样的初学者来说,试图理解你遇到的每一篇论文的每一个细节是不可能的。只有当我找到我需要和将使用的论文时,我才会尝试理解论文中的每一个单词和引用。

  • 将模型调整为具有非线性拓扑结构或为表格数据构建类似 ResNet 的结构化网络不仅在 MoA 竞赛中获得了一些惊人的结果,而且在接下来的 Jane Street Market Prediction 中也获得了一些惊人的结果,我们在其中排名第16。
  • 探索不同类型的自动编码器,例如去噪、变分和稀疏编码器,可以为您的数据带来令人惊讶的变化,而不仅仅是简单的特征工程和选择可以实现的。
  • 模型融合。组合不同模型的结果可以为您的解决方案增加多样性,从而使其更加稳健和稳定。无论什么建模技巧奏效,合奏总是我在比赛中的“最后手段”。
  • 始终关注新论文并探索论坛中提到的内容之外的内容。调整激活函数(尝试swish而不是 ReLU)和优化器(尝试AdaBelief而不是 Adam 等)之类的小东西可能只会从模型中挤出一些性能。
  • 跳出框框思考!使用一维CNN对表格数据进行特征提取。或者使用DeepInsight,将表格数据转换为图像,利用 CNN 的优势。

不要沉迷于现在的工作,继续前进并花更多时间探索可以带来改进的新事物。

参加 Kaggle 比赛并获得奖牌并非易事,但通过正确的学习方法和工具,这个过程可以变得更容易。

  • 检查讨论帖子和阅读公共笔记本非常有帮助。每天都有新想法出现,我通过论坛中提到的论文和笔记本中使用的库了解了一些最新且引人入胜的模型和工具。其中之一是TabNet,这是一种通过使用顺序注意将特征选择合并到模型中来对表格数据进行建模的新方法。这个模型让我在 MoA 比赛中获得银牌。
  • 最后,拥有稳定而强大的管道对于在最终的私人排行榜中取得出色表现最为关键。浪费时间过度拟合以在公共排行榜中获得额外的 0.0001 是没有意义的。始终相信您当地的交叉验证分数,因为训练数据量大于公共排行榜的数据量。

只是按复制粘贴对学习或赢得比赛没有帮助。永远不要复制别人的工作,我可以从他们的想法中得到启发,甚至使用他们的建模方法,绝不提交其他人的工作作为我的解决方案。

在接触新事物时,我养成了查找所有我不理解的东西的习惯,直到我可以自信地向其他人解释这个主题。
合并到模型中来对表格数据进行建模的新方法。这个模型让我在 MoA 比赛中获得银牌。

  • 最后,拥有稳定而强大的管道对于在最终的私人排行榜中取得出色表现最为关键。浪费时间过度拟合以在公共排行榜中获得额外的 0.0001 是没有意义的。始终相信您当地的交叉验证分数,因为训练数据量大于公共排行榜的数据量。

只是按复制粘贴对学习或赢得比赛没有帮助。永远不要复制别人的工作,我可以从他们的想法中得到启发,甚至使用他们的建模方法,绝不提交其他人的工作作为我的解决方案。

在接触新事物时,我养成了查找所有我不理解的东西的习惯,直到我可以自信地向其他人解释这个主题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/600507
推荐阅读
相关标签
  

闽ICP备14008679号