9.2 特征编码与缩放
9.1 节的回归方程只接收数值列,真实配送表却会混合公里、金额、队列数量、区域与车型。编码和缩放不只是为了满足 API,它们定义了回归平面、系数惩罚与解释所处的坐标系。
把类别转换成诚实的几何结构
vehicle_type 是无序类别:自行车、汽车和厢式货车有不同身份,却没有天然数值距离。如果编码为 0、1、2,模型会被迫接受一个人为顺序,还会暗示汽车正好位于自行车与货车中间。这些关系并不属于数据契约。
独热编码(one-hot encoding)会为每个训练期类别建立独立指示方向:
| 车型 | bike | car | van |
|---|---|---|---|
| bike | 1 | 0 | 0 |
| car | 0 | 1 | 0 |
| van | 0 | 0 | 1 |
模型现在可以为每类学习独立偏移,不必假设等距。若模型还包含截距,完整 one-hot 列之和恒为 1,因此存在精确冗余。一种传统参数化方式是删除一个参考水平,其余类别系数就表示相对参考类别的差异。即使单个系数依赖参数化选择,预测仍可能是唯一的。
删除一个参考指示列与删除整个类别特征不是一回事。也不要把参考类别解释成普遍“正常”群体;它只是坐标选择。
线上可能出现训练时没见过的类别。handle_unknown="ignore" 会把它在该编码分支映射为全零,而不是让预测崩溃。这只是明确后备行为,不表示模型已经理解新类别;仍要监控出现频率并决定合理处置。
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
numeric_columns = ["distance_km", "amount", "queue_size"]
categorical_columns = ["zone", "vehicle_type"]
preprocess = ColumnTransformer([
("numeric", Pipeline([
("impute", SimpleImputer(strategy="median")),
("scale", StandardScaler()),
]), numeric_columns),
("categorical", Pipeline([
("impute", SimpleImputer(strategy="most_frequent")),
("onehot", OneHotEncoder(handle_unknown="ignore")),
]), categorical_columns),
], remainder="drop")类别词表和填充值都是学得状态,必须与回归系数一样,只在每个训练折内拟合。
惩罚或比较系数前先统一坐标尺度
StandardScaler 会学习每个训练列的均值 与标准差 ,再执行:
与 必须来自当前训练折。验证值超出训练范围并不违规;为了让 “看起来正常”就强行裁切,反而会隐藏潜在部署漂移。
只要系数与截距能相应调整,无正则化 OLS 的预测通常不受一致单位转换影响。把距离从公里改成米会让原始系数缩小 1000 倍,却不会让距离的重要性下降 1000 倍。因此,不同单位的原始系数绝对值不能直接排名。
对 Ridge 和 Lasso 来说,缩放尤其重要,因为它们的惩罚直接作用于系数大小。如果不缩放,同样的预测贡献在一个特征上可能需要大系数,在另一个特征上只需小系数;正则化会因为任意单位而不公平收缩。
数值输入标准化后,一个系数表示:其他建模特征保持不变时,该特征增加一个训练期标准差,预测目标会改变多少。数值系数因此更可比较,但并不会自动变成因果效应,也不保证在所有人群中稳定。
from sklearn.linear_model import Ridge
regression_pipeline = Pipeline([
("preprocess", preprocess),
("regressor", Ridge(alpha=1.0)),
])
regression_pipeline.fit(X_train, y_train)
feature_names = regression_pipeline[
"preprocess"
].get_feature_names_out()
coefficients = regression_pipeline["regressor"].coef_多元回归系数要按条件关系解释:其他建模特征固定时,某特征改变会让模型预测怎样变化。这不同于边际散点图——图中相关特征会一起变化。如果年龄与经验高度相关,它们可能在不同折之间重新分配权重,即使整体预测几乎不变。
因此要画出各验证折中的系数分布。单次拟合的大系数可能来自单位选择、共线性、抽样噪声或外推区间;缩放只修复其中的单位问题。
特征矩阵现在有了明确几何。下一节要衡量预测到底偏离多远、严重失误应该获得多大权重,以及“优于基线”在数值与图形上意味着什么。