特征处理、训练与评估
特征缩放、训练与验证的基本方法,以及准确率、精确率、召回率等分类指标的含义与区别。
监督学习使用带标签的数据训练模型。每条记录是一个样本,作为模型输入的属性是特征,模型需要预测的结果是标签。对于表格数据,通常每行对应一个样本,输入列对应各个特征。
训练时,模型学习特征与标签之间的关系;评估时,则用未参与训练的数据检查这种关系能否适用于新样本。数据怎样划分、特征怎样处理,以及采用什么指标,都会影响评估结果的含义。
1. 训练集、验证集与测试集
1.1 三部分数据的用途
| 数据 | 作用 |
|---|---|
| 训练集 | 用于拟合模型参数;预处理所需的均值、标准差等也从这部分数据计算 |
| 验证集 | 用于比较特征处理方式、模型和超参数,以及选择分类阈值 |
| 测试集 | 在方案确定后,评估模型在未参与选型的数据上的表现 |
验证集用于选择方案,测试集用于检验选定的方案。 反复根据测试结果改特征、换模型或调阈值,会让测试数据参与选型,得到的分数也可能偏乐观。
划分方式取决于模型实际要预测什么:
- 随机划分:适用于样本可以近似视为彼此独立、来自同一分布的情况。分类任务常按类别分层抽样,使各部分的类别比例接近。
- 按时间划分:预测未来数据时,用较早的数据训练,用较晚的数据验证和测试。
- 按组划分:评估模型对新用户、新设备等的预测能力时,同一用户或设备的全部记录只能进入训练、验证或测试中的一部分。
1.2 数据泄漏
数据泄漏是指训练或选型使用了实际预测时无法获得的信息,使评估结果高估模型的效果。例如,预测交易是否异常时,不能把事后才产生的投诉结果作为输入特征。
泄漏也可能发生在预处理阶段。先用全部数据计算均值和标准差,再划分训练集与测试集,测试数据就已经影响了训练输入。因此,应当先划分数据,再只用训练部分拟合预处理规则;验证和测试复用这些规则。
按历史时点回测时,训练也只能使用当时已获得的标签,不能提前使用后来才确认的结果。
2. 特征处理:填补、编码与缩放
2.1 拟合与变换
预处理要适应模型对输入的要求。常见操作包括填补缺失值、将类别转换为数值表示,以及调整数值特征的尺度。
对于没有大小顺序的类别,直接编码为 1、2、3,可能让线性模型或距离模型使用人为的顺序与间距。独热编码(one-hot encoding) 为每个类别设置一个单独的 0/1 特征:属于该类别时记为 1,否则记为 0。
预处理需要区分两个动作:
- 拟合(fit):从训练数据确定处理规则,例如计算缺失值的填充值、特征的均值和标准差,或确定类别集合。
- 变换(transform):使用已经确定的规则处理数据,不重新估计这些规则。
验证集、测试集和上线后的新数据都只做变换。分别在训练集和测试集上计算各自的均值,会使同一个数值采用不同的转换规则。保存模型时,也需要保存配套的预处理规则。
2.2 为什么需要调整特征尺度
不同特征的数值范围可能相差很大,影响距离计算、正则化和参数优化。
对依赖距离的模型,如 K 近邻(KNN),数值变化较大的特征可能主导距离计算,掩盖其他特征的差异。
例如,金额相差 1,000 元对欧氏距离的贡献,远大于交易次数相差 10 次。这种差别来自单位和数值范围,并不直接代表特征的重要性。
对带正则化的线性模型,特征尺度会影响系数受到的惩罚。正则化在训练目标中加入对系数大小的惩罚,例如 L1 惩罚系数绝对值之和,L2 惩罚系数平方和。
线性模型将特征乘以对应系数后相加。若某个特征除以 1,000,就需要把对应系数乘以 1,000,才能保持预测不变。在正则化强度不变时,放大后的系数受到的惩罚更大。
对使用梯度下降的模型,合适的缩放还可能减少达到相近训练误差所需的更新次数。
普通决策树通常不需要缩放:它按单个特征的阈值切分,特征与阈值按相同比例变化后,样本划分仍相同。逻辑回归、SVM、KNN 则通常需要关注特征尺度。
2.3 Min-max 归一化与标准化
Min-max 归一化对每个数值特征做线性变换,将训练集中的取值缩放到固定区间,通常为 :
是原始特征值,、 分别是该特征在训练集中的最小值和最大值。
特点:
- 对异常值敏感:极端值会拉大缩放范围,使其余数据被压缩到较小的区间。
- 新数据可能越界:仍使用训练集的最小值和最大值,新数据不一定落在 内。
例如,训练范围是 0~10,000,新值 15,000 经同一规则变换后会得到 1.5。
标准化对每个数值特征先减去均值,再除以标准差,使训练特征的均值为 0、标准差为 1:
、 分别是该特征在训练集中的均值和标准差; 表示原始值高于或低于均值几个标准差。
特点:
- 不限定取值范围,也不会把数据变成正态分布。
- 仍受异常值影响:极端值会改变均值和标准差,标准化本身不能消除异常值的影响。
两种方法都只用训练集计算统计量,验证和测试复用这些值。常量特征的分母为零,需要单独处理。
若极端值影响明显,可以考虑 scikit-learn 的 RobustScaler 类:用中位数居中,再除以第 75 百分位数与第 25 百分位数之差(四分位距)。它降低了缩放参数对极端值的敏感度,但不会删除异常值。
选择方法时,应结合模型要求、异常值影响和验证效果,不能仅按数据量大小决定。这里的 min-max 是逐特征缩放,与把每个样本向量缩放到单位长度的“向量归一化”不同。
3. 模型训练与超参数选择
3.1 模型参数与超参数
模型参数是训练过程中从数据中拟合出的量。例如,逻辑回归的系数、决策树的切分特征与阈值,都由训练数据决定。
损失函数衡量预测误差,训练通过调整模型参数来减小损失。评估时可根据任务选择准确率、召回率等指标。
超参数是在训练前设定的配置,例如正则化强度、树的最大深度。比较不同配置时,每组候选都需要重新训练,再按相同的验证规则和指标比较结果。
网格搜索、随机搜索、贝叶斯优化负责选择尝试哪些组合;验证集或交叉验证负责评价这些组合。
3.2 交叉验证
交叉验证通过多次划分、训练和验证,减少对单次数据划分的依赖。测试集保留在这些比较之外。
普通 K 折交叉验证将非测试数据分为 份:每次用其中一份验证,其余 份训练;轮换验证部分,直到每份都用于验证一次,得到 个验证分数。若第 轮分数为 ,等权平均为:
这里平均的是验证分数,不是模型参数。 各轮样本量明显不同时,还应说明是让各轮等权,还是按样本量加权。
每一轮都要从该轮训练部分重新拟合预处理和模型。先用所有非测试数据完成标准化,再进行交叉验证,会让各轮验证数据提前参与预处理。
Pipeline 是 scikit-learn 中用于组合处理步骤的类(sklearn.pipeline.Pipeline),可以将“标准化 → 模型训练”等步骤按顺序组织起来。把这个组合交给交叉验证后,每轮都在该轮训练部分拟合预处理和模型,验证部分只应用已经学到的规则。
普通 K 折适用于可以近似视为独立同分布的数据。对时间相关或同一对象的多条记录,各轮仍需遵守前面的时间划分或分组要求,不能直接随机轮换。
平均分之外还要看各轮波动。若某轮正类很少,分类指标可能不稳定;若反复在同一套划分上比较大量方案,最高分也可能只是更适合这批验证数据。因此,交叉验证之后仍需要独立测试。
3.3 从选型到最终评估
完整流程可以分为三步:
- 选择方案:用验证集或交叉验证,确定预处理方式、模型类型和超参数。
- 重新训练:按选定配置拟合最终模型。需要选择分类阈值时,先留出独立验证数据,再根据模型在这部分数据上的预测结果选定阈值。
- 最终测试:固定预处理、模型和阈值,在测试集上评估整套方案。
若不再需要阈值选择等额外验证步骤,可以合并全部非测试数据重新训练。
4. 欠拟合、过拟合与偏差方差
4.1 欠拟合与过拟合
过拟合:模型在训练集上表现很好,但在验证集或新数据上表现较差。
常用处理方法:
- 增加训练数据,或在不改变标签含义的前提下进行数据增强。
- 降低模型复杂度:神经网络可减少层数、神经元数量;决策树可限制深度、剪枝。
- 加强正则化:例如增大 L1、L2 正则化系数。
- 采用 Bagging:在多份重采样数据上训练模型,再汇总预测,降低对训练样本变化的敏感程度。
欠拟合:模型在训练集和验证集上都表现较差。
常用处理方法:
- 添加有效特征,补充与预测目标相关的信息。
- 增加模型复杂度,使模型能够表达更复杂的关系。
- 减小正则化系数,放宽对模型的约束。
若训练损失仍在明显下降,应先检查是否需要继续训练。比较训练与验证效果时,也要确认指标和数据分布可比。
4.2 偏差与方差
偏差与方差关注的是:保持模型类型、超参数和训练方法不变,换用多批同分布、同规模的训练数据,对同一个输入得到的预测会怎样变化。
以预测连续数值的回归任务为例:
- 偏差(bias):多次训练的平均预测,与该输入对应的真实平均结果之间的差距。它反映平均预测是否存在系统性的高估或低估。
- 方差(variance):各次预测围绕平均预测的波动程度。它反映训练数据变化时,模型预测有多敏感。
单次训练的预测误差,不能直接代表偏差或方差。
对使用平方误差的回归任务,设 为固定输入, 为真实观测结果, 为该输入下的真实平均结果, 为某次训练得到的预测。对训练集抽样和独立测试观测的噪声取期望,有:
左侧是平均平方预测误差。右侧依次是偏差的平方、预测方差,以及给定当前特征后仍无法解释的噪声方差 。补充真正有信息的特征,可能降低这部分噪声。
高偏差常与欠拟合相联系,高方差常与过拟合相联系,但不能把一次训练与验证的分数差直接当作方差。上述偏差—方差分解适用于平方损失设定,不能直接套到分类准确率或 F1 上。
5. 分类指标与阈值
5.1 混淆矩阵
二分类任务需要先约定正类和负类。通常把重点关注的类别记为正类,另一类记为负类;例如识别异常交易时,可以约定异常为正类、正常为负类。
混淆矩阵按真实类别与预测类别统计样本数量。下面用一组教学数据演示:共 1,000 个样本,其中真实正类 100 个、真实负类 900 个。
| 真实类别 | 预测为正类 | 预测为负类 |
|---|---|---|
| 正类:100 个 | TP = 60 | FN = 40 |
| 负类:900 个 | FP = 90 | TN = 810 |
缩写中的 T/F 表示预测正确或错误,P/N 表示预测为正类或负类。因此,TP 是真正例,TN 是真负例;FP 是把负类误判为正类的假正例,FN 是把正类误判为负类的假负例。
本例预测为正类的有 个,其中 60 个正确、90 个误报;100 个真实正类中,漏掉了 40 个。
5.2 准确率、精确率、召回率与 F1
准确率(Accuracy) 是预测正确的样本数占总样本数的比例。令总样本数 :
精确率(Precision) 是预测为正类的样本中,真实为正类的比例;也称查准率。
召回率(Recall) 是真实正类样本中,被正确预测为正类的比例;也称查全率。
精确率的分母是预测正类,召回率的分母是真实正类。 在上表中,准确率为 ,精确率为 ,召回率为 。
如果把所有样本都判为负类,准确率反而达到 90%,但召回率为 0。这说明在类别不均衡时,只看准确率可能掩盖模型对少数类的识别失败。
F1 是精确率与召回率的调和平均,其中一项很低时,另一项再高也难以得到高 F1:
本例 。F1 不考虑 TN,也不直接表示一次误报或漏报的业务成本。当某项指标分母为零时,应说明采用的处理约定。
多分类时,需要说明如何汇总各类指标。以多分类 F1为例,先把每一类分别视为正类、其余类视为负类,计算各类 F1;再用 macro 平均让各类等权,或用 weighted 平均按各类真实样本数加权。后者更受多数类影响,可能掩盖少数类表现,因此还应查看重要类别的单独分数。
5.3 分类阈值
模型通常先输出分数,再由阈值决定类别。设正类分数为 ,采用 时判为正类的规则。调整阈值不改变打分函数,只改变预测为正类的样本范围。
在同一批数据上降低阈值,预测正类的集合会扩大,因此 TP 和 FP 都不会减少,召回率不降。精确率通常会下降,但取决于新增样本中正类的比例,在有限样本上并不保证单调下降。
漏报代价高时,可以考虑降低阈值以提高召回率;误报代价高时,则需要限制预测为正类的范围。具体阈值选择应结合验证结果、错误成本和处理能力,测试时沿用已经确定的规则。
若模型输出的是正类概率,0.5 只是常见的默认阈值,是否合适仍需通过验证判断。
6. ROC、PR 与类别不均衡
6.1 ROC 与 AUC
真正例率(TPR) 是真实正类中被预测为正类的比例,也就是召回率;假正例率(FPR) 是真实负类中被误判为正类的比例:
在前面的混淆矩阵中,TPR 为 ,FPR 为 。FPR 的分母是真实负类;“预测正类中有多少误报”的分母则是预测正类,二者不同,后者在本例中为 。
ROC 曲线以 FPR 为横轴、TPR 为纵轴。改变分类阈值,记录对应的 FPR 和 TPR,即可得到曲线。曲线越靠近左上角,表示在较低的假正例率下就能获得较高的真正例率。
ROC-AUC 是 ROC 曲线下的面积,取值范围为 ,用于概括模型的排序能力。随机各取一个正例和负例,正例得分更高的概率,加上同分概率的一半,就是二分类 AUC。随机排序的期望 AUC 为 0.5,完全正确排序时为 1。
AUC 综合不同阈值下的表现。整体 AUC 较高的模型,在实际允许的误报率或处理数量范围内未必更好,因此仍需查看对应阈值附近的结果。
多分类 AUC 可以先拆成多个二分类问题,再汇总结果:“一对其余”逐个比较某类与剩余类别,“两两比较”逐对比较类别。比较分数时,应核对拆分和平均方式。
6.2 PR 曲线
PR 曲线 以召回率为横轴、精确率为纵轴,展示不同阈值下二者的变化。前面的混淆矩阵对应召回率 60%、精确率 40% 这个点。
ROC 关注真实正类、真实负类各自被判为正类的比例;PR 关注正类是否被找全,以及预测为正类的结果是否准确。正类稀少时,即使 FPR 不高,也可能产生大量误报,因此应结合 PR 曲线、实际误报数量和目标阈值评价模型。
6.3 类别比例对精确率的影响
精确率不仅取决于模型区分两类的能力,也取决于正类有多常见。假设模型和阈值固定,并暂时保持 TPR 为 60%、FPR 为 10%,改变评估数据中的正类比例:
| 评估数据 | 正类数 | 负类数 | 正确报出 TP | 误报 FP | 精确率 |
|---|---|---|---|---|---|
| 1,000 个样本,正类占 10% | 100 | 900 | 60 | 90 | 40% |
| 10,000 个样本,正类占 1% | 100 | 9,900 | 60 | 990 | 约 5.7% |
两组数据都找回 60 个正例,但第二组有更多负例,同样的 FPR 使误报从 90 个增至 990 个,精确率因此降到 。实际分布变化还可能同时改变 TPR 和 FPR,不能直接假定它们保持不变。
把正类比例记为 ,上述关系可写成:
分子是全体样本中正确预测的正类比例;分母再加上被误判为正类的负类比例。因此,用于报告实际效果、选择分类阈值的验证与测试数据,应能代表目标场景的类别比例。 若评估必须采用不同的抽样比例,需要按目标分布加权或校正,并说明方法。
6.4 不均衡训练数据的处理
处理类别不均衡时,常见方法包括:
- 过采样:增加少数类样本。随机过采样通过重复抽取已有样本实现,可能增加训练开销和过拟合风险;合成过采样则生成新的样本。
- 欠采样:减少多数类样本。随机欠采样保留其中一部分,能降低训练数据量,但可能丢失多数类的重要信息。
- 类别加权:在损失函数中为不同类别设置不同权重,调整各类错误对训练目标的影响,不直接改变样本数量。
具体方法与代价见 FAQ:类别不均衡。
用于平衡类别的重采样只在训练部分进行,交叉验证时也要放在每轮内部。 先过采样再划分,可能让重复样本同时进入训练与验证;先在全量数据上生成合成样本,也可能让验证信息参与构造。这些都属于重采样中的数据泄漏。
评论
使用 GitHub 登录后参与讨论,评论将公开保存在 GitHub。
站长管理删除会同步到 GitHub,无法撤销。
阅读到这里时加载评论。