简介:面向天池“菜鸟-需求预测与分仓规划”赛题,这套资源为参赛者和供应链数据分析学习者提供了一份可复现的竞赛方案。方案覆盖需求预测与分仓规划两大核心模块,采用XGBoost、GBDT、随机森林、SVR等多种回归模型,并对不同分仓单独建模,以捕捉各仓库的销售动态;同时结合数据预处理、特征工程与模型融合,形成从数据清洗、特征构建到训练评估的完整链路。包内共68个文件,以58个Python脚本为主,辅以SQL特征脚本、CSV结果文件、R语言ARIMA实现和说明文档,脚本与数据分层存放,结构清晰,便于按模块对照学习;其中还包括数据生成、成本计算、特征筛选、多模型融合等关键环节的实现。资源包大小仅133KB,轻量易用。已有2339人学习下载,适合正在备战数据挖掘竞赛或研究供应链预测问题的读者,可直接基于赛题代码理解分仓建模、模型融合与仓储规划优化的实际做法,也能为自身项目提供参考模板。1. 某大数据竞赛需求预测与分仓规划赛题:你以为考预测,其实考的是决策拿到这道赛题的多数人,第一反应是去调回归模型。真正拉开分差的反而是后半程:预测值出来了,仓库怎么分、库存怎么摆、缺货怎么惩罚,这一套决策链路才是拿名次的关键。这道题名义上考需求预测,实际上考的是“预测 + 规划”的端到端能力,回归模型、模型融合只是入场券。适合三类人:正在备赛想要完整答题框架的选手、准备数据岗面试想拿项目经验说的求职者、以及想搞懂预测类赛题评判逻辑的学习者。下面按考点分布、高频考点、真题演练、易错点的顺序拆开讲。2. 高频考点:需求预测的回归建模与特征工程2.1 考点分布:预测准是入场券,特征决定下限这道赛题的评分通常由两部分构成:需求预测准确率和分仓规划方案的合理性。预测部分占比大约六到七成,规划部分占三到四成。别小看这百分之三四十的规划分,决赛圈选手的差距几乎都出在这里。预测部分的核心考点集中在特征工程、回归模型选型、时间序列处理、模型融合四块。规划部分的核心考点则是约束条件建模、分配策略、成本函数设计。从历届选手的经验看,特征工程才是预测分数的主要拉分点。很多人一上来就堆回归模型,却忽略了最基础的时间特征、品类特征和区域特征。某参赛者在赛后复盘时说的一句话很实在:“我用同样的模型,只改了特征,分数从百名开外进到前二十。”这说明什么问题?特征决定模型分数的下限,模型调参决定上限。面试官问这个赛题时,最想听的也是你对特征的分析逻辑,而不是你调了多少轮参数。2.2 回归模型选型与参数跑法需求预测本质上是回归问题。常用模型分三个梯队:第一梯队是线性回归、岭回归、Lasso,适合做基线;第二梯队是树模型,包括决策树、随机森林、梯度提升树,这类模型对特征缩放不敏感,是赛题主力;第三梯队是深度模型和时序模型,比如LSTM、Prophet,适合有强周期性的品类,但小数据集上容易过拟合。梯度提升树是这类赛题最稳的选择,原因有三:能处理缺失值、能捕捉非线性关系、训练速度可以接受。参数跑法上,建议先固定学习率,再调树的数量,然后调树的深度和最小样本数。一个常用的起手参数组合是:学习率0.05到0.1,树的数量300到500,最大深度5到7,最小叶子样本数50到100。注意,这个组合只适合中等数据量,如果你的训练集超过百万行,深度要降到4以下,树的数量也要相应减少。回归模型的效果评估,不要只盯着均方误差,还要看加权误差。赛题里不同品类的权重可能不同,你在验证时一定要按赛题给出的权重重新计算误差,否则本地验证和线上评分对不上,这是最常见的翻车现场。2.3 真题演练:需求预测回归题怎么答真题场景:给定某平台近一年的历史订单数据,包含订单日期、商品品类、发货区域、促销标记、节假日标记,要求预测未来某个时间窗口内各品类各区域的需求量。这类题的标准答题框架是四步走。第一步做数据探索,画出各品类需求的时间序列图,观察周期和趋势。第二步做特征工程,至少要构造日期特征、滞后特征、滑动窗口特征、促销特征、节假日特征这五类。第三步训练回归模型,用时间序列交叉验证而不是随机切分,避免数据泄露。第四步做模型融合,把树模型和线性模型的预测结果加权平均,或者用Stacking把多个模型的输出作为新特征再训练一层。面试官问你需求预测项目时,最常追问的是:“你怎么处理促销和节假日的影响?”这道题考的是你对突发因素的理解。通常这么答:先把促销标记和节假日标记作为特征送入模型,让模型自己学习它们对需求的拉升幅度;再单独构造促销前后对比特征,比如促销前一周的平均销量与促销期间的销量差值,用来捕捉促销的透支效应。这个答案能同时体现特征工程能力和业务理解。2.4 实战代码:构造时序特征与验证切分下面给出一段可以复用的特征构造核心代码,它能直接套用到多数需求预测场景。import pandas as pd import numpy as np def build_ts_features(df, target_col, lags=[1, 3, 7, 14, 28], roll_windows=[7, 14, 28]): # 排序保证滞后计算正确 df = df.sort_values(['region', 'category', 'date']).reset_index(drop=True) # 时间特征:年、月、星期、是否为月底 df['year'] = df['date'].dt.year df['month'] = df['date'].dt.month df['dayofweek'] = df['date'].dt.dayofweek df['is_month_end'] = df['date'].dt.is_month_end.astype(int) # 按区域+品类分组,分别构造滞后特征和滚动窗口特征 grouped = df.groupby(['region', 'category']) for lag in lags: df[f'lag_{lag}'] = grouped[target_col].shift(lag) for win in roll_windows: df[f'roll_mean_{win}'] = grouped[target_col].transform( lambda x: x.rolling(win, min_periods=1).mean()) df[f'roll_std_{win}'] = grouped[target_col].transform( lambda x: x.rolling(win, min_periods=1).std()) # 促销强度:过去7天促销标记之和 if 'promo_flag' in df.columns: df['promo_7d_sum'] = grouped['promo_flag'].transform( lambda x: x.rolling(7, min_periods=1).sum()) return df这是构造时序特征最常见的写法。关键点有三个:第一,分组键必须是region加category的组合,只按品类分组会忽略区域差异。第二,滞后天数的选择要结合业务周期,订单类数据通常有7天和28天两个明显周期,因此滞后7和滞后28是必加的。第三,滚动窗口的特征用transform而不是apply,原因在于transform能保持索引对齐,避免合并时错位。验证集的切分同样有讲究。不能随机切分,必须按时间顺序切。常见做法是把最后4到8周作为验证集,前面的全部作为训练集。如果有人对你提起“用前一段训练、后一段验证”的K折思路,那是一种变通做法,但要注意折与折之间要有间隔,行业里叫“gap”,用来消除相邻时间点的相关性影响。3. 高频考点:分仓规划中的分配策略与约束建模3.1 分仓规划的本质:把预测值变成可执行的分配方案拿到预测结果后,下一步是把每个区域的预测需求量分到不同的仓库。这一步考的不再是模型能力,而是约束求解能力。分仓规划的核心目标通常是在满足库存容量、运输成本、时效约束的前提下,最小化总成本,或者最大化订单满足率。很多选手在这一步的做法太随意,按历史占比一拆就完事。这样做的问题在于完全忽略了库存成本和缺货成本。正确做法是先明确优化目标函数,再列约束条件,最后用优化库求解或启发式方法逼近。面试官对这个环节最常说的一句话是:“你的方案在什么约束下成立?如果库存不足怎么办?”理解分仓规划,先建立一个直观印象:假设某区域未来一周预测需求1000件,可用仓库有三个,容量分别是600、800、1200,运输成本各不相同。你的任务不是把1000件平均分给三个仓,而是要让总运输成本最小,同时保证任何单个仓库不被压垮。这本质上是一个带约束的线性规划问题。线上评分系统会对你的分配结果计算一个综合成本,谁的方案总成本低,谁的规划分就高。3.2 约束条件与求解策略分仓规划的约束条件一般分三类。容量约束是最常见的,每个仓库的分配量不能超过其最大库存容量;满足率约束,分配到各仓库的总量要覆盖预测需求的一定比例,常见要求是至少95%;运输约束,某些区域只能由特定的几个仓库发货,这是硬约束,不能违反。求解策略根据数据规模分两种情况。数据量小时,直接用线性规划求解器,把目标函数和约束写成标准形式跑最优解。数据量大时,最优解求解时间过长,改用两阶段法:先用贪心策略做初始分配,再用局部搜索或模拟退火做迭代优化。很多拿高分选手的做法是:先跑一次线性规划拿到基准解,然后在基准解基础上调整,观察成本变化。这个“先基准解再微调”的思路,答题时说出来会让面试官觉得你有工程落地意识。3.3 真题演练:分仓规划题的回答框架和可复现代码真题场景:有三个仓库,容量分别为800、1000、1500,覆盖两个区域。区域A预测需求1300,区域B预测需求800。各仓库到各区域的单件运输成本如下表。仓库区域A单位成本区域B单位成本容量上限仓125800仓2341000仓3621500面试官问:你怎么分配?先答思路:这是一个典型的运输问题,目标是最小化总运输成本,约束是每个仓库出货量不超过容量,每个区域的接收量不低于需求量。然后给出线性规划的写法。import scipy.optimize as opt import numpy as np # 成本矩阵:行是仓库,列是区域 cost = np.array([ [2, 5], [3, 4], [6, 2] ]) # 决策变量展平:x0=仓1发区域A, x1=仓1发区域B, 依此类推 c = cost.flatten() # 约束: 每个仓库容量 cap = [800, 1000, 1500] A_ub = [] for i in range(3): row = [0] * 6 row[i * 2] = 1 row[i * 2 + 1] = 1 A_ub.append(row) b_ub = cap # 约束: 每个区域至少满足需求量 demand = [1300, 800] A_eq = [] for j in range(2): row = [0] * 6 row[j] = 1 row[j + 2] = 1 row[j + 4] = 1 A_eq.append(row) b_eq = demand # 求解 bounds = [(0, None) for _ in range(6)] res = opt.linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs') print(res.x.reshape(3, 2)) print(res.fun)这段代码把规划问题直接翻译成了线性规划的标准形式。A_ub矩阵的每一行表示一个容量约束,A_eq矩阵的每一行表示一个区域的需求约束。linprog的method='highs'是当前比较稳定的求解器。运行结果中,res.x.reshape(3, 2)就是把六个变量还原成分配矩阵,res.fun是最小总运输成本。参数方面要注意两点:当约束无法满足时,linprog会返回错误状态,此时需要放宽某个区域的满足率约束,或者允许仓库超容。实际操作中认知到这一点很重要,因为赛题给出的需求往往超出总容量,完全满足所有约束的情况很少见。4. 易错题/失分点:提交结果前最不该犯的五个错误4.1 用全量数据训练却不做时间切分典型错误:把全年的数据直接切分成训练集和测试集,随机打乱,结果验证分数极其漂亮,一提交却分数暴跌。分析:需求预测数据的时序性极强,随机打乱等于让模型用未来的信息预测过去,属于典型的数据泄露。这个问题在面试中被问到会让整段项目经历大打折扣。对策:任何特征构造和模型训练之前,先把时间切分方案定好。前80%的时间窗口作为训练集,最后的若干周作为验证集。构造滞后特征时,shift的步长必须大于等于预测窗口长度,否则模型会在特征中看到答案。4.2 预测指标和评估指标不一致典型错误:本地用均方误差调模型,线上的评分指标却是加权绝对百分比误差。自己调了半天自信满满,提交后的分数排在末尾却找不到原因。分析:需求预测赛题的评分指标往往不是单一指标,可能对高销量品类和低销量品类设置不同权重。如果本地验证和线上评分的口径不统一,你的所有调参工作都是无效做功。对策:读完赛题说明后,第一件事就是写一个和评分公式完全一致的本地验证函数。每一次改特征或调参数,都用这个函数去算分,而不是用模型默认的损失函数。4.3 只做预测不做规划的可解释性分析典型错误:预测部分做完就急着提交,完全不解释分仓方案为什么这样设计。分析:这道赛题的规划部分有明确的情景设定——线下答辩或提交报告时需要说明分配方案的逻辑。如果只给出一堆模型输出的数字,没有任何条理化的解释,评委无法判断你是会做规划还是单纯跑通了流程。对策:每次提交规划结果前,附加一段分配逻辑说明,包括哪些约束优先、成本权衡是怎么做的、如果需求突变有什么预案。这份说明本身就是拿分项。4.4 模型融合只融合分数不融合特征典型错误:把三个模型的预测结果取平均当作模型融合,线上分数提升有限,还在纠结有什么玄学原因。分析:模型融合有两个层次。浅层融合是预测结果加权平均,效果取决于模型之间的相关性,低相关模型融合才有增益。深层融合是把不同模型的特征重要性做整合,比如线性模型对线性趋势敏感,树模型对非线性交互敏感,两者融合的收益明显更大。对策:尝试两层融合方案。第一层用不同特征子集训练多个树模型;第二层把树模型的输出作为特征,再训练一个线性模型。这种结构能兼顾线性与非线性,比单纯取平均更具实战提升效果。4.5 忽略节假日和促销的延迟效应典型错误:促销标记只保留当天,节假日前的囤货效应没有建模到特征里,预测结果在促销节点明显偏低。分析:需求预测的数据里,节假日和促销的影响往往提前几天显现。只看当天标记相当于把这个重要信号只发送给了模型一次,模型完全学不到峰值前后的相关性,这就是预测偏低的直接原因。对策:构造促销前窗口和促销后窗口特征,比如“促销前3天销量均值”“促销后3天销量均值”,以及“促销期间销量与平时销量的比值”。这三个特征能帮助模型理解促销的拉升和透支效应,落地时对峰值节点的预测准确率有相当显著的改善。5. 答题技巧:从预测到规划的一整套提分套路5.1 通用答题模板:四段式让面试官快速抓住你的逻辑面试官问“你做过需求预测与分仓规划吗”,只用四段式回答:业务理解、数据与特征、模型与方法、结果与验证。业务理解部分说清楚预测目标是什么、规划成本由什么构成、有哪些硬约束;数据与特征部分列明五大类特征并解释每个特征背后的业务含义;模型与方法部分说清楚用了哪些回归模型、如何做模型融合、规划问题用什么求解策略;结果与验证部分说明本地评分函数与线上指标如何对齐、预测分数的提升幅度、规划成本相对基准方案下降了多少。这套回答结构的好处是,每一个环节都是面试官接下来可能追问的方向,你能自然地把对话引到自己擅长的细节上。5.2 押题方向:如果重新赛一次,考点大概率还是这五个第一,时间序列特征构造。滞后阶数怎么选、窗口怎么定,这是预测题的永恒考点。第二,数据泄露的防范。用时间切分而不是随机切分,用历史数据去推未来而不是反过来。第三,模型融合的实操。不是简单地取平均,而是低相关模型加权融合或两层Stacking。第四,约束规划的建模。把业务约束写成数学形式,能用代码跑出可行解。第五,结果的解释与呈现。答辩或汇报时能把决策逻辑讲清楚。这五个方向覆盖了从数据处理到业务落地的完整链路,也是面试官判断一个候选人有没有真实项目经验的最有效维度。讲一个我自己的血泪经验:当年做这类赛题的时候,我在预测模型上花的时间占了八成,最后却因为规划部分的方案没有解释清楚,答辩时被连续追问了几轮,靠临时组织语言勉强撑过去。从那以后我每次做完预测,都强制自己走一遍“预测结果 → 分仓方案 → 成本对比 → 逻辑说明”的完整链路,哪怕时间再紧也不跳过规划这一步。做这类题,模型分数决定你进不进得了前二十,而规划方案的可解释性决定你能不能站稳前十。希望这份思路能帮你在下一次比赛或面试里少走几步弯路,把精力花在真正拉分的地方。本文还有配套的精品资源,点击获取
简介:面向天池“菜鸟-需求预测与分仓规划”赛题,这套资源为参赛者和供应链数据分析学习者提供了一份可复现的竞赛方案。方案覆盖需求预测与分仓规划两大核心模块,采用XGBoost、GBDT、随机森林、SVR等多种回归模型,并对不同分仓单独建模,以捕捉各仓库的销售动态;同时结合数据预处理、特征工程与模型融合,形成从数据清洗、特征构建到训练评估的完整链路。包内共68个文件,以58个Python脚本为主,辅以SQL特征脚本、CSV结果文件、R语言ARIMA实现和说明文档,脚本与数据分层存放,结构清晰,便于按模块对照学习;其中还包括数据生成、成本计算、特征筛选、多模型融合等关键环节的实现。资源包大小仅133KB,轻量易用。已有2339人学习下载,适合正在备战数据挖掘竞赛或研究供应链预测问题的读者,可直接基于赛题代码理解分仓建模、模型融合与仓储规划优化的实际做法,也能为自身项目提供参考模板。1. 某大数据竞赛需求预测与分仓规划赛题:你以为考预测,其实考的是决策拿到这道赛题的多数人,第一反应是去调回归模型。真正拉开分差的反而是后半程:预测值出来了,仓库怎么分、库存怎么摆、缺货怎么惩罚,这一套决策链路才是拿名次的关键。这道题名义上考需求预测,实际上考的是“预测 + 规划”的端到端能力,回归模型、模型融合只是入场券。适合三类人:正在备赛想要完整答题框架的选手、准备数据岗面试想拿项目经验说的求职者、以及想搞懂预测类赛题评判逻辑的学习者。下面按考点分布、高频考点、真题演练、易错点的顺序拆开讲。2. 高频考点:需求预测的回归建模与特征工程2.1 考点分布:预测准是入场券,特征决定下限这道赛题的评分通常由两部分构成:需求预测准确率和分仓规划方案的合理性。预测部分占比大约六到七成,规划部分占三到四成。别小看这百分之三四十的规划分,决赛圈选手的差距几乎都出在这里。预测部分的核心考点集中在特征工程、回归模型选型、时间序列处理、模型融合四块。规划部分的核心考点则是约束条件建模、分配策略、成本函数设计。从历届选手的经验看,特征工程才是预测分数的主要拉分点。很多人一上来就堆回归模型,却忽略了最基础的时间特征、品类特征和区域特征。某参赛者在赛后复盘时说的一句话很实在:“我用同样的模型,只改了特征,分数从百名开外进到前二十。”这说明什么问题?特征决定模型分数的下限,模型调参决定上限。面试官问这个赛题时,最想听的也是你对特征的分析逻辑,而不是你调了多少轮参数。2.2 回归模型选型与参数跑法需求预测本质上是回归问题。常用模型分三个梯队:第一梯队是线性回归、岭回归、Lasso,适合做基线;第二梯队是树模型,包括决策树、随机森林、梯度提升树,这类模型对特征缩放不敏感,是赛题主力;第三梯队是深度模型和时序模型,比如LSTM、Prophet,适合有强周期性的品类,但小数据集上容易过拟合。梯度提升树是这类赛题最稳的选择,原因有三:能处理缺失值、能捕捉非线性关系、训练速度可以接受。参数跑法上,建议先固定学习率,再调树的数量,然后调树的深度和最小样本数。一个常用的起手参数组合是:学习率0.05到0.1,树的数量300到500,最大深度5到7,最小叶子样本数50到100。注意,这个组合只适合中等数据量,如果你的训练集超过百万行,深度要降到4以下,树的数量也要相应减少。回归模型的效果评估,不要只盯着均方误差,还要看加权误差。赛题里不同品类的权重可能不同,你在验证时一定要按赛题给出的权重重新计算误差,否则本地验证和线上评分对不上,这是最常见的翻车现场。2.3 真题演练:需求预测回归题怎么答真题场景:给定某平台近一年的历史订单数据,包含订单日期、商品品类、发货区域、促销标记、节假日标记,要求预测未来某个时间窗口内各品类各区域的需求量。这类题的标准答题框架是四步走。第一步做数据探索,画出各品类需求的时间序列图,观察周期和趋势。第二步做特征工程,至少要构造日期特征、滞后特征、滑动窗口特征、促销特征、节假日特征这五类。第三步训练回归模型,用时间序列交叉验证而不是随机切分,避免数据泄露。第四步做模型融合,把树模型和线性模型的预测结果加权平均,或者用Stacking把多个模型的输出作为新特征再训练一层。面试官问你需求预测项目时,最常追问的是:“你怎么处理促销和节假日的影响?”这道题考的是你对突发因素的理解。通常这么答:先把促销标记和节假日标记作为特征送入模型,让模型自己学习它们对需求的拉升幅度;再单独构造促销前后对比特征,比如促销前一周的平均销量与促销期间的销量差值,用来捕捉促销的透支效应。这个答案能同时体现特征工程能力和业务理解。2.4 实战代码:构造时序特征与验证切分下面给出一段可以复用的特征构造核心代码,它能直接套用到多数需求预测场景。import pandas as pd import numpy as np def build_ts_features(df, target_col, lags=[1, 3, 7, 14, 28], roll_windows=[7, 14, 28]): # 排序保证滞后计算正确 df = df.sort_values(['region', 'category', 'date']).reset_index(drop=True) # 时间特征:年、月、星期、是否为月底 df['year'] = df['date'].dt.year df['month'] = df['date'].dt.month df['dayofweek'] = df['date'].dt.dayofweek df['is_month_end'] = df['date'].dt.is_month_end.astype(int) # 按区域+品类分组,分别构造滞后特征和滚动窗口特征 grouped = df.groupby(['region', 'category']) for lag in lags: df[f'lag_{lag}'] = grouped[target_col].shift(lag) for win in roll_windows: df[f'roll_mean_{win}'] = grouped[target_col].transform( lambda x: x.rolling(win, min_periods=1).mean()) df[f'roll_std_{win}'] = grouped[target_col].transform( lambda x: x.rolling(win, min_periods=1).std()) # 促销强度:过去7天促销标记之和 if 'promo_flag' in df.columns: df['promo_7d_sum'] = grouped['promo_flag'].transform( lambda x: x.rolling(7, min_periods=1).sum()) return df这是构造时序特征最常见的写法。关键点有三个:第一,分组键必须是region加category的组合,只按品类分组会忽略区域差异。第二,滞后天数的选择要结合业务周期,订单类数据通常有7天和28天两个明显周期,因此滞后7和滞后28是必加的。第三,滚动窗口的特征用transform而不是apply,原因在于transform能保持索引对齐,避免合并时错位。验证集的切分同样有讲究。不能随机切分,必须按时间顺序切。常见做法是把最后4到8周作为验证集,前面的全部作为训练集。如果有人对你提起“用前一段训练、后一段验证”的K折思路,那是一种变通做法,但要注意折与折之间要有间隔,行业里叫“gap”,用来消除相邻时间点的相关性影响。3. 高频考点:分仓规划中的分配策略与约束建模3.1 分仓规划的本质:把预测值变成可执行的分配方案拿到预测结果后,下一步是把每个区域的预测需求量分到不同的仓库。这一步考的不再是模型能力,而是约束求解能力。分仓规划的核心目标通常是在满足库存容量、运输成本、时效约束的前提下,最小化总成本,或者最大化订单满足率。很多选手在这一步的做法太随意,按历史占比一拆就完事。这样做的问题在于完全忽略了库存成本和缺货成本。正确做法是先明确优化目标函数,再列约束条件,最后用优化库求解或启发式方法逼近。面试官对这个环节最常说的一句话是:“你的方案在什么约束下成立?如果库存不足怎么办?”理解分仓规划,先建立一个直观印象:假设某区域未来一周预测需求1000件,可用仓库有三个,容量分别是600、800、1200,运输成本各不相同。你的任务不是把1000件平均分给三个仓,而是要让总运输成本最小,同时保证任何单个仓库不被压垮。这本质上是一个带约束的线性规划问题。线上评分系统会对你的分配结果计算一个综合成本,谁的方案总成本低,谁的规划分就高。3.2 约束条件与求解策略分仓规划的约束条件一般分三类。容量约束是最常见的,每个仓库的分配量不能超过其最大库存容量;满足率约束,分配到各仓库的总量要覆盖预测需求的一定比例,常见要求是至少95%;运输约束,某些区域只能由特定的几个仓库发货,这是硬约束,不能违反。求解策略根据数据规模分两种情况。数据量小时,直接用线性规划求解器,把目标函数和约束写成标准形式跑最优解。数据量大时,最优解求解时间过长,改用两阶段法:先用贪心策略做初始分配,再用局部搜索或模拟退火做迭代优化。很多拿高分选手的做法是:先跑一次线性规划拿到基准解,然后在基准解基础上调整,观察成本变化。这个“先基准解再微调”的思路,答题时说出来会让面试官觉得你有工程落地意识。3.3 真题演练:分仓规划题的回答框架和可复现代码真题场景:有三个仓库,容量分别为800、1000、1500,覆盖两个区域。区域A预测需求1300,区域B预测需求800。各仓库到各区域的单件运输成本如下表。仓库区域A单位成本区域B单位成本容量上限仓125800仓2341000仓3621500面试官问:你怎么分配?先答思路:这是一个典型的运输问题,目标是最小化总运输成本,约束是每个仓库出货量不超过容量,每个区域的接收量不低于需求量。然后给出线性规划的写法。import scipy.optimize as opt import numpy as np # 成本矩阵:行是仓库,列是区域 cost = np.array([ [2, 5], [3, 4], [6, 2] ]) # 决策变量展平:x0=仓1发区域A, x1=仓1发区域B, 依此类推 c = cost.flatten() # 约束: 每个仓库容量 cap = [800, 1000, 1500] A_ub = [] for i in range(3): row = [0] * 6 row[i * 2] = 1 row[i * 2 + 1] = 1 A_ub.append(row) b_ub = cap # 约束: 每个区域至少满足需求量 demand = [1300, 800] A_eq = [] for j in range(2): row = [0] * 6 row[j] = 1 row[j + 2] = 1 row[j + 4] = 1 A_eq.append(row) b_eq = demand # 求解 bounds = [(0, None) for _ in range(6)] res = opt.linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs') print(res.x.reshape(3, 2)) print(res.fun)这段代码把规划问题直接翻译成了线性规划的标准形式。A_ub矩阵的每一行表示一个容量约束,A_eq矩阵的每一行表示一个区域的需求约束。linprog的method='highs'是当前比较稳定的求解器。运行结果中,res.x.reshape(3, 2)就是把六个变量还原成分配矩阵,res.fun是最小总运输成本。参数方面要注意两点:当约束无法满足时,linprog会返回错误状态,此时需要放宽某个区域的满足率约束,或者允许仓库超容。实际操作中认知到这一点很重要,因为赛题给出的需求往往超出总容量,完全满足所有约束的情况很少见。4. 易错题/失分点:提交结果前最不该犯的五个错误4.1 用全量数据训练却不做时间切分典型错误:把全年的数据直接切分成训练集和测试集,随机打乱,结果验证分数极其漂亮,一提交却分数暴跌。分析:需求预测数据的时序性极强,随机打乱等于让模型用未来的信息预测过去,属于典型的数据泄露。这个问题在面试中被问到会让整段项目经历大打折扣。对策:任何特征构造和模型训练之前,先把时间切分方案定好。前80%的时间窗口作为训练集,最后的若干周作为验证集。构造滞后特征时,shift的步长必须大于等于预测窗口长度,否则模型会在特征中看到答案。4.2 预测指标和评估指标不一致典型错误:本地用均方误差调模型,线上的评分指标却是加权绝对百分比误差。自己调了半天自信满满,提交后的分数排在末尾却找不到原因。分析:需求预测赛题的评分指标往往不是单一指标,可能对高销量品类和低销量品类设置不同权重。如果本地验证和线上评分的口径不统一,你的所有调参工作都是无效做功。对策:读完赛题说明后,第一件事就是写一个和评分公式完全一致的本地验证函数。每一次改特征或调参数,都用这个函数去算分,而不是用模型默认的损失函数。4.3 只做预测不做规划的可解释性分析典型错误:预测部分做完就急着提交,完全不解释分仓方案为什么这样设计。分析:这道赛题的规划部分有明确的情景设定——线下答辩或提交报告时需要说明分配方案的逻辑。如果只给出一堆模型输出的数字,没有任何条理化的解释,评委无法判断你是会做规划还是单纯跑通了流程。对策:每次提交规划结果前,附加一段分配逻辑说明,包括哪些约束优先、成本权衡是怎么做的、如果需求突变有什么预案。这份说明本身就是拿分项。4.4 模型融合只融合分数不融合特征典型错误:把三个模型的预测结果取平均当作模型融合,线上分数提升有限,还在纠结有什么玄学原因。分析:模型融合有两个层次。浅层融合是预测结果加权平均,效果取决于模型之间的相关性,低相关模型融合才有增益。深层融合是把不同模型的特征重要性做整合,比如线性模型对线性趋势敏感,树模型对非线性交互敏感,两者融合的收益明显更大。对策:尝试两层融合方案。第一层用不同特征子集训练多个树模型;第二层把树模型的输出作为特征,再训练一个线性模型。这种结构能兼顾线性与非线性,比单纯取平均更具实战提升效果。4.5 忽略节假日和促销的延迟效应典型错误:促销标记只保留当天,节假日前的囤货效应没有建模到特征里,预测结果在促销节点明显偏低。分析:需求预测的数据里,节假日和促销的影响往往提前几天显现。只看当天标记相当于把这个重要信号只发送给了模型一次,模型完全学不到峰值前后的相关性,这就是预测偏低的直接原因。对策:构造促销前窗口和促销后窗口特征,比如“促销前3天销量均值”“促销后3天销量均值”,以及“促销期间销量与平时销量的比值”。这三个特征能帮助模型理解促销的拉升和透支效应,落地时对峰值节点的预测准确率有相当显著的改善。5. 答题技巧:从预测到规划的一整套提分套路5.1 通用答题模板:四段式让面试官快速抓住你的逻辑面试官问“你做过需求预测与分仓规划吗”,只用四段式回答:业务理解、数据与特征、模型与方法、结果与验证。业务理解部分说清楚预测目标是什么、规划成本由什么构成、有哪些硬约束;数据与特征部分列明五大类特征并解释每个特征背后的业务含义;模型与方法部分说清楚用了哪些回归模型、如何做模型融合、规划问题用什么求解策略;结果与验证部分说明本地评分函数与线上指标如何对齐、预测分数的提升幅度、规划成本相对基准方案下降了多少。这套回答结构的好处是,每一个环节都是面试官接下来可能追问的方向,你能自然地把对话引到自己擅长的细节上。5.2 押题方向:如果重新赛一次,考点大概率还是这五个第一,时间序列特征构造。滞后阶数怎么选、窗口怎么定,这是预测题的永恒考点。第二,数据泄露的防范。用时间切分而不是随机切分,用历史数据去推未来而不是反过来。第三,模型融合的实操。不是简单地取平均,而是低相关模型加权融合或两层Stacking。第四,约束规划的建模。把业务约束写成数学形式,能用代码跑出可行解。第五,结果的解释与呈现。答辩或汇报时能把决策逻辑讲清楚。这五个方向覆盖了从数据处理到业务落地的完整链路,也是面试官判断一个候选人有没有真实项目经验的最有效维度。讲一个我自己的血泪经验:当年做这类赛题的时候,我在预测模型上花的时间占了八成,最后却因为规划部分的方案没有解释清楚,答辩时被连续追问了几轮,靠临时组织语言勉强撑过去。从那以后我每次做完预测,都强制自己走一遍“预测结果 → 分仓方案 → 成本对比 → 逻辑说明”的完整链路,哪怕时间再紧也不跳过规划这一步。做这类题,模型分数决定你进不进得了前二十,而规划方案的可解释性决定你能不能站稳前十。希望这份思路能帮你在下一次比赛或面试里少走几步弯路,把精力花在真正拉分的地方。本文还有配套的精品资源,点击获取