在python中如何进行机器学习

办公与行业

用 Python 走一遍机器学习建模全流程:从环境准备、数据检查、切分、训练、评估到上线前自查,给入门开发者一份能照着做的步骤清单。

很多人学 Python 机器学习的卡点不在算法,而在打开编辑器之后不知道下一步该干嘛:数据读进来放哪、什么时候切分、模型跑出来怎么看、结果能不能用。这篇按真实项目顺序把整条链路拆成可执行的动作,每步告诉你判断标准和常见坑,最后给一份上线前自查表。具体版本、库的安装包大小这类会随时间变的东西,去站内对应页面核对当时的数字。

很多人学 Python 机器学习的卡点不在算法,而在打开编辑器之后不知道下一步该干嘛:数据读进来放哪、什么时候切分、模型跑出来怎么看、结果能不能用。这篇按真实项目顺序把整条链路拆成可执行的动作,每步告诉你判断标准和常见坑,最后给一份上线前自查表。

先说清适用边界:这套流程适合表格类、样本量不算巨大的入门项目,比如一份几千到几十万行的业务记录。如果你的数据是图像、文本、序列信号,流程骨架一样,但预处理和评估部分要单独找对应资料,不要照搬。具体版本、库的安装包大小这类会随时间变的东西,去站内对应页面核对当时的数字。

先把环境和工具链定下来

探索阶段用交互式笔记本,好处是每一步的输出都留在页面上,回头能看出哪一步把数据改坏了。等流程跑通、准备给别人用,再把逻辑抽成 .py 脚本,别一上来就写工程化代码,那时候你还不知道最终要哪些步骤。

虚拟环境是必须的,一个项目一个环境,把依赖锁进文件里。不锁依赖的后果是:三个月后换台机器,同样的代码跑不出同样的结果,而你根本不知道是哪个库变了。判断标准很简单,能不能在一个干净环境里用一条安装命令把项目跑起来。

环节该用什么别用它干嘛
数值与矩阵运算专门做数组运算的库别拿它读 Excel 和做字符串清洗
表格数据处理做表格读写的库别拿它做大矩阵运算
绘图静态或交互绘图库别把绘图逻辑写进训练流程
建模与评估主流机器学习库加指标工具别自己手写指标公式练手用可以,上线别用
  • 笔记本负责探索:记录每一步的输入输出和你的判断
  • 脚本负责复现:把确认有用的步骤按顺序抽出来
  • 依赖文件负责还原:别人拿到项目能一次装好
  • 数据目录和代码目录分开:原始数据只读,中间结果可重建
  • 版本会变,装之前到 /tools/speed-test 看看当前主流组合的口径

拿到数据先做体检,别急着建模

数据读进来第一件事不是画图,是把三个数字查清楚:总共有多少行、标签怎么分布、每列缺失多少。这三件事决定了后面几乎所有选择。样本量太小,再多调参技巧也救不回来;标签极度倾斜,普通准确率会骗你。

缺失值的处理顺序是:先搞清楚为什么缺,再决定删行、填均值还是单独标一类。缺失本身可能就是信息,比如某字段没填说明这类用户行为不同。缺得多的列直接放弃往往比硬填更稳,判断标准是这列缺失比例高到填出来的值已经没什么意义。

量纲差异
各列数值范围差很大,基于距离的模型会被大数值列主导
树模型
对量纲基本不敏感,统一尺度对它帮助有限
类别编码
把文字类别变成数字,别把几十个高频类别原样塞进去
标签泄漏
某个特征在预测时其实拿不到,训练时却混进去了

先判断你打算用什么模型类型,再决定要不要统一尺度。这一条搞反了,会白白花时间做无用功。类别型字段要么做编码要么做分组,把长尾类别合并成『其他』通常比硬编码更稳。

先跑一个最笨的基线模型

用最简单的规则或者最朴素的模型先出一个数,后面所有改进都跟它比。没有基线就没有『变好了』这个概念,你只是在一堆不知道好坏的数之间换来换去。

  1. 跑通一条最小管道读数据、切分、训练、预测、算指标,一条不断。目标不是效果,是确认整条链路能跑。
  2. 做什么都不学的对照比如预测全部样本为多数类,看它的表现。复杂模型打不过它,说明特征或标签有问题。
  3. 固定这段流程把它存成一个文件,后面换模型只是替换中间一行。这一步省下来的时间会在调参阶段全还给你。
  4. 记录基线数字写在文件顶部注释里,包括用了哪些特征、怎么切分的,方便后面横向比。

不适用的情况也要说清:如果你的任务本身没有可比基线,比如纯粹的聚类探索,那这步换成先看数据的分群结构是否稳定。基线思路对监督学习最有效。

切分数据,把泄漏这条线画出来

训练、验证、测试要分清楚。调参只能看验证集,测试集留到最后看一次。反复看测试集等于慢性作弊,你会不知不觉按那个数字调方向,最后上线打脸。判断标准是:测试集结果你在整个开发过程中应该只见过很少几次。

任何用到全体数据的操作都要小心。标准化、填缺失、选特征,如果先在全量上算再切分,测试集的信息就漏进训练了。正确做法是只在训练集上算这些参数,再应用到验证和测试集。

