不要上来就挑模型
很多刚接触机器学习的人,上手的第一件事往往是选模型。
线性回归、随机森林、XGBoost,接着听说 LightGBM 表现更好,于是打开教程,复制代码,导入数据,训练,看一眼准确率,感觉整个流程跑通了。
看见屏幕上的数字,忍不住觉得已经跨过了门槛。(忍不住轻哼起来)
等到换一批真实数据再试,模型却经常一塌糊涂。
这样的过程在机器学习圈子里反复出现。
像刚拿到驾照的人,还顾不上熟悉路况,就已经在研究怎么调校悬架和轮胎。油门踩得果断,弯道却冲了出去。别人问为什么撞墙,回答常常是动力不够。
问题多半不在动力上。
问题主要在于,你连路况都没有仔细看过。
机器学习最容易让人误解的地方就在这里。局外人关注模型,入门者盯着算法,而有经验的人往往先回头看数据。
模型当然重要,算法也重要,可一切的源头是数据。
IBM 在讨论 AI 数据质量时也指出,质量不高、有偏斜或不完整的数据,会让模型输出不可靠的结果,再复杂的模型架构也弥补不了。
用一句更直白的话说,垃圾进,垃圾出,模型没有义务替存在问题的数据兜底。
所以这一篇暂时不谈公式,不谈梯度,不谈参数,也不碰那些一听就容易让人紧张的名词。
先谈一件更基础,也更容易被忽略的事。
在机器学习之前,先学会看数据。
它不涉及大模型,不谈智能体,不聊多模态,不提端到端,也说不上什么涌现。可真正做过项目的人都明白,一个机器学习系统能不能跑起来,能不能稳定地跑下去,能不能在真实环境里站住脚,往往从打开数据表的那一刻就已经决定了。
数据没看明白,后面全是连环债务陷阱。
数据不是素材库,是模型看世界的窗口
机器学习到底在学什么?
很多教材会说,机器学习是让计算机从数据里发现规律,并用这些规律对未知样本做预测。
这个答案很标准,也容易一听就过去了。
换个更通俗一点的说法:模型没有眼睛,看不见真实世界。它也不知道房价、天气、疾病、信用、用户兴趣或网络攻击这些东西原本意味着什么。
它能接触的全部世界,就是你送给它的数据。
你给了什么字段,它就从这些字段里寻找关系;你给了什么标签,它就努力朝那个方向拟合;你给了什么样本,它就把这些样本当作经验。
因此,模型眼中的世界,永远是一个经过数据加工之后的世界。
这有点像一个人完全靠餐厅评价来认识一座城市。
他当然能总结出一些规律,比如哪家店容易踩雷,哪家包装讲究,哪家深夜还在营业。但他看到的只是评价里的城市,而不是完整、真实的城市。
评价本身会有偏差,样本量可能不足,平台会筛选,用户会夸张,店家也可能刷分。最后拼凑出的城市画像或许有用,也可能偏得离谱。
模型也一样。
你想预测用户是否流失,但只给了它注册时间和性别,它能做出的判断不会太好。因为真正驱动流失的因素,可能藏在最近登录频率、核心功能使用情况、投诉记录、付费变化、客服响应里。
你想判断交易是否异常,手里却没有设备指纹、地理位置、消费习惯、交易时段、金额波动等字段,那模型就像一个保安,只拿着一张模糊的门厅照片,就要判定访客风险。
不是不能做,是做出来的结果多半不太靠谱。
你想做网络流量异常检测,却只统计了总流量大小,不看端口、协议、连接频次、包间隔、请求方向和历史基线,那模型最多能抓住最显眼的异常。
稍加伪装的攻击,很可能就被当成正常波动漏过去。
报告上写检测能力出色,真实环境里让人捏一把汗。
所以,数据不是往模型嘴里一倒就完事的素材库。
数据,是模型视野的边界。
数据里没有的信息,模型通常猜不出来。数据里被扭曲的信息,模型会认真学习。数据里夹带的偏见,模型甚至可能打包成高置信度的判断。
这正是机器学习让人期待又头疼的地方:它既能从数据中发现规律,也会从数据里继承问题。
样本、特征、标签:三个基础概念
要看数据,先得清楚自己在看什么。
机器学习里有三个最基本的概念:样本、特征、标签。
样本,就是一条观察记录。一个用户、一封邮件、一笔交易、一次设备一天的运行日志,都可以成为一个样本。它是模型学习的基本单位。
特征,是用来描述样本的信息。年龄、最近登录时间、购买次数、平均消费金额、邮件标题用词、图片像素、交易地点、连接持续时间……这些都可以成为特征。特征决定了模型可以从哪些角度去观察样本。
标签,是你希望模型学会预测的答案。用户是否流失、邮件是不是垃圾邮件、图片是不是猫、交易是否欺诈、设备是否故障、明天的销量是多少,这些都可以是标签。在监督学习里,有输入就有标准答案,模型通过不断对比自己预测的答案和真实答案来修正自身。
拿经典的鸢尾花数据集来说,UCI 机器学习库中的 Iris 数据集包含 150 个样本,4 个特征,3 个类别,每个类别 50 个样本,是很早就被广泛使用的分类数据集。
这里每一朵花就是一个样本,花萼长度、花萼宽度、花瓣长度、花瓣宽度是特征,鸢尾花的种类是标签。
这个数据集很小,也很干净,非常适合入门。它像驾校里摆好的桩桶,路线清晰,障碍明确,适合练手。
可真实项目里的数据通常没有这么好搞,大多是杂乱无章的。
举个例子,真实业务数据经常长这样:
字段名不统一,单位不统一,时间格式不统一,同一个用户有多个 ID,某些字段大量缺失,某些值明显离谱。
地区一栏,一会儿写“广东”,一会儿写“广东省”,一会儿是“Guangdong”,有时中间还夹着空格。
金额字段出现负数,年龄字段出现 999,订单时间晚于退款时间,设备上线时间早于出厂日期。
一旦面对这种状况,你就会发现,机器学习里“机器”两个字很先进,“学习”两个字很体面,而夹在中间最折腾人的,反倒是数据表里那些既像手滑、又像系统迁移事故的字段。
你以为自己在做人工智能。
实际上,你更像在给数据做心理疏导,这你得先让数据舒服了才能往后走。
标签定义:机器学习的第一场硬仗
很多人看数据时会仔细检查特征,却容易忽略标签。
这是相当危险的。
标签是模型学习的目标。
标签定义乱了,模型学得越卖力,偏得越离谱。你不能一边把答案写错,一边指望学生考出真实水平。万一学生真的考了高分,反倒更让人不放心。
举一个例子,你要做用户流失预测。
什么叫“流失”?
7 天没登录算不算?
30 天没登录算不算?
卸载 App 算不算?
取消订阅算不算?
还在登录但不再付费算不算?
只看内容不互动算不算?
每一种定义都会生成不同的标签,也会训练出完全不同的模型。
在游戏场景里,7 天未登录可能已经非常危险;放在低频的政务系统里,30 天未登录也许再正常不过。不能把所有业务都套进同一个流失定义,然后指望模型自动理解背后的行业语境。模型没有参与需求讨论,它不知道你心里的那套潜台词。
再看金融风控。
什么叫“坏客户”?
逾期 1 天算不算?
逾期 30 天算不算?
逾期 90 天呢?
展期后按时还上呢?
历史上有过逾期但现在一直很稳定呢?
不同定义会直接影响标签分布,也会影响模型的风险偏好。
标签定义的本质,是把现实世界复杂的业务行为,压缩成模型可以学习的目标。压缩就一定会损失信息,关键在于损失是否可控,是否符合业务诉求。
很多模型上线后效果不稳定,不一定是因为算法差。
很可能是最初标签就没定清楚。
业务方说要识别高价值用户,数据方理解为消费金额高,运营方理解为复购潜力高,产品方理解为活跃度高,老板理解成能带来长期增长。
几种理解搅在一起,模型也只能在这锅“乱炖”里去学习。
这时不要去怪模型。模型只是忠实地继承了人类开会没对齐的那些问题。
数据清洗:智能时代的家务活
数据清洗听起来很缺乏技术含量。
缺失值补一下,重复值删一下,异常值处理一下,格式统一一下,字段改个名——像是数据行业里的家务活。
既没有论文光环,也没有发布会的掌声,更不方便截图发朋友圈。
但这一步一旦马虎,后面整条线都会跟着遭罪。
缺失值很常见。有的单元格为空,可能是因为用户没填,也可能是系统没采集,或者是采集了但没成功,甚至可能业务流程根本没走到那一步。不同原因对应不同处理方式。简单填个均值,有时管用,有时反而会制造出新问题。
重复数据也不少见。同一个用户因为多端登录被记录成多个人,同一笔订单因为系统重试被多次写入,同一份样本因为合并被复制。你不处理,模型就会误以为这些重复样本代表更高频的客观现象。
异常值就更麻烦了。一个消费金额特别高的用户,可能是录入错误,也可能真的是大客户。网络流量突然飙升,可能是攻击,也可能只是促销活动。设备温度忽然升高,可能是传感器故障,也可能是故障前兆。异常值不能一删了事,需要结合业务语境去判断。
还有字段统一的问题。时间字段,有的精确到秒,有的是毫秒,有的存成字符串,有的是时间戳。地区字段,中文、英文、缩写混居。类别字段,大小写混乱。价格字段,有的是元,有的是分,还有带上货币符号的字符串。模型不理解这些字段背后的历史包袱,它只会看到混乱的输入,然后很认真地把混乱当成规律的一部分。
IBM 在讨论模型性能时也提到,清洗、降噪、归一化等数据预处理流程,能帮助避免数据质量问题。
训练前的处理流程,本身就是模型质量的一部分。
所以不要嫌清洗数据麻烦。
现在不清洗,模型上线之后,会替你把这些麻烦放大给所有人看。
探索性数据分析:我们需要先看,后动手
拿到数据后,最稳妥的动作不是马上训练模型。
先看。
看行数,看列数,看字段类型,看缺失比例,看类别分布,看数值范围,看异常点,看特征和标签之间的关系。
这个过程通常叫做探索性数据分析,简称 EDA。
EDA 的价值不在于画几张漂亮的图,而在于帮你建立对数据的感觉。
比方说,在做二分类任务时,一定要先看标签分布。
如果正样本只占 1%,那么准确率就很容易有欺骗性。
模型全部预测负样本,也能拿到 99% 的准确率,看起来成绩亮眼,实际上所有关键风险一个都没抓住。
做房价预测,先看价格分布。
如果价格长尾严重,少量豪宅样本会强烈影响均值和误差。
用普通的均方误差去评估,模型很容易被高价样本牵制,普通房源的预测反而不太准。
做用户流失预测,先看不同渠道用户的留存差异。
如果某个渠道样本量很少但流失率特别高,就需要判断是渠道质量真的很差,还是数据采集不完整。
否则模型可能学到一个失真的结论,以后只要一看到这个渠道就疯狂预警。
做网络安全检测,先看端口访问频次和流量分布。如果某些端口在业务高峰期本来就波动大,那把高流量一律当成异常,会带来大量误报。
安全系统最怕两种情形:一种是漏报,另一种是误报多到让值班人员彻底麻木。
后者的危害听起来没那么刺激,实际伤害却很大,误报需要更多的时间去审核。
EDA 就像行动前先看地图。
地形没摸清,敌我不分,补给不明,天气不知,仓促出击,这不叫勇敢,这是在给前线战报增加一点素材。
许多初学者跳过 EDA,是因为它不能立刻让模型分数变高。
可真正做项目时,EDA 常常能提前挖出训练失败的根因:标签错位、字段泄露、类别严重不平衡、某些特征全是常数、测试集分布和训练集完全不同……
越早发现,损失越小。
看数据这件事,很像体检。
没病最好,有病早治,别等到上线以后直接进“ICU”。
数据划分:别让模型提前偷看答案
要评估模型效果,就必须把数据分开。
训练集让模型学习,验证集用来调参和选择方案,测试集用于最终评估。
Google 的机器学习课程也强调,模型应当在训练样本之外的数据上测试,并建议划分出训练集、验证集和测试集,验证集用于训练过程中的初步评估,测试集做最终评估。
这听起来很简单,实际上这里最容易出问题。
不少人先把全量数据做标准化、筛选特征、做编码、填充缺失值,然后再划分训练集和测试集。
看起来没毛病,实际上测试集的信息可能已经泄露进了训练过程。
scikit-learn 的常见陷阱文档就明确建议,为了防止数据泄露,应先划分训练集和测试集,然后只用训练集的信息来进行特征选择等拟合步骤。
这件事可以理解为考试纪律。
训练集是平时的练习题,验证集是模拟考试,测试集是最终决定成绩的大考。你可以用练习题来学习,也可以用模拟考来调整复习策略,但不能把最终考试的答案提前拿出来整理错题本。
一旦这么做了,就算考得再高,分数也失去了参考价值。
数据泄露的典型场景很多。
预测用户是否流失,却把流失后产生的客服挽回记录放进了特征。
预测贷款是否逾期,却把逾期后的催收次数放进了特征。
预测设备是否故障,却把维修工单状态放进了特征。
预测邮件是否垃圾邮件,却在特征里包含了人工审核后的处置结果。
这类模型在线下评估时,分数通常会非常漂亮,漂亮得像开了挂。
然后一上线就沉默下来,因为真实预测时,这些“未来信息”根本拿不到。IBM 对数据泄露的定义也很直接,就是在训练时使用了预测时不可获得的信息,就会造成泄露,模型在部署前可能看起来很准,进入真实场景后输出就会失真。
还有一种更隐蔽的泄露,来自重复样本和时间切分方式。
Google 的课程还有讲到,测试集应当能代表真实数据,并且不与训练集包含重复样本。
重复样本会让模型像在考场上遇到原题,评估结果自然偏乐观。
时间序列任务尤其要警惕。
想预测未来,就不能把未来的数据随机打散混进训练集。比如预测明天的销量,却把下个月的数据也放进去训练。
模型看似学到了趋势,其实是提前偷看了后面的剧情。
Vertex AI 的表格数据最佳实践也提到,时间序列数据中同一天的信息应只出现在一个数据划分里,以减少泄露风险。
数据划分因此不是简单的随机抽样。
它是对真实预测场景的模拟。
如果现实中模型面对的是未来的用户,那么测试集最好也是按未来时间切分;面对的是新设备,就最好按设备划分;面对的是新地区,评估时就要考虑地区泛化能力。
一旦划分方式和真实使用方式错位,评估成绩就可能变成一种精致的幻觉。
数据分布:模型最怕世界悄悄改变
模型训练时看到的数据分布,和上线后面对的数据分布,最好保持接近。
这句话很容易理解,却很难一直做到。
用户会变,市场会变,设备会变,攻击方式会变,政策会变,节假日会变,竞品活动会变,产品版本也会变。
模型训练时看到的是过去,部署后面对的是现在和未来。
过去很可靠,不代表未来也一样。
疫情期间训练出的消费预测模型,到了正常时期表现可能明显下滑。
大促期间训练的用户行为模型,放进平常日子里容易误判。
某一个城市训练出的交通预测模型,换一座城市可能水土不服。
网络安全模型在已知攻击样本上表现很好,碰到变种攻击就可能反应不及。
这类现象可以叫分布变化,也可以叫数据漂移。
叫法不同,意思大致都一样,那就是世界已经切换了版本,模型还留在旧的补丁上。
Vertex AI 的文档提到,训练‑服务偏差可能来自训练集、验证集、测试集之间的数据分布,也常见于生产数据分布与训练数据分布不一致的情况。
这段话对我们的工程实践很关键。
很多人以为模型训练完成就等于项目结束。
实际上,训练完成只是第一阶段的结束。
上线之后,还要持续监控输入分布、预测分布、业务指标、异常样本和模型性能的衰减。
模型不是雕像,不能训练完就放在那里等人参观。
它更像生产线上的设备,需要巡检、维护,需要重训,也需要回滚预案。
举一个现实的例子。
一个推荐模型在旧版 App 上效果不错,点击率稳定。
后来产品改版,首页布局变了,按钮位置变了,内容曝光逻辑变了。
模型输入字段看似没动,可用户行为早已不同。
原来的点击模式不再成立,模型却还在按老地图指路。
最后数据还是数据,模型也还是模型,效果却开始一点点流失。
网络安全场景也一样。
攻击者不会按训练集的说明书出牌。模型在历史攻击样本上训练得很好,对手一旦换端口、改频率、调整时间窗口和请求特征,模型就很难跟上。
安全业务里尤其不能迷信一次训练的结果,因为对手在动,环境在动,体系的边界也在动。
所以看数据,不能只盯着眼前这张表。
还要去想:数据从哪里来,什么时候来的,未来会不会变化,和真实使用场景是否一致。
模型并不害怕世界复杂。
它怕的是,你假装世界会一直不变。
从业务问题到数据问题
机器学习项目真正启动前,必须先完成一次翻译——
把业务问题翻译成数据问题。
这一步做错了,后面全程都会偏航。
业务方说想提高转化率。
对应到机器学习上,可能是预测用户购买概率,也可能是做商品排序,还可能是识别高意向客户,或者是优化优惠券发放策略。
每一种任务需要的数据不同,标签定义不同,评估指标不同,落地方式也不同。
业务方说想降低流失。
机器学习任务可能是流失预测,也可能是用户分层,还可能是行为异常识别或召回策略评估。
不能一听到“流失”两个字就立即打开分类模型。
要先问清楚流失的定义、预测的时间窗口、可能的干预手段、业务收益,以及误判的代价。
业务方说想做智能审核。
可能是文本分类,可能是图像识别,也可能是规则辅助下的风险排序,甚至是人工复核队列的优化。
必须搞清楚模型是直接给结论,还是给出风险分数,还是辅助人工处理。不同方案对应着完全不同的数据闭环。
这一步翻译如果弄错了,就会出现一种经典场面——模型做得很认真,指标也很漂亮,但业务上完全用不上。
这就像别人请你修厨房,你却交付了一个豪华浴缸。
质量或许不错,方向基本告别。
看数据之前,先确认问题到底是什么。
确认了问题,再去确认数据是否能够支撑。数据不支持,就不要硬上模型。缺关键字段,补采集;标签不明确,先定义;样本太少,先积累;流程不闭环,先打通;评估指标对不上业务目标,先改指标。
机器学习不是许愿池。(LLM也不是)
不能把一个含糊的需求丢进去,然后等着模型吐出商业奇迹。
初学者最值得养成的几个数据习惯
学机器学习,第一拨习惯远比第一拨模型更重要。
第一,拿到数据先写一份数据说明。每个字段是什么意思,单位是什么,来源是什么,是否允许为空,有没有时间含义,会不会包含未来信息。不要嫌麻烦。今天不写,三天之后你自己也会忘。
第二,训练前先看标签分布。分类任务看正负样本比例,回归任务看目标值的范围和长尾情况。标签本身就不正常,模型很难正常。
第三,先做简单统计,再上复杂模型。均值、方差、缺失率、重复率、类别数量、最大值、最小值、分位数,这些基础统计可以帮你发现大量问题。很多你以为要靠深度洞察才能找到的 bug,实际上一个 describe() 就露馅了。
第四,先划分数据,再进行拟合式的预处理。标准化、编码、特征筛选、缺失值填充,只要涉及从数据中学习参数,就要当心测试集信息泄露。scikit-learn 的 train_test_split 本身就是用来将数组或矩阵划分为随机训练子集和测试子集的工具,配合 Pipeline 使用,能让流程更加规范。
第五,保留原始数据。任何清洗、转换、筛选都应该可追踪。不要在原始表上手工改来改去,最后谁也说不清楚数据经历了什么。机器学习项目最怕的一句话就是:“我也不知道这个字段怎么来的。”这话一出现,基本可以准备往回考古了。
第六,反复问自己:这个特征在预测时能拿到吗?能,保留;不能,删掉。预测时拿不到的字段,训练时效果再好也像空中楼阁,线下分数越高,上线后摔得越响。
第七,建立一个最简单的 baseline。先用清晰的数据、简单的特征、基础的模型跑通全流程。它不一定很强,却能告诉你项目有没有基本的可行性。没有 baseline,后面所有的花样都缺少参照。
这些习惯听起来都稀松平常。
可它们决定了你是成为一名务实的机器学习工程实践者,还是一个只靠调包抽奖的选手。
数据看明白了,模型才有资格登场
很多机器学习教程喜欢从模型开始讲起,这也没什么问题。模型更有吸引力,也更像技术的本体。
线性回归、逻辑回归、决策树、支持向量机、随机森林,每一个都有自己的理论结构和应用场景。但如果没有数据意识,模型知识很容易学成背菜单。
今天这个模型适合分类,明天那个适合回归,后天某个抗噪能力强,再后天某个可解释性好。
听起来都懂,一到项目里就乱。
因为真实问题不会提前告诉你应该选哪个算法,它只会丢给你一堆不完整、不均衡、有偏差、有噪声的数据,然后让你自己拿主意。
机器学习的第一层能力,就是把这一堆数据看明白。
它够不够用,脏在哪里,偏在哪里,缺什么,标签是否可信,划分是否合理,是否贴近真实场景,能支撑哪一种建模任务。
这些问题回答清楚了,模型才开始有意义。
否则,你只是把一堆问题倒进算法里,再把算法的输出包装成结论。看上去自动化了,实际上是把不确定性换了一层更贵的外壳。
现实里的机器学习,没有那么浪漫。
它不总是大模型发布会上那些高光时刻,也不全是论文图表里那些漂亮的曲线。
更多时候,是数据源对接、字段解释、异常排查、标签校验、样本划分、指标复核、业务沟通和版本追踪。
就像在一间灯光普通的机房里,把一条条混乱的数据线理顺。
理顺以后,模型才有机会表现。
理不顺,再先进的算法,也可能变成一具大型错觉生成器。
写在最后
机器学习之前,先学会看数据。这句话听起来保守,实际上相当有前瞻性。
因为未来真正有价值的 AI 系统,拼的已经不只是模型参数的大小,还要拼数据治理、业务理解、评估体系、工程闭环和持续迭代的能力。
模型会越来越容易获取,算力会越来越普及,工具也会越来越自动化。
但谁能把现实问题整理成高质量数据,谁能把业务目标准确翻译成可学习的任务,谁能把评估结果放回到真实场景里去检验,谁才更有可能把机器学习变成实在的生产力。
很多人追逐模型,追逐榜单,追逐新框架,追逐最新论文,这些都可以追逐。可追到最后,始终绕不开数据。
数据是模型的课本,也是模型的眼界。
数据是模型的燃料,也是模型的边界。
数据是机器学习的起点,也是工程落地的第一道关口。
一个人如果连数据都看不懂,就很难真正理解模型为什么有效,也很难判断模型为什么失效。这就像一个医生不看病历、不问症状、不查指标,上来就开药。运气好的话,病人自己康复;运气差,直接进入事故复盘。
所以在这组文章真正走进算法之前,必须先在这里停一停。
不用急着让机器学习。
先确认,它到底要从什么里面学。
5 个帖子 - 3 位参与者