菜鸟仓配需求预测与分仓规划全流程实战解析

发布时间:2026/9/8 14:09:13
菜鸟仓配需求预测与分仓规划全流程实战解析 简介这是一套天池大数据竞赛“菜鸟-需求预测与分仓规划”赛题的完整实践方案适合正在学习供应链数据分析、回归建模与仓储优化的开发者参考。方案围绕需求预测与分仓规划两大任务提供从数据清洗、特征工程、分仓建模到模型融合的完整代码与思路覆盖XGBoost、GBDT、随机森林、SVR等多种回归方法并为每个仓库单独建模以提升预测精度同时包含ARIMA时序预测、成本计算与规则/模型融合脚本贴近真实赛题流程。压缩包共68个文件、大小133KB其中以58个Python脚本为主辅以6个SQL数据处理脚本、2个CSV预测结果示例、R脚本及说明文档目录划分清晰便于按模块研读。目前已有2318人学习适合希望通过真实赛题掌握数据预处理、回归调优与分仓库存规划要点的读者。 先说明一点很多人一看到“预测”两个字第一反应就是调个 XGBoost 或者 LSTM 把时序跑起来然后看分数交卷。但菜鸟这个赛题真正有意思的地方是它把“需求预测”和“分仓规划”串成了一条完整的供应链决策链路。你预测得再准如果后面的分仓规划不做对最后的履约成本照样难看。这篇文章我就围绕这个赛题把从赛题拆解、数据理解、预测建模到分仓规划的全过程展开聊一遍也会把我实际跑下来踩过的坑、调过的参数、推翻过的方案一并写出来给后面想打这个赛题或者做类似供应链优化项目的朋友一个能直接上手的参考。1. 赛题拆解与业务逻辑还原1.1 菜鸟仓配场景里预测和规划到底在解决什么问题先说业务背景。菜鸟做的是电商仓配网络商家货品入仓后分布在几个不同区域的城市仓里用户下单后系统会找距离最近、时效最好的仓库发货。这里就涉及两个核心决策一个是每个仓里每种商品到底该备多少货另一个是当库存不够或者分布不合理的时候应该怎么在各个仓之间调拨。如果没有预测仓库只能拍脑袋备货结果就是要么爆仓积压资金要么缺货丢销量。如果只做预测不做规划预测出来的需求你没法落成每个仓的具体补货动作那预测本身也就是一张纸。所以天池这个赛题把两个问题绑在一起本质上是逼你从“算数”走向“做决策”。我当时第一遍看赛题材料的时候脑子里浮现的场景就是双十一前仓里堆满纸箱的航拍图。你看着货很多其实有的 SKU 在 A 仓积灰在 B 仓早就断货了。这个赛题模拟的正是这种日常备货和调拨的逻辑只不过把决策周期拉长到了“未来两周”这种粒度。1.2 官方赛题要点与数据流的理解这类赛题拿到的数据一般包含三大块商品基础信息品类、品牌、重量、体积这些仓库基础信息城市、覆盖区域以及历史出货流水每天每个仓每个 SKU 卖了多少件。有些赛题还会额外给一些营销节奏或者流量活动标记但菜鸟这场赛题相对干净更多是靠历史出货数据自己提取规律。你要预测的目标往往就是“未来某段时间每个仓每个 SKU 的需求量”然后基于这些预测结果去做分仓规划也就是告诉系统每个仓应该备多少货不同仓之间的库存应该怎么分配。这里面有一个业务关键点电商仓配里的需求不是纯随机波动的它有周度周期性周末单量高、工作日单量低、季节周期性换季服装、年货节、以及 SKU 生命周期新品爬坡、老品衰退。如果你只是把数据喂给模型跑出一个数没有把这些业务节奏解构出来那你预测出来的东西大概率只是均值的平移对分仓规划一点用都没有。2. 完整解题框架与评估机制解读2.1 为什么预测与规划要分两个阶段解耦很多第一次接触这个赛题的朋友会问为什么题目不直接让我算每个仓的补货量而是先要预测需求再分仓这其实是供应链计划里的标准分层思路。预测是需求侧的问题它回答“市场想要多少”规划是供给侧的问题它回答“我该怎么备货才能满足需求”。两者混在一起会带来一个灾难性的问题——你分不清最终的误差到底来自预测不准还是来自规划策略不对。赛题把这两步分开既方便评分也方便参赛者定位问题。我实际做的时候也是分两套流程跑的先单独调预测模型把预测精度做上去再单独跑规划模型在给定预测结果的情况下寻找最优分仓方案。最后再把两个流程串联看端到端的成本表现。2.2 评估指标背后的权衡逻辑菜鸟这场赛题的评估指标我记得不是线上常用的 MAE 或 RMSE而是更贴近业务的天池自定义指标比如加权准确率加权 SMApe 或者类似形式。这种指标的特点是它对“预测方向和量级同时正确”有要求不是让你把绝对值做小就行。举个例子某个 SKU 上周每天出 50 件你预测下周一也是 50 件绝对值误差可能是 20 件但如果这一周该 SKU 实际暴涨到 200 件你还在按 50 件备货那分仓规划直接崩盘。所以指标设计得聪明的地方在于它不是惩罚你的“绝对误差”而是惩罚你的“偏离度”——偏离度越高缺货或者积压的成本越大。我当时做了个小实验验证这个逻辑纯用历史均值做预测得分极低但用带星期特征和趋势特征训练的 GBDT分数立刻提升一大截。原因就在于模型学会了“周一和周日不是一个量级”这个基本规律。3. 预测模型的实战构建3.1 数据清洗与聚合粒度的选择拿到原始出货流水后不要上来就训练模型先做你要预测的粒度定义。仓配需求预测通常有两个候选粒度SKU 维度单一商品和 SKU仓维度某个商品在某个仓的出货量。从业务上看分仓规划需要 SKU仓维度的预测结果因为你得告诉每个仓补多少货。但从模型训练角度看直接在 SKU仓维度建模会有一个痛苦的问题大部分组合是没有销量或者销量极低的长尾非常严重模型很难学出信号。我当时试了两个方案第一个是直接在所有组合上训练一个全局模型带上 SKU 和仓的 embedding 特征第二个是先按 SKU 聚合成总量建模然后把总量按每个仓的历史占比拆分下去。实测下来方案二的稳定性更好因为总量级别的规律更明显模型学起来不费劲拆分到仓的时候也只要给一个相对稳定的比例就行。不过方案二有个注意点如果一个仓的占比本身在随时间变化比如新开仓、关仓、区域调整你需要动态更新这个占比不能直接用全历史均值。我后来是把占比做成按最近 12 周的滑动平均这样既能跟上变化又不会因为短期波动剧烈而抖动。3.2 特征工程核心是让模型“看见周期”特征这块我大概分成四类来构建每一类背后都有它的业务逻辑时序特征滞后 N 天7 天前、14 天前、28 天前的出货量滑窗均值/最大值/最小值窗口长度分别试了 7 天、14 天、30 天。这些特征的作用是让模型知道“最近大概什么水位”。周期特征星期几、月中第几天、月份、是否为节假日及节假日前 N 天/后 N 天。做电商的都知道大促和节假日前后的销量曲线是完全不一样的不加这些特征模型就学不到“周五冲高、周日回落”的节奏。商品画像特征这个 SKU 总的出货量、上架天数、最近 30 天动销率、价格带、品类编码。这些信息相当于给每个 SKU 一个“身份标签”帮助模型区分爆品和长尾品。仓维度特征仓对应的区域 GDP 水位如果有、历史出库占比、仓间距离矩阵这个对后面的分仓规划也有用但预测阶段也能作为环境变量。这里尤其要强调一下节假日特征的处理。电商的销量在双十一、年货节、618 这些节点会有几倍到几十倍的跳变你用普通的日历特征很难捕捉到这种爆发。我当时翻了一下赛题提供的数据虽然没有明确的活动标记但可以自己根据销量峰值去反推“疑似活动日”然后做二值化特征。后来验证下来这个手工活动标记把预测误差直接压低了 5% 以上。3.3 模型选型与训练细节模型层面我最后选了 LightGBM没上深度网络。原因很现实表格型数据 特征工程做扎实后GBDT 类模型依然是性价比最高的方案训练快、调参直接、不容易出幺蛾子。深度模型在这类“中长尾分布”的数据上很容易过拟合到热门 SKU对长尾品毫无泛化能力。训练细节上有一个容易忽略的地方一定要用时序交叉验证不能用随机 K 折。因为出货数据是有时间依赖的你用第 1 天到第 60 天训练随机抽第 55 天的数据去验证虽然它也在训练集里你得到的是一个虚高的分数真正应该做的是按时间滑窗比如用第 1-60 天训练第 61-75 天验证然后滑到第 16-75 天训练第 76-90 天验证。这样模拟的是“用历史预测未来”的真实场景。我跑下来梯度提升树里有几个超参很关键学习率设 0.05树的深度控制在 5-6叶子节点最小样本数调到 20 以上特征采样比例 0.8。这套参数配合 L2 正则后在验证集上的效果比默认参数好了不少尤其是降低了长尾 SKU 的抖动误差。3.4 防止预测与真实分布的偏斜做需求预测最经典的问题就是“零膨胀”。大量 SKU 在大量日期里都是零销量但偶尔有一天突然出货几百件。如果你直接训练回归模型模型会很聪明地把这些 SKU 预测成接近 0 的某个小值——这在 MSE 损失下看起来是正确的选择但实际业务里你要的是一个“偶尔能报出大数”的模型。我当时用了两层策略第一层先在 SKU仓日期粒度训练一个二分类模型判断“这一天这个 SKU 在这个仓有没有出货”第二层只对有出货的样本训练回归模型预测具体数量。预测时把两层的输出相乘得到最终需求。这样能把“是否出货”和“出多少货”两个逻辑解耦模型的训练目标更专注。另外我还做了一步对出货量做 log1p 变换再训练回归模型预测完再 expm1 还原。这个思路很简单但有效因为销量分布是高度右偏的直接训练回归会被几个大单 SKU 的极端值带偏。换成对数空间训练后模型会更多关注中等量级样本的拟合整体分位误差更均匀。4. 分仓规划的建模与实现4.1 把规划问题抽象成可求解的数学模型拿到预测需求之后下一步就是分仓规划。这个问题的输入是预测出来的每个仓每个 SKU 的需求量每个仓的容量上限不同仓之间的调拨成本以及缺货造成的损失成本。输出是每个仓每个 SKU 应该持有的库存量以及哪些仓之间需要调拨、调多少。这个问题本质上是混合整数线性规划MILP。把成本拆成三块来建模库存持有成本每个仓每件商品多放一天的钱鼓励你不要过度备货。缺货惩罚成本某个仓的需求没满足时的惩罚鼓励你往需求大的仓多铺货。调拨运输成本从 A 仓调货到 B 仓的单件运输费用鼓励你尽量在本地仓满足需求。目标函数就是把这三个成本按权重加总求最小。约束条件包括每个 SKU 在所有仓的库存总量不超过总量上限每个仓的总体积不超过仓容量调拨量非负等等。这里有一个关键权衡要说明白调拨成本的存在让“完全平均分配”变成不可能。如果 A 仓需求 1000 件、B 仓需求 100 件你把货各放一半B 仓的库存就积压了而 A 仓还缺货最后缺货惩罚库存成本双高。所以规划模型最后算出来的方案一定是一个“就近满足需求大头、远端少备货”的不均衡分布。4.2 把预测误差纳入规划鲁棒性思路直接拿预测的点估计值去做规划看起来很顺但有一个隐患如果某个 SKU 的预测明显偏低你按预测值备货实际需求一来直接缺货再补调拨就来不及了。要解决这个问题不能只靠预测模型的精度还要在规划阶段留出“安全库存”的概念。我当时采用的办法是用预测模型输出分位数预测比如预测 80% 分位值然后让规划模型在 80% 分位需求覆盖下求解补货量。这样等于给规划团队一个“置信度更高的需求曲线”虽然成本会略高但缺货风险被压到可接受范围。如果你想更贴近工业界的做法可以做所谓的“随机规划”Stochastic Programming即对每个 SKU 采样多组可能需求带入规划模型求期望成本最小但这样求解规模会爆炸。在竞赛时间有限的情况下用分位数替代点估计最省力效果也足够好。4.3 从赛题到真实业务分仓方案如何落地分仓规划的结果不只是给一张库存表还要给出可执行的调拨动作。比如某仓某 SKU 当前库存是 50 件预测未来两周要卖 200 件规划结果是该仓要备 180 件那就意味着要调拨 130 件进来。这里输出的东西其实是一张“补货指令表”。在真实业务里这个指令通常还要按天来拆考虑提前期lead time。比如从 A 仓调货到 B 仓要走 3 天那今天下的调拨单要到第 4 天才生效这 3 天的衔接需求也得靠安全库存去扛。赛题虽然不要求你做这么细但在答辩或者写方案时提到这一层能明显体现你对业务的理解深度。我参加完这个赛题后最大的一个体会是单纯堆模型分数是没有上限的但从赛题的定位看把规划阶段做好远比把预测分数刷到小数点后第三位更有价值。因为预测的边际收益在下降时规划策略的改进往往是“换一个思考方式”就能带来的量级提升。5. 常见问题与避坑实录5.1 常见问题速查表问题现象可能原因解决思路预测分数不错规划后总成本高预测模型优化的是准确率没考虑长尾风险改用分位数预测按 80% 分位需求做规划热门 SKU 很准长尾 SKU 全飘模型被头部样本支配做 log1p 变换、对长尾 SKU 单独训练一版模型星期特征加了但模型不敏感滞后特征太长淹没了周期信号把滞后 7/14 天的特征单独和星期特征做交叉组合仓占比偏移导致分仓失真用了全历史占比旧比例拖后腿改为最近 12 周的滑动平均权重随时间衰减调拨成本算出来是不合理的对角阵没算清“不同仓之间的距离”用经纬度或者城市间物流距离表生成仓库距离矩阵规划模型求解太慢SKU 数量大、整数变量多按 SKU 分批次独立规划或用分层求解先总量后仓位5.2 实战中比较隐蔽的坑第一个坑是复用同一份数据做特征和验证导致的泄漏。我在初期搭建验证集时直接用全量数据算了滞后特征结果验证集里等于混入了未来信息。后来改成在每折训练集内部单独计算滞后特征分数立刻掉下来一大截——这才是我真正的模型水平。所以提醒大家做时序赛题时特征工程一定要跟着交叉验证折叠走绝对不能全局一次算完。第二个坑是低估了商品生命周期的影响。很多 SKU 在数据后半段已经彻底停售了但模型还在按历史均值给它们备货。我后面专门加了一个特征叫“最近 7 天是否还有动销”同时给超过 30 天无销量的 SKU 打折预测。这个小改动不仅减了库存成本还让缺货率下降了一个点因为库存预算被释放给了真正在动销的商品。5.3 个人参赛心法与扩展思考赛后复盘时我在想这个赛题本质上练的不是“如何把准确率做到 99%”而是“如何在一个既有预测误差、又有资源约束的真实决策场景里做出整体更优的方案”。这是学校里很少教、但在实际工作中天天都要面对的题目。做供应链的同学应该能秒懂这种感觉业务方不会因为你把 RMSE 降低了 0.1 就给你发奖金但他们会因为缺货率下降了 2% 而记住你。最后分享一个可以继续扩展的角度如果赛事数据允许可以试试把图神经网络引入仓间调拨关系的建模因为仓与仓之间的库存共享本质上是一张图。我虽然没有在赛题时间内跑通这个方案但在类似场景的实验中GNN 对——多仓需求协同预测——的提升是有实打实收益的。后期的演进方向可以考虑这个思路。本文还有配套的精品资源点击获取