场景怎么切切错的后果
普通表格数据随机切,类别不平衡就用分层切分布偏移,两边标签比例差太多
时间序列按时间切,前面训练后面测试用未来预测过去,指标虚高
同一用户多条记录按用户切,不要把同一人的记录分到两边同一用户信息同时出现在训练和测试
样本很少交叉验证,别只切一次单次结果波动大,判断全靠运气

训练与调参:一次只动一个变量

调参要有顺序:先定模型大类,再调影响最大的那两三个参数,最后微调其余。全参数网格搜在小数据上纯属浪费,组合多、单次训练慢,等结果出来天都黑了。

  • 记录每一次实验:改了哪个参数、指标怎么变,不记就等于白跑
  • 用交叉验证看均值加波动范围,而不是盯着单次结果
  • 一次只动一个变量,同时改三个参数你永远不知道是谁起的作用
  • 数据量小的时候,增加样本比换模型有效得多,先想想能不能再拿点数据
  • 调参前先解决数据问题,脏数据上调出来的参数没有意义

验证指标的波动很正常,别看到一次变好就兴奋。判断标准是改进幅度是否超出波动范围,超出才算真改进。这一步做扎实,后面上线时才不会因为一点分布变化就崩。

评估:别只看一个数

先明确业务关心什么。是宁可漏判也不能误判,还是反过来,指标选择完全取决于这个。不同场景下同一个模型可能一个能用、一个不能用,问题不在模型,在你没说清目标。

分类问题至少同时看两个互补指标加混淆矩阵,只看单一指标容易被不平衡数据骗。回归问题看误差的分布而不是平均值,个别大偏差往往才是真实痛点。把模型错得最离谱的那几条样本翻出来看,通常能直接指出数据或特征的问题。

现象先查什么常见原因
准确率很高但业务方不满意混淆矩阵多数类占比太高,模型只学会猜多数类
验证集好测试集差切分和预处理顺序测试集信息漏进训练了
误差集中在某几类这几类的样本量和特征样本太少或特征没区分度
线上明显差于线下训练和推理的预处理两边处理逻辑不一致

从笔记本走到能被人用的一步

把训练好的预处理加模型打包成一个能接收原始输入的对象,别让别人自己拼特征。别人拼特征的后果是:线上传入的字段顺序或格式和训练时略有不同,结果整体偏移,而且很难查。

  1. 打包预处理和模型输入原始的一行数据,内部完成清洗、编码、预测。对外只暴露一个调用方法。
  2. 写最小调用入口传一行数据进去,返回预测结果和置信度。先能跑,再加日志和批量接口。
  3. 留出监控位记录输入分布和预测分布。数据漂移是模型失效最常见的原因,早发现能早重训。
  4. 定期重跑评估用新数据重跑一遍,规则固定,节奏按业务变化速度定,变化快就勤一点。

上线前自查清单与入门常见坑

最常见的坑是把笔记本里的中间变量当成必然存在的状态,换台机器跑就崩。第二个常见坑是拿测试集结果当作上线预期,实际线上分布往往不同。判断标准很简单:如果换个同事拿着你的代码能在新机器上跑出同样的数,这版才算合格;做不到就先别谈上线。

  • 训练与推理的预处理是否完全一致
  • 类别编码映射表有没有保存下来
  • 缺失值处理逻辑是否可以复现
  • 随机种子是否固定,能不能跑出同样的结果
  • 依赖版本是否锁在文件里
  • 输入字段顺序和格式是否有校验

自查清单不用每次全做,但那几条和数据、随机性相关的项,跳过基本等于给自己埋雷。具体到某个库的当前写法差异,去 /tools 的工具目录里对照当时的说明,别硬记老教程。

能在一个干净环境里复现出同样的数,才叫模型跑通了。
下一步如果你正在选模型或者比价看算力,本站的价格追踪和模型资料库会把当时的数字列在一起,省得你一个个去翻官方页面。

常见问题

零基础要先学数学还是先写代码?

建议边写边补。先把一条完整的建模流程跑通,知道每个环节在干什么,遇到看不懂的公式再回去补对应那一块。纯学数学容易卡在推导里出不来,先动手反而更容易建立直觉。基础概念不懂时到 /ai-dict/category/basics 这类术语页对照着看。

用哪个库?一定要用深度学习的框架吗?

表格类数据先用传统机器学习库就够了,效果好、训练快、好解释。深度学习框架更适合图像、文本、语音这类非结构化数据。判断标准是数据形态和样本量,不是哪个更新。什么时候该换,可以对照站内的机器学习与深度学习区别类文章。

模型效果不好,先改哪里?

按顺序排查:一看数据质量和标签有没有错,二看特征是否够用,三看切分和评估有没有泄漏,四才是换模型调参数。多数入门项目的问题出在前两步,改模型是最没性价比的做法。

需要多少数据才够?

没有通用答案,取决于问题复杂度和特征信息量。实操上的做法是:先画学习曲线,看增加训练量时验证指标还在不在涨,还在涨说明数据不够,已经平了说明该从特征和模型入手。

笔记本里跑通的结果,怎么保证以后还能复现?

三件事:固定随机种子、把依赖版本写进文件、把预处理步骤写成可调用的函数而不是散落在各个单元格里。做到这三点,换台机器基本能跑出接近的结果,剩下的差异来自库版本和硬件。接口延迟这类环境影响可以到 /tools/speed-test 量一下基线。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。