跳到内容

6.3 正则化、交叉验证与预测区间:模型选择不能偷看答案

预言厅的候选模型在训练集上越来越好,换一批记录却迅速失准,模型选择流程可能已经偷看了答案。

加入更多特征后,训练误差持续下降,测试误差却上升。正则化可以限制模型自由度,但正则强度、缩放和特征处理都必须只在训练折内学习,否则交叉验证只是形式上的隔离。

本课目标

  • 区分 ridge、lasso 与 elastic net 的目标;
  • 用 pipeline 把预处理放入交叉验证;
  • 根据独立、分组或时间结构选择切分;
  • 报告基线、预测误差和预测区间。

1. Ridge 与 Lasso 惩罚不同

Ridge:

$$ \min_\beta\sum_i(y_i-x_i^T\beta)^2+\lambda\sum_j\beta_j^2. $$

Lasso:

$$ \min_\beta\sum_i(y_i-x_i^T\beta)^2+\lambda\sum_j|\beta_j|. $$

  • ridge 连续收缩相关特征系数,通常不精确归零;
  • lasso 可产生稀疏解,但相关特征间选择可能不稳定;
  • elastic net 混合 L1/L2,常在相关特征组中更稳健。

截距通常不惩罚,具体库行为需确认。惩罚改变了估计目标;正则化系数不能直接按普通 OLS p 值解释。

2. 缩放决定惩罚公平性

一个以字节计、一个以比例计的特征尺度差异巨大。相同系数惩罚在原尺度上代表不同函数变化,所以正则化前通常标准化数值特征。

标准化参数只能在每个训练折拟合。scikit-learn pipeline 示例:

python
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.linear_model import Ridge
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler

numeric = ["team_size", "resources_used"]
categorical = ["mission_type"]

preprocess = ColumnTransformer([
    ("num", Pipeline([
        ("impute", SimpleImputer(strategy="median")),
        ("scale", StandardScaler()),
    ]), numeric),
    ("cat", OneHotEncoder(handle_unknown="ignore"), categorical),
])

pipeline = Pipeline([
    ("preprocess", preprocess),
    ("model", Ridge()),
])

先对全数据标准化再 cross-validation,会让验证折影响均值、方差和类别表。

3. 三层数据职责

  • training:拟合参数;
  • validation/CV:选择特征、模型与超参数;
  • test:只在最终方案固定后估计泛化表现。

反复查看 test 结果再调整模型,test 已成为验证集。需要保留新的独立数据,或诚实报告评估偏乐观。

小数据可用 nested cross-validation:内层选择超参数,外层估计选择流程表现。成本更高,但能避免同一 CV 分数既选模型又当最终无偏评估。

4. 切分单位必须匹配应用

独立样本

随机 K-fold 可用,但保持目标和重要群体分布。

重复实体

同一用户或队伍不能同时出现在训练与验证,否则模型可能记住实体。使用 group split。

时间预测

训练必须早于验证;随机打散会用未来分布预测过去。使用 rolling/expanding window,并在特征窗口与标签窗口之间设置必要 gap。

空间或站点泛化

若目标是部署到新堡垒,应按堡垒留出,而不是在每个堡垒内部随机切行。

5. 超参数选择包含不确定性

python
from sklearn.model_selection import GridSearchCV, GroupKFold

search = GridSearchCV(
    pipeline,
    param_grid={"model__alpha": [0.01, 0.1, 1.0, 10.0, 100.0]},
    scoring="neg_mean_absolute_error",
    cv=GroupKFold(n_splits=5),
)
search.fit(X_train, y_train, groups=team_ids_train)

评分指标应与业务损失一致。搜索范围、折分随机性和候选数量都会影响“最佳”alpha。可使用 one-standard-error rule 选择性能接近但更简单的模型。

6. 指标与基线

  • MAE:目标单位,较少放大极端误差;
  • RMSE:平方惩罚,大误差权重高;
  • $R^2$:相对均值基线的平方误差改善;
  • MAPE:零值附近不稳定,并对低值偏重。

至少比较:

  • 训练集均值/中位数基线;
  • 简单业务规则;
  • 当前生产模型;
  • 新候选模型。

总体平均还要按群体、时间和目标范围切分,防止某一大群体掩盖小群体严重误差。

7. 预测区间不是均值区间

均值响应置信区间估计 $E[Y|X=x]$;新观测预测区间还包含个体噪声,通常更宽。

同方差线性模型可给解析区间,但分布错设、异方差和分布漂移会破坏覆盖。可考虑:

  • 条件方差模型;
  • 分位数回归;
  • conformal prediction(在交换性等条件下提供边际覆盖);
  • 按群体检查实际覆盖率。

只报告点预测会让用户误以为模型精度相同。区间宽度本身也是决策信息。

8. Lasso 选择不等于稳定解释

在高度相关特征中,lasso 可能随机保留一个、把另一个压零;换一个折或轻微扰动数据,选择就变化。零系数不证明特征“没有作用”,非零也不代表因果重要。

评估:

  • bootstrap/折间选择频率;
  • 系数路径;
  • 相关特征组;
  • out-of-sample 性能;
  • 领域合理性。

若目标是确认性变量选择和推断,需要专门方法和预设分析,不能先用 lasso 筛选再把普通 OLS p 值当未选择过。

9. 模型交付记录

text
目标与使用范围
训练/验证/测试时间和实体边界
特征定义与可用时点
预处理参数和类别策略
候选模型与超参数搜索
总体与分组误差
预测区间覆盖
已知失效区间和 fallback
数据/代码/模型版本
监控与重训触发条件

常见误区

  • Lasso 归零表示特征无用:选择受尺度、相关性和 lambda 影响。
  • 交叉验证前统一缩放没关系:验证折信息已泄漏。
  • 随机 K-fold 适合所有数据:实体、时间和站点结构决定切分。
  • 置信区间就是单个预测的范围:均值区间与预测区间不同。

练习

  1. 比较同一数据在缩放前后 ridge 系数与预测。
  2. 对重复队伍数据比较随机 K-fold 与 GroupKFold 分数。
  3. 用时间切分找出随机切分造成的未来泄漏。
  4. 报告 MAE、RMSE、基线和四个群体的误差与区间覆盖。

小结

正则化限制模型自由度,却不能替代独立评估。预处理必须进入 pipeline,切分必须反映真实泛化目标,测试集只能承担一次最终评估。模型输出还要连同区间、群体误差和失效范围交付。

下一章进入特征工程:特征不是越多越好,而是必须在预测时可获得、与实体和时间对齐,并由训练数据拟合转换参数。

Built with VitePress | Software Systems Atlas