AI 工程基础体系 · 第 5/100 篇。内容覆盖机器学习、深度学习与生成式 AI;模型、数据、评测、权限和成本会作为同一生产系统处理。

监督学习:线性模型、树模型、分类回归、正则化和误差分析

监督学习(supervised learning)是从带标签样本中学习输入与目标之间关系的方法。给定样本:

D={(xi,yi)}i=1n\mathcal D=\{(x_i,y_i)\}_{i=1}^{n}

其中 xix_i 是特征,yiy_i 是标签,模型学习一个函数:

y^=fθ(x)\hat y=f_\theta(x)

θ\theta 表示模型参数。训练过程不是直接“记住答案”,而是最小化损失函数:

θ^=argminθ1ni=1n(fθ(xi),yi)+λΩ(θ)\hat\theta=\arg\min_\theta \frac{1}{n}\sum_{i=1}^{n} \ell(f_\theta(x_i),y_i)+\lambda\Omega(\theta)

第一项衡量预测错误,第二项是正则化项,用于限制模型复杂度。监督学习中最容易混淆的几个问题是:

  • 分类回归是预测目标不同的两类任务;
  • 线性模型树模型是建模输入与输出关系的不同方式;
  • 正则化不是某一种模型,而是控制过拟合的一类方法;
  • 误差分析不是训练结束后的附加工作,而是判断模型为什么失败、下一步如何改进的主要依据。

一、先确定监督学习问题

1. 分类与回归

当目标 yy 是离散类别时,任务是分类。例如:

  • 邮件是否为垃圾邮件;
  • 用户是否会流失;
  • 图片属于猫、狗还是其他类别;
  • 交易是否存在欺诈风险。

二分类通常令:

y{0,1}y\in\{0,1\}

多分类令:

y{1,2,,K}y\in\{1,2,\ldots,K\}

当目标是连续数值时,任务是回归。例如:

  • 预测房价;
  • 预测未来销量;
  • 估计响应时间;
  • 预测用户生命周期价值。

分类器通常输出类别概率,而不仅是类别本身:

p(y=1x)p(y=1\mid x)

再通过阈值转换为决策:

