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 示例:
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. 超参数选择包含不确定性
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. 模型交付记录
目标与使用范围
训练/验证/测试时间和实体边界
特征定义与可用时点
预处理参数和类别策略
候选模型与超参数搜索
总体与分组误差
预测区间覆盖
已知失效区间和 fallback
数据/代码/模型版本
监控与重训触发条件常见误区
- Lasso 归零表示特征无用:选择受尺度、相关性和 lambda 影响。
- 交叉验证前统一缩放没关系:验证折信息已泄漏。
- 随机 K-fold 适合所有数据:实体、时间和站点结构决定切分。
- 置信区间就是单个预测的范围:均值区间与预测区间不同。
练习
- 比较同一数据在缩放前后 ridge 系数与预测。
- 对重复队伍数据比较随机 K-fold 与 GroupKFold 分数。
- 用时间切分找出随机切分造成的未来泄漏。
- 报告 MAE、RMSE、基线和四个群体的误差与区间覆盖。
小结
正则化限制模型自由度,却不能替代独立评估。预处理必须进入 pipeline,切分必须反映真实泛化目标,测试集只能承担一次最终评估。模型输出还要连同区间、群体误差和失效范围交付。
下一章进入特征工程:特征不是越多越好,而是必须在预测时可获得、与实体和时间对齐,并由训练数据拟合转换参数。