测试期的 Temperature 填什么
预测期是 07/2025 到 12/2025,brief 给了两条条件:这 6 个月的 Intervention 等于 1;Temperature 和 EconomicIndex 不提供,模型用到的话要自己先预测(must be forecast if needed)。
回归模型里放了 Temperature,交上去的 6 个预测值就得用预测出来的温度。月度温度基本跟着月份走,能拿来预测它的通常是历年同月平均,这样预测出的温度和月份虚拟变量带的信息几乎重合。温度里额外的那部分是「比往年同月偏热或偏冷」,用同月平均预测温度时,这部分在预测期等于 0。
比较模型时,常见的切法是用到 2024 年 12 月的数据训练,在 2025 年 1 月到 6 月上算 MAPE。这 6 个月的真实温度就在数据里,直接代入算出的是事后预测(ex post forecast)的误差。模型用上了交预测时拿不到的信息,含温度的回归会显得比实际准,几个模型的排名也可能因此变化。
这份 guide 的示例数据(一组月度用电需求)里,只放 Intervention 的回归在测试期的 MAPE 是 3.7350%。加入温度偏离以后,代入真实温度算出 2.9720%;先预测温度再代入,也就是事前预测(ex ante forecast),是 3.7597%,比不加温度还略高。同一份数据里温度偏离的系数 p 值小于 0.0001,在样本内显著,对 6 个月的事前预测没有帮助。
测试期也按交预测时的条件处理:Temperature 用训练集的同月平均预测,EconomicIndex 用漂移法之类先预测,再代入回归,拿这个 MAPE 和分解模型、Holt-Winters 比。EconomicIndex 还可以改用滞后 6 个月以上的值,预测 2025 年 7 月到 12 月只需要 1 月到 6 月的数,数据里已经有;用这种写法时,报告里要说明经济状况为什么半年后才影响需求。
Intervention 从哪个月开始等于 1
预测期 6 个月的 Intervention 都等于 1。各组数据不同,拿到本组数据后把 Intervention 画在 Demand 时序图下方,读出它从哪个月开始等于 1、之后是否一直是 1。从某个月起一直为 1,就是 Week 4 讲的阶梯变量(step variable),回归里它的系数是控制趋势和季节以后,干预前后需求水平的差,6 个预测月都会加上这一块。这个系数估偏了,6 个月的预测会往同一个方向偏,每个月的百分比误差里都带着这一块。
分解模型、指数平滑模型和时间序列回归是 brief 要求必做的三类模型,它们处理这次跳变的方式各不相同。回归可以直接放入阶梯变量。Holt-Winters 不接受解释变量,只能靠水平方程在跳变之后一个月一个月追上新水平。经典分解的 2×12 中心化移动平均会把跳变抹成前后各约 6 个月的斜坡,这段时间的去趋势值和季节指数都会受影响;跳变明显时,可以在季节调整后的序列上做带阶梯项的趋势回归,用它完成分解模型的预测。报告比较三类模型时,这次跳变怎么处理是值得写清楚的差别。
起始月份还决定测试集怎么切。它落在 2025 年 1 月到 6 月时,训练到 2024 年 12 月的数据里 Intervention 全是 0,回归估不出干预效应,测试期的比较也就失真。这时训练集要延伸到起始月之后几个月,剩下的检验月份少于 6 个,报告里交代为什么这样切、检验结果因此有多大局限。起始月在 2024 年中后期、训练集里只有几个月等于 1 时,干预系数估得不稳,也要写进预测风险。
marker 先运行 notebook
Group_xxx_implementation.ipynb 交上去以后,marker 会先运行它。文件顺利跑完并生成预测值,才用 6 个真实值算 MAPE,再看实现是否恰当、清楚。跑不起来或没生成预测值时,只按代码是否恰当给一部分,Python 这一块 10 分的上限降到 5 分,准确度对应的那部分全部失去。
数据文件和 Python 文件按 brief 的假设放在同一个文件夹,读数据只写文件名,不写自己电脑上的完整路径。用到随机数的步骤要固定随机种子,例如 np.random.seed(0)。提交前新建一个空文件夹,只放 notebook 和本组数据文件,重启 kernel 后 Run All,确认生成的 Group_xxx_forecast.csv 是 6 行,数字和报告里的预测表一致。






