机器学习完整流程:从数据、特征到模型预测
机器学习完整流程:从数据、特征到模型预测
站内搜索
直接问 AI

机器学习完整流程:从数据、特征到模型预测

机器学习不是把数据丢给一个算法就结束。一个可复查的机器学习项目,通常有一条比较稳定的流程:定义问题、整理数据、构造特征、训练模型、评估结果,最后再把模型用于预测。

这篇文章不追求覆盖所有算法,而是用工程视角把机器学习的完整流程拆开。理解这条流程后,再学习线性回归、逻辑回归、决策树或神经网络时,会更容易知道每一步在做什么。

读这篇时建议把重点放在“输入、处理、输出”三件事上:输入是什么数据,中间做了哪些变换,最后用什么指标判断输出是否可靠。

一、第一步:把问题定义清楚

机器学习项目开始前,先要回答一个问题:

我们希望模型根据什么输入,预测什么输出?

常见问题类型包括:

  • 分类:预测类别,例如邮件是否为垃圾邮件
  • 回归:预测连续数值,例如房价、销量或温度
  • 聚类:没有标签时自动分组,例如把用户分成几类
  • 排序:对候选结果排序,例如搜索结果推荐

如果问题没有定义清楚,后面很容易出现“模型训练出来了,但不知道怎么判断是否有用”的情况。

二、第二步:理解数据表里的每一列

对初学者来说,最常见的数据形态是一张表:

样本  特征1  特征2  特征3  标签
1     ...   ...   ...   A
2     ...   ...   ...   B
3     ...   ...   ...   A

这里有两个核心概念:

  • 样本:每一行通常是一条样本
  • 特征:用于预测的输入字段
  • 标签:监督学习中已知的正确答案

写代码前,应该先知道每一列的含义、单位、取值范围,以及有没有明显错误值。很多机器学习问题,失败原因不是算法太弱,而是数据字段理解错了。

三、第三步:划分训练集和测试集

模型不能只在训练数据上表现好。为了检查它有没有真正学到规律,我们会把数据拆成两部分:

  • 训练集:用于让模型学习参数
  • 测试集:用于模拟模型面对新数据时的表现

常见写法是:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42
)

random_state 的作用是固定随机划分结果,方便你以后复现实验。

四、第四步:特征处理

模型通常只能处理数字,所以原始数据经常需要转换。常见特征处理包括:

  • 把文本类别转成数字编码
  • 处理缺失值
  • 对数值特征做标准化
  • 删除明显无意义或泄漏答案的字段

标准化是很常见的一步,尤其是逻辑回归、K-means、神经网络这类对数值尺度敏感的方法:

x_scaled = (x - mean) / std

它不会改变样本之间的相对关系,但会让不同特征处在更接近的尺度上。

五、第五步:选择一个基线模型

入门阶段不要一开始就追复杂模型。更好的做法是先建立一个基线:

  • 分类问题可以先试逻辑回归或决策树
  • 回归问题可以先试线性回归
  • 聚类问题可以先试 K-means

基线模型的意义不是一定要达到最好效果,而是给你一个可比较的起点。后续更换模型、调整特征或改参数,都要和这个起点比较。

六、第六步:训练模型

在 scikit-learn 里,训练过程通常很统一:

model.fit(X_train, y_train)

这行代码背后发生的是:模型根据训练数据不断调整内部参数,让预测结果尽量接近标签。

不同算法的参数含义不同,但从使用者视角看,核心目标都是一样的:找到一组参数,让模型在训练数据上犯的错误更少,同时不要只记住训练数据。

七、第七步:预测和评估

训练完成后,可以对测试集预测:

y_pred = model.predict(X_test)

然后用指标评估结果。分类任务常见指标有:

  • Accuracy:整体预测正确比例
  • Precision:预测为正类的样本里,有多少真的为正
  • Recall:真实正类里,有多少被找出来
  • F1-score:precision 和 recall 的折中

不要只看一个数字。尤其是类别不平衡时,准确率可能会误导你。

八、完整流程长什么样

把上面的步骤连起来,一个最小流程可以写成:

# 1. 准备 X 和 y
# 2. 拆分训练集和测试集
# 3. 处理特征
# 4. 训练模型
# 5. 预测测试集
# 6. 计算评估指标

真正的项目可能还会加入日志、交叉验证、模型保存、线上监控等环节。但无论复杂度多高,核心流程都离不开这几步。

九、学习时最应该养成的习惯