y^={1p(y=1x)t0p(y=1x)<t\hat y= \begin{cases} 1 & p(y=1\mid x)\ge t\\ 0 & p(y=1\mid x)<t \end{cases}

默认阈值 t=0.5t=0.5 只是一个决策约定,不是自然规律。若漏报代价远高于误报,合理阈值可能低于 0.50.5

2. 特征、标签与数据切分

监督学习至少涉及四个对象:

  • 特征 XX:模型可使用的输入;
  • 标签 yy:训练时用于计算损失的目标;
  • 样本单位:一行数据究竟代表用户、订单、设备还是时间窗口;
  • 预测时点:特征必须在做出预测的时刻已经可获得。

最后一个条件决定了数据泄漏(data leakage)是否发生。例如,要预测用户在本月是否流失,却把“本月结束后是否取消会员”作为特征,模型离线指标会很高,但线上预测时该字段尚不存在。

常见切分方式如下:

原始数据
   |
   +-- 训练集:拟合参数、选择模型
   |
   +-- 验证集:选择超参数、阈值、特征方案
   |
   +-- 测试集:只在最终阶段估计泛化性能

如果样本具有时间顺序,应优先按时间切分,而不是随机打散。随机切分会使未来信息进入训练集,造成时间泄漏。若同一用户有多条记录,还应按用户分组切分,否则同一用户的相似记录可能同时出现在训练集和测试集中。

3. 经验风险与泛化误差

训练集上的平均损失称为经验风险:

R^(f)=1ni=1n(f(xi),yi)\hat R(f)=\frac{1}{n}\sum_{i=1}^{n}\ell(f(x_i),y_i)

真正关心的是从未来数据分布中抽取新样本时的期望损失:

R(f)=E(x,y)P[(f(x),y)]R(f)=\mathbb E_{(x,y)\sim P}[\ell(f(x),y)]

训练损失低而测试损失高,称为过拟合;两者都高,可能是欠拟合、特征不足、标签噪声大或任务本身难以预测。

模型选择本质上是在控制训练误差与模型复杂度之间的平衡。正则化、剪枝、早停、交叉验证都在不同层面解决这个问题。

二、线性模型:用加权组合建立可解释基线

1. 线性回归模型

线性回归假设预测值是特征的加权和:

y^=w0+w1x1+w2x2++wdxd\hat y=w_0+w_1x_1+w_2x_2+\cdots+w_dx_d

写成向量形式:

y^=wx+b\hat y=w^\top x+b

其中:

  • xRdx\in\mathbb R^d 是特征向量;
  • wRdw\in\mathbb R^d 是权重;
  • bb 是截距;
  • y^\hat y 是预测的连续数值。

最常用的损失是均方误差(MSE):

L(w,b)=1ni=1n(wxi+byi)2L(w,b)=\frac{1}{n}\sum_{i=1}^{n} (w^\top x_i+b-y_i)^2

平方误差会放大大误差,因此对异常值敏感。

如果把偏置项并入特征,令:

x~i=[xi1],w~=[wb]\tilde x_i= \begin{bmatrix} x_i\\1 \end{bmatrix}, \qquad \tilde w= \begin{bmatrix} w\\b \end{bmatrix}

则目标可写为:

L(w~)=Xw~y22L(\tilde w)=\|X\tilde w-y\|_2^2

对参数求导:

L(w~)=2X(Xw~y)\nabla L(\tilde w)=2X^\top(X\tilde w-y)

令梯度为零,得到正规方程:

XXw~=XyX^\top X\tilde w=X^\top y

如果 XXX^\top X 可逆:

w~^=(XX)1Xy\hat{\tilde w}=(X^\top X)^{-1}X^\top y

这说明线性回归的最小二乘解是在训练数据上,使预测残差平方和最小的参数。实际实现通常不会显式计算矩阵逆,而使用更稳定的 QR 分解、SVD 或其他数值线性代数方法。

2. 线性模型的“线性”到底指什么

线性模型要求模型对参数线性,不一定要求原始特征与目标呈简单直线关系。例如加入多项式特征后:

y^=w0+w1x+w2x2\hat y=w_0+w_1x+w_2x^2

它对参数 w0,w1,w2w_0,w_1,w_2 仍然是线性的,因此仍可用线性回归拟合,但对原始变量 xx 已经是曲线关系。

类似地,可以加入:

  • 对数特征 logx\log x
  • 交互特征 x1x2x_1x_2
  • 分桶后的指示变量;
  • 领域定义的统计特征。

线性模型的表达能力取决于特征变换。原始特征不足时,模型即使优化完全,也只能得到系统性偏差。

3. 线性回归的假设与预测边界

经典线性回归的统计推断通常依赖以下条件:

  1. 条件均值近似线性:

    E[yx]wx+b\mathbb E[y\mid x]\approx w^\top x+b

  2. 误差相互独立;
  3. 误差方差在不同输入下大致恒定;
  4. 误差分布在需要构造置信区间时通常还会假设近似正态;
  5. 特征之间不存在严重多重共线性,或已采用相应处理。

这些假设不是线性回归用于预测的绝对前提。即使误差不服从正态分布,模型仍可能有预测价值;但系数解释、置信区间和显著性检验会受到影响。

多重共线性是指特征之间高度相关。例如同时使用“房屋面积(平方米)”和“房屋面积(平方英尺)”,二者几乎提供相同信息。此时预测可能仍然稳定,但单个系数的数值和符号会非常不稳定。

4. 分类不能直接套用普通线性回归

如果把标签 y{0,1}y\in\{0,1\} 直接用线性回归预测,可能得到小于 0 或大于 1 的结果:

y^=wx+b\hat y=w^\top x+b

这不符合概率含义。逻辑回归通过 Sigmoid 函数把线性打分映射到 (0,1)(0,1)

p(y=1x)=σ(z)=11+ez,z=wx+bp(y=1\mid x)=\sigma(z)=\frac{1}{1+e^{-z}}, \qquad z=w^\top x+b

z=0z=0 时概率为 0.50.5zz 增大,正类概率接近 1;zz 减小,正类概率接近 0。

逻辑回归使用二元交叉熵损失:

L(w,b)=1ni=1n[yilogpi+(1yi)log(1pi)]L(w,b)= -\frac1n\sum_{i=1}^{n} \left[ y_i\log p_i+(1-y_i)\log(1-p_i) \right]

其中 pi=σ(wxi+b)p_i=\sigma(w^\top x_i+b)

这个损失可以从最大似然推导。假设:

yiBernoulli(pi)y_i\sim\operatorname{Bernoulli}(p_i)

则单个样本的似然为:

P(yixi)=piyi(1pi)1yiP(y_i\mid x_i)=p_i^{y_i}(1-p_i)^{1-y_i}

所有样本独立时,最大化似然等价于最大化对数似然;取负号后,就得到交叉熵损失。

逻辑回归的决策边界为:

p(y=1x)=0.5wx+b=0p(y=1\mid x)=0.5 \Longleftrightarrow w^\top x+b=0

因此它在特征空间中产生线性决策边界。它可以输出概率,但这个概率是否校准良好,还取决于数据、正则化、采样方式和训练过程。

5. 多分类逻辑回归

多分类可以使用 Softmax:

p(y=kx)=exp(wkx+bk)j=1Kexp(wjx+bj)p(y=k\mid x)= \frac{\exp(w_k^\top x+b_k)} {\sum_{j=1}^{K}\exp(w_j^\top x+b_j)}

其中 KK 是类别数。所有类别概率之和为 1。对应的损失是多类交叉熵:

L=1ni=1nlogp(yixi)L=-\frac1n\sum_{i=1}^{n}\log p(y_i\mid x_i)

Softmax 输出的是互斥类别的概率分布。如果一个样本可以同时属于多个类别,就不应使用单个 Softmax,而应为每个标签使用独立的 Sigmoid,并使用多标签二元交叉熵。

6. 线性模型的优点与失败模式

线性模型通常具有以下性质:

  • 参数量与特征维度近似线性增长;
  • 在高维稀疏特征上训练和预测效率高;
  • 权重方向可以帮助解释特征与预测的关系;
  • 在特征工程充分、关系近似线性时具有很强的基线价值。

但它会在以下情况下失效:

  • 真实关系依赖复杂交互;
  • 决策边界明显非线性;
  • 特征尺度、缺失值或类别编码处理不当;
  • 训练数据中存在强异常值;
  • 目标受未观测变量影响很大。

“系数为正”也不自动意味着因果关系。在线性相关特征、选择偏差或混杂变量存在时,系数只能解释模型中的条件关联。

三、树模型:通过递归划分构造非线性规则

1. 决策树的结构

决策树将特征空间递归划分为多个区域。一个内部节点包含条件,例如:

xjtx_j\le t

满足条件的样本进入左子节点,其余样本进入右子节点。叶节点保存预测值:

  • 回归树通常保存叶内目标的均值或其他统计量;
  • 分类树通常保存叶内类别比例,并据此输出类别概率。

因此,一棵树可以表示为一组“如果……那么……”规则。其预测函数是分段常数函数,而不是全局线性函数。

2. 回归树如何选择切分

设某个节点包含样本集合 SS。如果使用平方误差,未切分前的节点损失为:

Q(S)=iS(yiyˉS)2Q(S)=\sum_{i\in S}(y_i-\bar y_S)^2

其中:

yˉS=1SiSyi\bar y_S=\frac{1}{|S|}\sum_{i\in S}y_i

为什么叶节点使用均值?因为对于任意常数 cc

iS(yic)2\sum_{i\in S}(y_i-c)^2

cc 求导并令其为零:

2iS(yic)=0-2\sum_{i\in S}(y_i-c)=0

得到:

c=yˉSc=\bar y_S

考虑候选切分 xjtx_j\le t,将节点分为 SL,SRS_L,S_R,切分收益为:

ΔQ=Q(S)Q(SL)Q(SR)\Delta Q=Q(S)-Q(S_L)-Q(S_R)

算法选择使 ΔQ\Delta Q 最大的特征和阈值,然后对左右子节点递归执行相同过程。

例如,某节点目标值为:

[2,3,4,10][2,3,4,10]

不切分时均值为 4.754.75,平方误差为:

(24.75)2+(34.75)2+(44.75)2+(104.75)2=38.75(2-4.75)^2+(3-4.75)^2+(4-4.75)^2+(10-4.75)^2=38.75

若按某特征切分为左组 [2,3,4][2,3,4] 和右组 [10][10],左组均值为 3,右组均值为 10,切分后损失为:

(23)2+(33)2+(43)2+0=2(2-3)^2+(3-3)^2+(4-3)^2+0=2

因此该切分将节点内平方误差从 38.75 降低到 2。

3. 分类树的纯度

分类树需要衡量一个节点中类别是否混杂。常见指标有基尼不纯度和熵。

设节点中第 kk 类比例为 pkp_k

基尼不纯度为:

G(S)=1k=1Kpk2G(S)=1-\sum_{k=1}^{K}p_k^2

熵为:

H(S)=k=1KpklogpkH(S)=-\sum_{k=1}^{K}p_k\log p_k

如果节点中的样本全属于同一类,基尼不纯度和熵都为 0;如果类别均匀混合,纯度最低。

候选切分的加权不纯度为:

Isplit=SLSI(SL)+SRSI(SR)I_{\text{split}}= \frac{|S_L|}{|S|}I(S_L)+ \frac{|S_R|}{|S|}I(S_R)

选择加权不纯度最小的切分。基尼和熵通常会产生相近但不完全相同的树;没有普遍成立的规则表明某一个指标始终更好。

4. 树模型为什么能表示非线性

假设真实规则是:

y={1,x1>0 且 x2>00,其他情况y= \begin{cases} 1,&x_1>0\ \text{且}\ x_2>0\\ 0,&\text{其他情况} \end{cases}

线性模型只能用一条直线或超平面近似这个区域;决策树可以先按 x1x_1 切分,再在右侧按 x2x_2 切分,从而构造矩形区域。

树模型天然能够表达:

  • 特征阈值;
  • 分段关系;
  • 特征交互;
  • 不同区域中不同的局部规则。

但单棵树通常容易过拟合。若不断切分,叶节点可能只包含一个或少数样本,训练误差接近 0,而新数据上的误差上升。

5. 树模型的复杂度控制

常见控制手段包括:

  • 限制最大深度;
  • 限制叶节点最小样本数;
  • 限制内部节点继续切分所需的最小样本数;
  • 限制叶节点数量;
  • 使用代价复杂度剪枝;
  • 使用随机森林或梯度提升树等集成方法。

代价复杂度剪枝可以形式化为:

Rα(T)=R(T)+αL(T)R_\alpha(T)=R(T)+\alpha|L(T)|

其中:

  • TT 是树;
  • R(T)R(T) 是叶节点误差;
  • L(T)L(T) 是叶节点集合;
  • α\alpha 惩罚叶节点数量。

α\alpha 越大,越偏好更小的树。它体现了“再降低一点训练误差,是否值得增加一个规则区域”的权衡。

6. 树模型不等于集成树模型

需要区分三种概念:

  1. 决策树:单棵树,规则直观,但方差可能较高;
  2. 随机森林:训练许多具有随机性的树,再平均或投票,通常降低方差;
  3. 梯度提升树:顺序训练多棵树,每棵树拟合前面模型的残差或负梯度方向,通常具有较强表达能力,但对学习率、树数量和深度较敏感。

树模型通常不要求对数值特征做标准化,因为切分只关心大小顺序。例如把特征从米改成厘米不会改变排序,也不会改变候选划分的相对关系。线性模型、距离模型和神经网络通常更依赖合适的缩放。

树模型也不是“完全不需要数据处理”。缺失值、类别变量、高基数 ID、时间泄漏、异常标签和训练测试分布变化仍然需要单独处理。某个具体库是否原生支持缺失值或类别特征属于实现和版本问题,不能把一个库的能力当作树模型的数学保证。

四、正则化:在拟合误差和复杂度之间做约束

1. 为什么需要正则化

如果模型有足够多的自由度,它可能利用训练数据中的偶然噪声。正则化通过在目标函数中加入复杂度惩罚,使模型不容易使用过大的参数或过于复杂的结构:

训练损失+λ复杂度\text{训练损失}+\lambda\cdot\text{复杂度}

λ\lambda 控制惩罚强度:

  • λ=0\lambda=0:不使用该正则化;
  • λ\lambda 增大:模型通常更简单,训练误差可能升高;
  • λ\lambda 过大:可能导致欠拟合。

正则化不能修复标签错误、严重泄漏或训练测试分布完全不同的问题。它主要处理的是模型复杂度与方差。

2. Ridge:L2 正则化

Ridge 回归的目标为:

minw,bi=1n(wxi+byi)2+λw22\min_{w,b} \sum_{i=1}^{n}(w^\top x_i+b-y_i)^2+ \lambda\|w\|_2^2

通常不惩罚截距 bb,因为截距用于调整整体均值,不应被无条件压缩。

忽略截距并写成矩阵形式:

J(w)=Xwy22+λwwJ(w)=\|Xw-y\|_2^2+\lambda w^\top w

求导:

J(w)=2X(Xwy)+2λw\nabla J(w)=2X^\top(Xw-y)+2\lambda w

令梯度为零:

XXw+λw=XyX^\top Xw+\lambda w=X^\top y

因此:

w^=(XX+λI)1Xy\hat w=(X^\top X+\lambda I)^{-1}X^\top y

与普通最小二乘相比,λI\lambda I 使矩阵更稳定,并压缩参数幅度。对于高度相关的特征,Ridge 往往将权重分摊到多个相关特征上,而不是任意选择其中一个。

3. Lasso:L1 正则化

Lasso 使用绝对值惩罚:

minw,bi=1n(wxi+byi)2+λw1\min_{w,b} \sum_{i=1}^{n}(w^\top x_i+b-y_i)^2+ \lambda\|w\|_1

其中:

w1=j=1dwj\|w\|_1=\sum_{j=1}^{d}|w_j|

L1 惩罚具有产生精确零系数的倾向,因此可以形成稀疏模型,起到部分特征选择作用。

但“被 Lasso 置零”不等价于“该特征在现实中没有作用”。当多个特征高度相关时,Lasso 可能任意保留其中一部分;不同训练样本或轻微数据变化可能导致选择结果改变。

4. Elastic Net

Elastic Net 同时使用 L1 和 L2:

minw,bLoss(w,b)+λ(αw1+1α2w22)\min_{w,b} \text{Loss}(w,b)+ \lambda\left( \alpha\|w\|_1+ \frac{1-\alpha}{2}\|w\|_2^2 \right)

α=1\alpha=1 接近 Lasso,α=0\alpha=0 接近 Ridge。它在高维特征、相关特征成组出现的场景中常比单独 Lasso 更稳定。

5. 分类模型中的正则化

逻辑回归也可以使用:

交叉熵+λw22\text{交叉熵}+\lambda\|w\|_2^2

正则化会限制逻辑分数 wx+bw^\top x+b 的幅度,使概率不容易极端地接近 0 或 1。它可能改善泛化,也可能改变概率校准,因此分类模型的阈值和概率质量应在独立验证数据上检查。

6. 树模型中的正则化含义不同

在线性模型中,正则化主要限制参数范数;在树模型中,正则化更多限制结构:

  • 树的深度;
  • 叶节点数量;
  • 叶内样本量;
  • 每次切分要求的损失下降;
  • 集成模型中的树数量、学习率和采样比例。

因此不能简单地说“树模型不需要正则化”。一棵无限生长的树可以把训练样本逐个分开,正是典型的高方差模型。

7. 正则化参数必须通过验证选择

正则化强度属于超参数,不能用测试集反复调节。可使用交叉验证:

  1. 将训练数据划分为多个折;
  2. 对每个候选 λ\lambda,在部分折上训练;
  3. 在剩余折上评估;
  4. 汇总各折结果;
  5. 选择验证性能合适的 λ\lambda
  6. 最后用完整训练集重训;
  7. 只评估一次测试集。

预处理也必须在每个训练折内部拟合。例如标准化的均值和方差不能先用全部数据计算,否则验证折的信息已经泄漏到训练过程。

五、一个可运行的分类与回归比较示例

下面示例使用 scikit-learn 的合成数据,比较逻辑回归、决策树和 Ridge 回归。示例依赖 Python、NumPy、scikit-learn,安装方式可按项目环境执行:

python -m pip install numpy scikit-learn

代码:

import numpy as np

from sklearn.datasets import make_classification, make_regression
from sklearn.linear_model import LogisticRegression, Ridge
from sklearn.metrics import (
    accuracy_score,
    mean_squared_error,
    roc_auc_score,
)
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier


# ---------- 分类 ----------
X_cls, y_cls = make_classification(
    n_samples=1200,
    n_features=10,
    n_informative=5,
    n_redundant=2,
    weights=[0.7, 0.3],
    random_state=42,
)

X_train, X_test, y_train, y_test = train_test_split(
    X_cls,
    y_cls,
    test_size=0.25,
    stratify=y_cls,
    random_state=42,
)

# 标准化只在训练集上拟合,Pipeline 会自动保证这一点
logistic = make_pipeline(
    StandardScaler(),
    LogisticRegression(C=1.0, max_iter=1000, random_state=42),
)

# 树模型通常不需要标准化
tree = DecisionTreeClassifier(
    max_depth=4,
    min_samples_leaf=10,
    random_state=42,
)

for name, model in [("logistic", logistic), ("tree", tree)]:
    model.fit(X_train, y_train)
    pred = model.predict(X_test)
    prob = model.predict_proba(X_test)[:, 1]

    print(
        name,
        "accuracy=", round(accuracy_score(y_test, pred), 3),
        "roc_auc=", round(roc_auc_score(y_test, prob), 3),
    )


# ---------- 回归 ----------
X_reg, y_reg = make_regression(
    n_samples=1000,
    n_features=20,
    n_informative=8,
    noise=15.0,
    random_state=42,
)

X_train, X_test, y_train, y_test = train_test_split(
    X_reg,
    y_reg,
    test_size=0.25,
    random_state=42,
)

ridge = make_pipeline(
    StandardScaler(),
    Ridge(alpha=10.0),
)

ridge.fit(X_train, y_train)
pred = ridge.predict(X_test)

print(
    "ridge",
    "rmse=", round(np.sqrt(mean_squared_error(y_test, pred)), 3),
)

每一步的含义如下:

  • make_classification 生成带有 informative 和 redundant 特征的二分类数据;
  • stratify=y_cls 使训练集和测试集的类别比例大致一致;
  • StandardScaler 的均值和标准差只从训练数据估计;
  • LogisticRegression 输出类别和概率;
  • DecisionTreeClassifier 通过 max_depthmin_samples_leaf 限制树复杂度;
  • make_regression 生成连续目标;
  • Ridge(alpha=10.0) 使用 L2 正则化;
  • 分类同时输出 Accuracy 和 ROC-AUC,是因为类别决策与概率排序回答的是不同问题;
  • 回归使用 RMSE,它与目标变量使用相同单位,并且对大误差更敏感。

输出的具体数值取决于库版本和实现细节,不应把某一次合成数据实验的分数当作固定结论。运行时应重点观察:

  1. 训练集与测试集的差距;
  2. 逻辑回归与树模型在相同数据上的差异;
  3. 调整 max_depthmin_samples_leafalpha 后,验证集误差如何变化;
  4. 模型概率是否可以支持实际阈值决策。

六、评测:指标必须匹配任务和决策代价

1. 回归指标

给定真实值 yiy_i 和预测值 y^i\hat y_i

均方误差:

MSE=1ni=1n(yiy^i)2\operatorname{MSE} =\frac1n\sum_{i=1}^{n}(y_i-\hat y_i)^2

均方根误差:

RMSE=MSE\operatorname{RMSE}=\sqrt{\operatorname{MSE}}

平均绝对误差:

MAE=1ni=1nyiy^i\operatorname{MAE} =\frac1n\sum_{i=1}^{n}|y_i-\hat y_i|

RMSE 更强调大错误,MAE 对异常值相对不敏感。若业务要求“绝大多数预测不能偏离太多”,MAE 或分位数误差可能比 RMSE 更贴切。

平均绝对百分比误差(MAPE):

MAPE=100%niyiy^iyi\operatorname{MAPE} =\frac{100\%}{n}\sum_i \left|\frac{y_i-\hat y_i}{y_i}\right|

yiy_i 接近 0 时,MAPE 会爆炸;当目标可为负时,百分比解释也可能失真,不能机械使用。

2. 分类指标

混淆矩阵包含:

  • TP:实际为正且预测为正;
  • TN:实际为负且预测为负;
  • FP:实际为负但预测为正;
  • FN:实际为正但预测为负。

准确率:

Accuracy=TP+TNTP+TN+FP+FN\operatorname{Accuracy}=\frac{TP+TN}{TP+TN+FP+FN}

精确率:

Precision=TPTP+FP\operatorname{Precision}=\frac{TP}{TP+FP}

召回率:

Recall=TPTP+FN\operatorname{Recall}=\frac{TP}{TP+FN}

F1:

F1=2PrecisionRecallPrecision+RecallF1=\frac{2\cdot\operatorname{Precision}\cdot\operatorname{Recall}} {\operatorname{Precision}+\operatorname{Recall}}

在正类仅占 1% 的欺诈检测中,即使模型永远预测负类,准确率也可能达到 99%,但召回率为 0。因此类别不平衡时,必须查看正类指标、PR 曲线、混淆矩阵,不能只看 Accuracy。

ROC-AUC 衡量模型将随机正样本排在随机负样本前面的概率解释;它评价的是排序能力,不直接告诉你在某个业务阈值下会产生多少误报。正类极少时,PR-AUC 往往更能反映正类识别质量,但仍需结合实际基准率解释。

3. 概率、阈值与校准

一个模型可能排序能力很强,但概率不可靠。例如它把样本排序正确,却把所有概率压在 0.99 和 0.01 附近。若系统需要根据风险概率计算预期损失,就必须关注校准。

若所有预测为 0.7 的样本中约 70% 实际为正,则称该概率区间大致校准。可使用可靠性图、Brier score 等方法检查。

阈值选择应基于代价。设:

  • 误报代价为 CFPC_{FP}
  • 漏报代价为 CFNC_{FN}
  • 预测正类时产生的决策收益和其他成本已纳入。

如果模型概率已校准,最简单的二元代价模型下,预测为正的期望代价为:

(1p)CFP(1-p)C_{FP}

预测为负的期望代价为:

pCFNpC_{FN}

选择正类的条件是:

(1p)CFP<pCFN(1-p)C_{FP}<pC_{FN}

整理得:

p>CFPCFP+CFNp>\frac{C_{FP}}{C_{FP}+C_{FN}}

这说明阈值与代价有关,而不是固定等于 0.5。真实系统还应纳入人工审核容量、操作延迟、用户体验和合规风险。

七、误差分析:从“分数不好”定位到“哪里、为什么不好”

误差分析的目标不是再列一遍指标,而是把错误转化为可验证的假设。

1. 先区分训练误差、验证误差和测试误差

设:

  • 训练误差低,验证误差高:通常是过拟合或泄漏后的虚假拟合;
  • 训练误差和验证误差都高:通常是欠拟合、特征不足、标签噪声或任务不可预测;
  • 训练和验证都好,线上变差:可能是分布漂移、特征可用性变化、服务逻辑不一致或标签延迟;
  • 总体指标好,但关键群体差:平均值掩盖了切片性能问题。

不能仅凭训练集分数判断模型质量,因为训练误差只是优化目标,不是泛化误差。

2. 按样本切片分析

总体误差:

R=1ni=1niR=\frac1n\sum_{i=1}^{n}\ell_i

可能掩盖不同群体的差异。对切片 gg 分析:

Rg=1gigiR_g=\frac{1}{|g|}\sum_{i\in g}\ell_i

常见切片包括:

  • 新用户与老用户;
  • 不同地区、设备或渠道;
  • 不同价格区间;
  • 不同语言或文本长度;
  • 高价值与低价值客户;
  • 不同时间段;
  • 不同标签来源。

切片时要记录样本量和置信区间。一个只有十个样本的切片出现 100% 错误,不一定说明真实群体风险最高。

3. 按错误类型分析

分类任务可以分别检查:

  • FP:哪些负类被误判为正类;
  • FN:哪些正类被漏掉;
  • 高置信度错误:模型很确信但判断错;
  • 边界样本:概率接近阈值;
  • 标签冲突:相似输入对应不一致标签。

回归任务可以检查:

  • 残差 ei=yiy^ie_i=y_i-\hat y_i 与预测值的关系;
  • 残差与关键特征的关系;
  • 高误差样本是否集中在某个区间;
  • 是否存在异方差,即目标越大误差绝对值越大;
  • 是否有异常值或单位错误。

如果残差随预测值呈扇形扩散,说明误差方差可能随规模变化。此时可以考虑对目标取对数、使用加权损失或采用分位数回归,但必须根据业务目标验证,而不是只追求更好看的残差图。

4. 一个完整的误差分析流程

对测试集保留以下字段:

sample_id, y_true, y_pred, predicted_probability,
threshold, error_type, key_features, data_version

然后执行:

  1. 计算整体指标;
  2. 按真实标签和预测标签生成混淆矩阵;
  3. 按业务切片计算指标;
  4. 抽取高置信度错误;
  5. 检查原始输入、标签生成过程和特征时间;
  6. 判断错误属于数据问题、目标定义问题、特征缺失、模型偏差还是决策阈值问题;
  7. 对一个具体修改进行离线实验;
  8. 在固定测试集和新的时间切片上复验。

关键是把“错误原因”区分为可修复和不可修复两类。标签错误可以通过标注流程修复,缺失特征可以通过数据采集修复;但如果输入中没有任何能够预测目标的信息,换模型通常不会解决问题。

5. 统计不确定性与显著性

两个模型的测试集分数不同,不代表差异一定真实。对于分类指标,可以使用 bootstrap 对样本重采样,估计指标差异的置信区间;对于成对预测结果,可以使用适合任务的成对比较方法。

交叉验证的多个折并不是完全独立的实验,因此不能把每折结果简单当作独立样本进行任意显著性检验。更稳妥的做法是:

  • 预先确定主指标;
  • 固定数据切分和随机种子;
  • 报告均值与离散程度;
  • 使用重复实验或时间外推验证稳定性;
  • 同时报告实际业务收益,而不是只报告统计显著性。

八、常见误解与反例

误解一:模型越复杂,效果一定越好

反例是训练样本很少、特征噪声很大的数据。一棵不受限制的深树可以记住每个训练样本,训练准确率达到 100%,但测试准确率下降。限制深度或叶节点样本数会牺牲部分训练分数,却可能改善泛化。

误解二:线性模型只能解决非常简单的问题

如果原始输入是高维稀疏词袋特征,逻辑回归可能是强基线。它虽然决策边界线性,但词频、交互特征、正则化和良好标签可以使问题在该表示空间中接近线性。

误解三:树模型不需要任何归一化,所以不需要数据处理

树的阈值切分对单调缩放通常不敏感,但树仍然会受到错误单位、缺失机制、泄漏特征、重复样本和类别编码方式影响。无需标准化不等于无需验证特征语义。

误解四:正则化越强越不容易过拟合,因此越大越好

λ\lambda 过大时,线性模型权重被压缩到接近零,预测接近常数;树的深度过小则无法表示必要的交互。这是欠拟合。正则化只能通过验证数据选择,而不能凭直觉无限增加。

误解五:AUC 高就可以直接上线

AUC 只描述整体排序。若业务每天只能审核 100 条样本,必须考察排名前 100 条的精确率;若漏报代价高,必须考察指定召回率下的误报量;若输出概率用于计费,还必须考察校准。

误解六:特征重要性就是因果影响

树的 impurity importance 可能偏向取值种类多的特征,相关特征之间也会分摊或争夺重要性。线性系数同样不等于因果效应。重要性分析应结合置换重要性、局部解释、稳定性检查和因果设计。

九、深度学习与生成式 AI 中这些概念如何延续

深度神经网络仍然是监督学习模型,只是:

  • 线性层提供参数化映射;
  • 激活函数引入非线性;
  • 多层组合学习特征表示;
  • 交叉熵、均方误差等仍然是损失;
  • 权重衰减、Dropout、数据增强和早停承担正则化作用;
  • 验证集、测试集和误差分析仍然不可省略。

一个神经网络层可以写成:

h(l+1)=ϕ(W(l)h(l)+b(l))h^{(l+1)}=\phi(W^{(l)}h^{(l)}+b^{(l)})

若没有激活函数,多个线性层的复合仍可化为一个线性变换;非线性激活是深层表达能力的重要来源。

生成式 AI 也使用类似的监督目标。例如语言模型可在给定上下文 xx 时预测下一个 token yy,使用条件概率:

Pθ(yx)P_\theta(y\mid x)

并最小化负对数似然:

tlogPθ(yty<t,x)-\sum_t\log P_\theta(y_t\mid y_{<t},x)

但生成式系统的生产评测不只有 token 级损失,还要考虑事实性、拒答行为、提示注入、隐私泄漏、延迟、推理成本和权限边界。模型预测本身正确,不代表系统允许它访问或输出相关数据。

十、生产系统中的数据、权限、成本和故障边界

监督学习模型上线后,系统不再只有一个 predict 函数,而是包含:

数据采集
  -> 特征生成
  -> 模型推理
  -> 阈值/业务规则
  -> 结果存储或动作执行
  -> 反馈与标签回流

每一段都可能造成与模型无关的失败:

  • 特征生成超时导致默认值;
  • 线上特征与训练特征定义不一致;
  • 标签延迟导致近期评测虚高;
  • 模型版本与特征版本不匹配;
  • 类别映射变化导致预测含义改变;
  • 访问控制过宽导致训练数据或推理结果泄漏;
  • 高复杂度模型增加 CPU、内存、GPU 或网络成本;
  • 重试造成重复执行下游动作。

权限应按数据和动作分别控制。例如训练任务不应默认读取所有生产用户信息,推理服务不应因为需要读取特征而获得写入业务数据库的权限。日志中也不应直接记录身份证号、完整提示词或敏感标签。

成本属于模型选择的一部分。一个离线指标略高但推理成本、延迟和维护复杂度显著增加的模型,未必优于简单线性模型或浅层树。应至少记录:

  • 单次推理延迟和尾延迟;
  • 每批或每请求资源消耗;
  • 特征计算成本;
  • 模型加载和扩缩容成本;
  • 重新训练与回滚成本;
  • 人工审核或错误动作成本。

发布前应验证模型、特征、阈值和权限配置的组合,而不是只验证模型文件。回滚也必须恢复到相容的特征版本和决策规则,否则“模型回滚成功”仍可能产生错误预测。

十一、建立可复现的实验闭环

一个可审计的监督学习实验至少应固定:

  • 数据快照或数据版本;
  • 样本筛选规则;
  • 训练、验证、测试切分;
  • 特征生成代码;
  • 模型和超参数;
  • 随机种子;
  • 指标、阈值和校准方法;
  • 训练时间与资源消耗;
  • 误差分析切片;
  • 模型版本和发布环境。

实验流程可以概括为:

定义任务确认预测时点构造特征和标签按时间或实体切分建立线性基线比较树模型通过验证选择正则化评估阈值与校准误差分析上线监控\text{定义任务} \rightarrow \text{确认预测时点} \rightarrow \text{构造特征和标签} \rightarrow \text{按时间或实体切分} \rightarrow \text{建立线性基线} \rightarrow \text{比较树模型} \rightarrow \text{通过验证选择正则化} \rightarrow \text{评估阈值与校准} \rightarrow \text{误差分析} \rightarrow \text{上线监控}

线性模型提供可解释、低成本的基线;树模型提供非线性和交互能力;正则化控制模型复杂度;分类与回归指标反映不同目标;误差分析则把指标差异转化为数据和系统改进方向。只有将这些部分放入同一条数据、模型、评测、权限和成本链路中,监督学习模型才不仅是在测试集上得分,而是能够在真实生产环境中稳定地产生有效决策。


系列导航与关联阅读

官方资料

本文依据研究论文、标准组织与主流框架官方文档重新梳理;正文、示例与工程清单由 WR BLOG 编写。