推荐系统上线3个月后准确率掉了8%,我查了三天代码才发现不是模型的锅 📅 发布时间:2026/9/7 1:11:41 👁 浏览次数: 推荐系统上线3个月后准确率掉了8%,我查了三天代码才发现不是模型的锅上周一早上,产品经理把一张截图甩到群里:我们那个做了半年多的推荐系统,线上点击率从月初的8.2%一路滑到4.7%,折线图像踩了一脚急刹车。我第一反应是上周发版动过的模型权重文件有问题,立刻回滚了版本,又把那几条特征工程管道重新跑了一遍校验,甚至翻出上线前的混淆矩阵看了又看--什么都没变,指标依然趴在谷底。那个时候我还没意识到,罪魁祸首根本不是代码,而是悄悄发生的数据漂移。这件事后来让我老老实实坐下来把机器学习基础重新补了一遍,才真正搞懂怎么用 PSI、KS 检验做分布监控。如果你也维护着一个线上推荐系统,下面这段翻车经历值得花几分钟看看。线上指标雪崩,我却在 code diff 里找答案回滚之后没任何起色,我开始怀疑是不是上游特征表被人误改了。那套特征存储里存着用户近30天行为统计、物品曝光频率、交叉特征等三十多个字段,平时靠定时任务每天凌晨写入。我拉出近七天的特征分布快照,用肉眼比对平均值和中位数,没看出明显异常--但这种肉眼比较在数据量过亿的推荐系统面前基本是自欺欺人。我当时根本不知道需要计算群体稳定性指标(PSI),也不懂怎么用 KS 检验判断特征分布是否发生了系统性偏移。这些都是后来在机器学习基础课里才弄明白的。折腾到第二天下午,我临时写了个脚本把线上请求时的特征向量 dump 下来,与训练集的特征分布做了几个维度的对比:# 当时只能粗糙地比对均值,根本没算分布相似度 import pandas as pd online_df pd.read_parquet(online_features.parquet) train_df pd.read_parquet(train_features.parquet) for col in [user_click_7d, item_ctr, user_item_cross]: print(f{col} train mean: {train_df[col].mean():.4f}, online mean: {online_df[col].mean():.4f})打出来的数字有点变化,但究竟变到什么程度才需要拉警报?我心里完全没谱。这直接导致我多查了一天半的代码,却连问题的边都没摸到。不是代码的锅,是分布变了第三天中午,我翻训练日志时突然注意到一个细节:推荐系统最近一个月的训练数据里,新注册用户占比从之前的18%蹿到了34%。这帮新用户的行为模式和老用户明显不同--他们的点击更分散、对热门物品的偏好更弱,而我们模型里那组用户历史热度敏感度的特征还是按旧分布学出来的权重。其实这就叫数据漂移,而且是典型的协变量偏移。线上特征分布悄悄改变,模型却还拿着旧时代的地图在新地盘上导航,预测自然越来越偏。我当时如果能早点掌握机器学习基础里讲的分布检测方法,根本不用瞎折腾三天。知道方向后,我立刻在 AWS 控制台开了 SageMaker Model Monitor,想用它的数据质量监控功能自动捕获这种偏移。但打开配置页面才发现,我对怎么设置基线数据集、怎么定义偏移阈值毫无概念--连 PSI 该设 0.1 还是 0.25 都说不清。我为什么回过头来选了机器学习基础这门课那天晚上我搜了不少关于数据漂移的博客,发现大部分文章要么只给公式不教怎么用,要么没讲清楚监控怎么落到推荐系统里。后来在亚马逊云科技的培训页面看到机器学习基础,课程大纲正好覆盖了我当时最缺的三块:机器学习管道:从数据采集、数据预处理到特征工程、模型评估的完整流程,让我知道怎么把分布监控嵌进管道而不是事后救火;数据漂移与模型衰减的检测方法:PSI、KS 检验、目标分布变化检测,而且有具体的阈值建议和实验案例;AWS 上怎么做模型监控:包括怎么用 SageMaker 的内置功能自动计算偏移指标并产生告警。这门机器学习基础不是那种只讲算法的课,它更像一张地图,告诉你一个工业级推荐系统从数据到模型再到监控,每个环节该做什么、常见坑在哪。我花了差不多一周的晚上把课程里的实验和案例跑了一遍。学完之后最大的变化就是:以前我面对线上推荐系统的指标波动,只能凭经验和直觉排查,现在我知道拿分布数据说话,能在一小时内定位到是不是数据漂移惹的祸。用 PSI 和 KS 检验锁定漂移,一小时内止血学完机器学习基础第二天,我就对那三十多个特征跑了一遍 PSI 计算。代码其实不复杂,关键是怎么解释结果:import numpy as np def calculate_psi(expected, actual, bins10): 计算群体稳定性指标,值超过0.25说明分布发生显著变化 expected_percents np.histogram(expected, binsbins, densityTrue)[0] actual_percents np.histogram(actual, binsbins, densityTrue)[0] # 避免除零 expected_percents np.where(expected_percents 0, 1e-6, expected_percents) actual_percents np.where(actual_percents 0, 1e-6, actual_percents) psi_values (actual_percents - expected_percents) * np.log(actual_percents / expected_percents) return np.sum(psi_values) psi_scores {} for col in feature_columns: psi_scores[col] calculate_psi( train_df[col].values, online_df[col].values ) if psi_scores[col] 0.25: print(fALERT: {col} PSI{psi_scores[col]:.3f})结果让我当场出了一身冷汗:user_click_7d的 PSI 高达 0.43,item_ctr也到了 0.31。这两个特征正好是推荐系统里权重最高的那批,一漂移整个模型的预估逻辑就全歪了。接着我又用 KS 检验确认了这两个特征的分布确实与训练集有显著差异(p 值远小于 0.01)。到这一步,根因才算被钉死:模型没毛病,是数据世界变了,而我们没跟着变。把监控嵌进推荐系统管道,别再凭直觉救火定位到问题后,我按照机器学习基础课里教的思路,在推荐系统的模型管道里加了三道防线:离线基线监控:每周对核心特征计算 PSI,阈值设 0.2,超过自动触发邮件告警;在线实时采样:通过 SageMaker Model Monitor 每5分钟采样线上推理请求的特征分布,与训练集基线对比,偏差超过阈值自动推送通知;自动再训练触发:当任意关键特征 PSI 连续两次检查超限,或者模型 AUC 在验证集上下降超过 5%,自动拉起一条新的训练管道,用近30天的数据重新做特征工程和模型训练。下面这段配置代码是从课程实验里改出来的,用来定义 Model Monitor 的基线约束:{ version: 1.0, features: [ { name: user_click_7d, constraints: { data_type: Float, completeness: 0.98, distribution: { psi: { threshold: 0.25 } } } }, { name: item_ctr, constraints: { data_type: Float, completeness: 0.98, distribution: { psi: { threshold: 0.25 } } } } ] }这套方案上线后,推荐系统又平稳运行了两个多月。中间触发过一次数据漂移告警,是市场部门搞了波拉新活动导致新用户短期暴涨,管道自动切到再训练,线上的点击率没再出现超过2%的骤降。如果你问我现在回头看,当初最应该早点投资的学习资源是什么,我会毫不犹豫地说:先把机器学习基础啃下来,尤其是管道和监控那部分。对于做线上推荐系统的工程师来说,不掌握数据漂移的检测和应对,就等于把模型扔进海啸里还指望它稳如陆地。这门课里讲的 AWS 基础知识、特征工程、数据预处理和机器学习管道,正好能帮你把模型从实验室搬进生产环境的最后一公里给补上。而且像深度学习入门和亚马逊云科技机器学习这些课程,等你把基础打牢之后再去学,效果完全不一样--你能立刻把分布式训练、模型压缩这些东西嵌进已有的监控体系里,而不是孤立地学一堆算法。另外提一句,我后来学深度学习入门时用 Amazon CodeWhisperer 辅助写 PyTorch 的训练脚本,那些分布监控的代码逻辑已经刻在肌肉记忆里,效率比之前高了不止一倍。但这一切的前提,都是因为机器学习基础让我先搞懂了数据在线上会怎么变。给同样维护推荐系统的工程师几条可执行建议别等指标暴跌才查分布:把核心特征的 PSI 监测作为推荐系统的日常体检项目,花一个下午写好脚本,接下来半年都能安心睡觉。阈值别凭感觉设:PSI0.25 表示显著变化,0.1~0.25 是轻微偏移,这些规则在机器学习基础里都有实验数据支撑,值得点进去核对一下具体案例。把数据漂移和模型再训练串联起来:监控发现漂移只是第一步,更关键的是触发流程要自动化,否则半夜告警你还得爬起来手动操作。学完一门系统课再动手:我踩过的坑证明,零散看博客很难拼出一套工业级推荐系统的监控方案,集中把机器学习基础这样的课程从头到尾刷一遍,省下的排查时间是课时费的几十倍。不要忽略 AWS 基础知识:推荐系统涉及数据存储、特征存储和模型部署的权限,搞不清楚这些基础,监控管道一上线就可能因为 IAM 角色配置错误而崩掉。把混淆矩阵的解读纳入监控:线上推荐系统的预测偏差不能只看点击率,要定期看混淆矩阵里各类别的召回变化,防止某一类物品被系统性压死。别把深度学习当万能药:即使你用上了深度学习入门里学的 Transformer 做序列推荐,底层的数据漂移照样能把它拖垮,先守住机器学习基础这道闸门比什么都重要。