建议每次练习机器学习项目时,都记录下面几个问题:

  • 输入特征是什么,标签是什么
  • 训练集和测试集怎么划分
  • 做了哪些特征处理
  • 使用了什么基线模型
  • 评估指标是什么,为什么选它
  • 模型犯错的样本有什么特点

如果你能把这些问题说清楚,就已经不是只会复制代码,而是在按机器学习的方式分析问题了。

十、常见错误

初学者写第一个机器学习项目时,最容易踩下面几个坑:

  • 先处理完整数据,再拆分训练集和测试集,导致测试集信息泄漏
  • 没有建立基线模型,直接堆复杂算法,最后不知道提升是否真实
  • 只打印 accuracy,不看类别分布和错误样本
  • 把字段名当成理所当然,没有确认每一列的业务含义

如果你能主动避免这些问题,一个小项目的可信度会明显提高。

十一、把流程写成可复现脚本

一个机器学习项目如果只能在 Notebook 里手动点几格,很难长期维护。更好的做法是把关键步骤整理成脚本或固定函数,让别人可以从原始数据重新跑到评估结果。

data/raw.csv
scripts/01_profile_data.py
scripts/02_train_baseline.py
scripts/03_evaluate.py
reports/metrics.json
reports/confusion_matrix.csv

这个结构不复杂,但能把数据体检、训练和评估分开。后续你换模型时,只要比较 metrics.json 和混淆矩阵,就能知道变化是否真实,而不是只凭一次控制台输出判断。

十二、流程审计表

流程节点 最低要求 常见失败信号
问题定义 说明输入、输出和成功指标 训练完成后无法判断是否有用
数据理解 记录字段含义、缺失值和类别分布 模型学到字段偏差或泄漏信息
特征处理 只在训练集上拟合 scaler/encoder 测试集信息提前进入预处理
模型评估 和基线比较,并查看错误样本 只报告一个 accuracy
结果记录 保存参数、随机种子和指标文件 隔天无法复现实验

这张表可以作为每个小项目的提交检查。哪怕只是课程练习,只要流程可复查,后续阅读神经网络、特征工程或模型部署时都会更稳。

数据泄漏:让一切指标失去意义的那类错误

上面的流程里,「先划分再处理」这个顺序不是随便定的。违反它会导致数据泄漏——测试集的信息以某种方式渗进了训练过程,于是评估分数变得很高,而模型上线后表现完全对不上。

泄漏之所以危险,是因为它不会报错,只会让分数变好。而分数变好正是你想要的结果,所以几乎没有人会去怀疑它。下面三种是最常见的形式。

第一种:在划分之前做了标准化或缺失值填充。

# 错:均值和方差是在全部数据上算的,测试集的分布信息进了训练集
X = scaler.fit_transform(X)
X_train, X_test = train_test_split(X, ...)

# 对:只在训练集上 fit,测试集只 transform
X_train, X_test = train_test_split(X, ...)
X_train = scaler.fit_transform(X_train)
X_test  = scaler.transform(X_test)        # 注意是 transform,不是 fit_transform

用中位数填补缺失值、用类别频次编码、做特征选择——所有需要看数据统计量的操作都适用这条规则。稳妥的做法是把它们全部放进 Pipeline,交叉验证时框架会自动在每个折内正确地重新 fit。

第二种:时间序列用了随机划分。如果数据带时间属性(用户行为、销量、传感器读数),随机划分意味着训练集里有「未来」的样本,而预测任务是用过去预测未来。模型可以借助未来信息作弊,测试分数很漂亮,上线立刻崩。时间序列必须按时间切:某个时间点之前的做训练,之后的做测试。

第三种:特征里混入了目标的代理变量。这种最隐蔽。比如预测「用户是否会流失」,特征里有一列「账户注销日期」——这列只有流失用户才有值,模型直接读它就能得到答案。再比如预测「是否患病」,特征里有「用药记录」,而用药是确诊之后才发生的。

识别方法很实用:如果某个单一特征的重要性异常地高,或者模型准确率高得不像话,先怀疑泄漏,而不是先高兴。然后逐个问:这个特征在真正要做预测的那个时刻,是否已经存在?

这条检查值得写进流程:每次拿到一个好得意外的结果,先花十分钟找泄漏。发现泄漏的代价是重做一遍,没发现的代价是上线之后才知道模型没用。

十三、下一步读什么

上一篇是 人工智能基础学习路线。理解完整流程后,建议继续读 模型训练与评估入门,把损失函数、过拟合和评估指标补上。

发表回复

向下探索