前几天整理硬盘,翻出2020年写的电信用户流失预警模型。当时我用XGBoost堆了二十多个特征,花一周调参,AUC终于刷到0.91。结果上线第一周,业务方就来找我:你们预测会流失的高价值用户,实际一个都没走,倒是那些被标记为“安全”的低价值沉默用户,悄悄停了机。后来查SQL才发现,运营给的标签定义里,把三个月内登录过的用户全部算了“已流失”——因为那个同学写代码时把活动时间窗口填反了。这根本不是算法能兜住的问题,我那一周的调参就像给漏水的桶换了个更亮的漆。
第二个项目更有意思,是在做电商用户复购预测时。我用的是从某第三方采集的点击日志,时间戳看着非常规整,但可视化之后发现凌晨2点到5点的访问量飙高到不合理的程度。一开始以为是夜间营销活动,结果发现,是采集端服务器时区没设对,把UTC时间当成北京时间存了。由于绝大多数真实购买行为集中在白天,我只要简单把凌晨的数据剔除,模型AUC就能从0.72跳到0.83。有时候我们以为在做特征工程,实际上不过在做“时区修复工程”。这也让我突然明白,网上那些公开竞赛的干净数据集把大家宠坏了——真实的数据挖掘,一半时间是在对付“电子垃圾”。
现在AutoML工具越来越多,很多人觉得只要把csv丢进去,它就能自动做特征选择、超参搜索。但在我接触的项目里,自动化的前提是数据已经被“驯化”到可以入锅的状态。拿去年做的一个线下门店客流预测项目来说,我们需要把摄像头抓拍数、POS机交易笔数和天气数据对齐。结果发现摄像头计数会因为店面灯光调整而产生明显漂移,而POS机的交易时间戳跟客流量高峰总是存在20分钟时延。AutoML根本不知道这些业务背景,它会傻乎乎地把这两个序列放进同一个时间窗口,然后告诉你“灯光亮度是销售额的强预测因子”。这种结论放在论文里看起来震惊,放在业务里就是个笑话。
我逐渐形成了一种看法:数据挖掘这个行业的核心竞争力,已经从“模型炫技”转移到了“偏见挖掘”上。我们需要找到的不是最复杂的模型,而是最明显的系统性错误。比如训练集中如果大部分样本来自App端用户,那么你训练出来的模型天然会歧视小程序端用户,可业务恰恰要靠小程序做下沉市场;如果只拿最近三个月的订单做预测,你永远学不会“双十一”那种爆发式特征。优秀的分析师不是在调参,而是在反复质疑“这份数据到底是怎么被生产出来的”,就像考古学家一样,每一层土壤都可能是前人的垃圾堆。所谓挖掘,挖的是掺杂着未知错误、采样偏差和业务短视的真实讯号,而不是在干净数据集上跑个堆叠模型。
这阵子我重新把以前跑过的一个案件再复盘了一遍:同样一份客户流失数据,把数据清洗时规范掉的时间错位修正后,即使只用逻辑回归,效果也比之前XGBoost调参版本要好。这并非说算法不重要,而是提醒我们,深度学习对数据中的异常模式非常敏感,它会疯狂学习你无意间埋下的错误,然后让预测结果看起来很酷,却没有丝毫落地价值。真实业务里,数据质量差的代价远比模型选择大得多。如果有一天有人跟你说他做了个精准到99%的数据挖掘模型,我第一反应会问他:那你的验证集是不是跟训练集泄露了同一个bug?
如果你正在做数据挖掘,不妨刻意训练自己“怀疑”的能力。拿到一张表,先别急着一键读入,去看几个字段的分布、查找极端值为什么存在、找业务同事核对定义。这个过程很难被自动化替代,因为它需要人对物理世界有基本常识。AutoML能替你跑一千次迭代,但替不了你问一句:“为什么周五下午三点的退货率会突然升高?”——答案是仓库那条传送带每周五都会卡住。这就是数据挖掘最迷人的地方:你以为在找规律,实际在找事故。