我们亲手证伪了自己的"96.6% 准确率"
一份为跨境贸易场景做的农产品价格预测方案,写着平均误差仅 3.4%、相关系数 0.98。漂亮得可以直接去卖。问题是——这份方案是我们自己做的,而我们决定在卖它之前,先亲手杀一遍。这是完整过程,包括所有难看的数字。
第一刀:那个 3.4% 是怎么来的
翻回方案里看口径:预测目标是年度均价,样本只有 5 个数据点(五年,每年一个数)。5 个点上算出来的相关系数 0.98,统计上几乎没有意义——特征数比样本还多,模型是把答案背下来了,不是学会了。
第二刀:用真数据重建,被最笨的办法打败
我们拿真实公开数据重来:海关月度进口量价 101 条、两个主产国产区日度气象 1.9 万条,月度建模、前向滚动验证(只用过去预测未来,杜绝"偷看")。结果:模型平均误差 8.84%——听着还行?但"直接抄去年同月的价格"这个零成本笨办法,误差只有 7.52%。我们的模型输给了它。更难看的:涨跌方向准确率 48.5%,和掷硬币一样。
第三刀:链条"断了",先别急着宣判
我们把预测链拆成两段分别验证:气象→到港量成立(大变动方向 76.7% 正确,统计显著);但到港量→价格看起来断了(相关性极弱)。差点就此结案——直到把参数拆开重看:原回归漏了时间趋势(这几年价格整体上行,解释力全丢进了残差),且把两个产地的价格混在一起被结构污染。修正后链条是通的:解释力从 0.184 跳到 0.696。
第四刀:自查出一个数据泄漏,数字全线变差
做提前量测试时发现一个隐蔽错误:训练窗口的末端目标值落在了预测时点之后——模型间接"看到了未来"。修正后所有数字变差(提前三个月的误差从 8.3% 恶化到 10.3%)。我们发布的是修正后的差数字,不是修正前的好数字。
还有更疼的一刀:把基线自己的方向准确率拆出来看——"抄去年同月"在提前三个月时方向正确率自己就有 90%+。也就是说,"我们能提前三个月判断涨跌"这个本来最性感的卖点,不成立——翻日历就能做到的事,不能算模型的功劳。模型真正的增量在幅度:误差比经验判断低约四成,折算到单个货柜是五位数美元的差别。
结局:废墟里挖出来的才是能卖的
证伪完,剩下的东西反而站得住了:一份"可承诺清单"——每个提前量给修正后的真实误差和置信区间,明确写"方向判断价值有限,幅度判断是真增量",附上和两条笨基线的完整对比。诚实的 7.7% 比虚假的 3.4% 值钱——因为前者敢写进合同。