那是一段做特征标准化的代码。
为了让不同量纲的数据能在一个尺度下训练,它把训练集和测试集直接合并成了一个大表。
然后,它计算了这个大表里每个特征的全局均值和全局标准差。
最后,它用这个包含了所有未来数据的全局统计量,去对整个数据集进行了放缩。
在很多网上的开源教程或者新手的数据分析作业里,这种写法非常常见。
但如果在普通的不强调时间顺序的机器学习比赛,比如识别猫狗图片里,这叫数据泄漏。
但在量化金融这种时间串行数据里,它远比普通泄漏更糟。
因为时间的前后因果顺序,本身就是这个系统的物理定律。
你不能用明天的最高温和最低温,来重新定义今天温度计刻度的零点。
如果你这么做了,今天的数据里就不可避免地夹杂了对未来的预知。
江临没有立刻在日志里下定论。
科学精神要求证据,而不是拍脑袋的直觉。
他立刻新建了一个短小精悍的验证脚本。
他做了两组对照——一组照搬Baseline的合并逻辑,一组严格遵守时间因果律只用历史窗口。
脚本一秒钟跑完,江临调出折线图。
结果非常清淅。
在发生了剧烈价格波动的测试窗口期,第一组由于预先看见了这些剧烈波动,使得标准化后的异常量值被显著地压低了。
换句话说,官方提供的这个Baseline,正在潜移默化地把未来信息揉进最初的预处理步骤里。
它象一个被下了蒙汗药的警报器,让一部分本该极其刺眼的异常量据,看起来显得没那么异常了。
这不是什么参赛者恶意查找代码漏洞作弊,这更象是平台技术人员在赶工时犯下的一个愚蠢的工程疏忽。
这个疏忽,足够让公开排行榜的一部分分数失去参考意义。
至少,那些沿用官方baseline预处理流程的方案,已经不再干净。
江临看着屏幕上两条劈叉的折线,脑海中忽然响起了白天在江大A301教室里,赵明远教授敲着黑板说的那句话。
“一个近似方法最危险的时候,不是它算出来的误差有多大。而是它赖以成立的前提本身已经崩掉了,而你却还在浑然不觉地照常使用它。“
Baseline现在的处境就是如此。
不是模型跑出来的精度不够高,而是它在预处理的第一步,就已经从物理根基上破坏了时间串行的因果律法则。
凌晨三点十一分,夜深人静,整座城市都沉睡了。
江临在日志本的最后,敲下一行字。
【异常类型E:Baseline 存在系统级未来信息泄漏。】
【注:此现象绝不是参赛选手应该用来刷分的漏洞,因为用它训练出的模型在现实中只有死路一条。它或许是一个应当直接向平台方提交审查的赛题本身的安全级缺陷。】
接下来的两天里,江临几乎没有离开过自己的房间太久。
除了一日三餐母亲会准时敲门叫他吃饭,偶尔切点水果端进来放桌上,剩下的时间,他象一尊雕塑一样焊死在了计算机屏幕前。
期间,班主任老刘实在放心不下,给他打了个电话。
得知他宅在家里,也就放心了。
这两天里,江临把所有的时间,像切片一样精准地分配在了三件最基础也最枯燥的事情上。
创建严苛的交易时段物理约束体系,构建底层字段间的逻辑一致性网络,创建全方位的数据缺失机制分类词典。
他把这些所有的审计规则,全部封装成了可以独立开关的模块。
就象一套精密运转的机床,每一条数据流过,经历了哪一刀切削,触发了哪一条警报,全部都被详细地记录在日志里。
每一个最终输出的异常标签,都能顺藤摸瓜,一路回溯到它最初被触发的根本物理原因。。
平台背后的服务器转了几圈,自动评分结果很快就刷新在了页面上。。。
江临看着那个稳稳停在中间的排名,点开排行榜前几名的公开提交说明。
为了拿奖,选手需要在说明里简述思路。
这些文本写得极其漂亮,充满了前沿学术的既视感。
什么基于孤立森林与LightGBM的集成异常检测框架,什么使用了LSTM-AutoEncoder自动编码器进行无监督时序异常识别……
在某位目前排在第二名的选手的说明里,江临甚至看到了这样一句话:“本方案构建了一个具有深层表达能力的复杂网