3. 特征工程基础回顾:特征类型、缩放编码与选择降维

在历史项目故障排查中,超过 60% 的成本超支根因可追溯到特征工程阶段的错误决策。本章系统回顾特征工程的核心基础,为后续章节的故障诊断与成本优化建立统一术语与判断基准。

3.1 特征类型与处理策略

特征类型决定了后续缩放、编码与模型选择的路径。错误识别特征类型是历史项目中最常见的故障模式之一。

特征类型 典型示例 常见故障点 推荐处理方式
数值型(连续) 温度、价格、长度 未做缩放导致梯度爆炸 标准化 / 归一化
数值型(离散) 订单数量、访问次数 当作类别型过度编码 保留数值或分箱
类别型(有序) 教育等级、满意度 使用独热丢失顺序信息 标签编码 / 目标编码
类别型(无序) 颜色、城市、部门 基数过高导致维度灾难 独热 / 频率编码 / 哈希
文本型 日志、描述、评论 未清洗噪声或停用词 TF-IDF / Word2Vec / BERT
时间序列 股价、传感器读数 泄露未来信息 滞后特征 / 滑动窗口
故障排查要点: 在历史项目中,经常出现将离散数值型特征(如“用户年龄”)误判为类别型并使用独热编码,导致特征维度膨胀 10 倍以上,直接推高存储与训练成本。务必先做 df.dtypes 与 nunique() 联合检查。

3.2 特征缩放与编码

3.2.1 特征缩放方法对比

方法 公式 适用场景 对异常值敏感度
标准化 (Z-score) \( x' = \frac{x - \mu}{\sigma} \) 数据近似正态分布 中等
Min-Max 归一化 \( x' = \frac{x - min}{max - min} \) 有界范围,如像素值 高
Robust 缩放 \( x' = \frac{x - median}{IQR} \) 含较多异常值 低
MaxAbs 缩放 \( x' = \frac{x}{\max(|x|)} \) 稀疏数据 高

3.2.2 类别编码策略

  • 标签编码 (Label Encoding):将类别映射为整数 0,1,2,…。适用于有序类别或树模型。
  • 独热编码 (One-Hot Encoding):每个类别生成一个二进制列。适用于无序低基数类别。
  • 目标编码 (Target Encoding):用目标变量的均值替换类别。适用于高基数特征,但需注意过拟合。
  • 频率编码 (Frequency Encoding):用类别出现频率替换。适用于分布极不均匀的场景。
成本陷阱警示: 某历史项目对 5000 个类别的城市特征使用独热编码,导致特征维度从 20 暴增至 5020,训练时间增加 8 倍,模型 AUC 反而下降 2%。改用目标编码后,特征维度不变,AUC 提升 3%,训练时间降低 70%。
特征编码与缩放决策流程 原始特征 数值型? 是/否 是 数值缩放 标准化 / Min-Max Robust / MaxAbs 否 类别编码 独热 / 标签 / 目标 频率 / 哈希编码 特征矩阵就绪

3.3 特征选择与降维

特征选择与降维是控制模型复杂度、降低训练成本、提升泛化能力的关键手段。在历史项目中,盲目保留全部特征是最常见的成本浪费来源之一。

3.3.1 特征选择方法

方法类别 代表算法 原理 适用场景
过滤法 方差阈值、卡方检验、互信息 独立于模型,基于统计量排序 快速初筛,高维数据
包裹法 递归特征消除 (RFE) 基于模型性能迭代选择 特征数较少,追求最优子集
嵌入法 Lasso、树模型特征重要性 训练过程中自动选择 兼顾效率与效果

3.3.2 Lasso 特征选择

Lasso (L1 正则化) 通过向损失函数添加权重值之和的惩罚项,将不重要特征的系数压缩至零,实现自动特征选择。

from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler

# 标准化(Lasso 对尺度敏感)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Lasso 特征选择
lasso = Lasso(alpha=0.01)  # alpha 控制正则化强度
lasso.fit(X_scaled, y)

# 获取被选中的特征
selected_features = X.columns[lasso.coef_ != 0]
print(f"原始特征数: {X.shape[1]}")
print(f"选中特征数: {len(selected_features)}")
print(f"被剔除特征: {list(set(X.columns) - set(selected_features))}")
成本优化案例: 某金融风控项目原始特征 120 个,使用 Lasso (alpha=0.05) 后仅保留 23 个特征,模型 AUC 从 0.82 提升至 0.85,训练时间减少 78%,推理延迟降低 65%,每年节省计算成本约 $12,000。

3.3.3 PCA 降维

主成分分析 (PCA) 通过正交变换将原始特征转换为线性不相关的主成分,按方差贡献率排序,保留前 k 个主成分实现降维。

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import numpy as np

# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# PCA 降维
pca = PCA(n_components=0.95)  # 保留 95% 方差
X_pca = pca.fit_transform(X_scaled)

print(f"原始维度: {X_scaled.shape[1]}")
print(f"降维后维度: {X_pca.shape[1]}")
print(f"各主成分方差占比: {np.round(pca.explained_variance_ratio_, 3)}")
print(f"累计方差占比: {np.round(np.cumsum(pca.explained_variance_ratio_), 3)}")
特征选择与降维方法对比 过滤法 代表算法: 方差阈值、卡方检验 互信息、相关系数 优点: 计算快、独立于模型 适合高维数据初筛 缺点: 忽略特征交互 阈值选择主观 成本:低 嵌入法 代表算法: Lasso (L1 正则化) 树模型特征重要性 优点: 训练中自动选择 兼顾效率与效果 缺点: 依赖模型选择 正则化参数需调优 成本:中 降维法 代表算法: PCA、t-SNE UMAP、Autoencoder 优点: 消除多重共线性 可视化友好 缺点: 可解释性下降 信息损失风险 成本:中高 可组合 可组合

3.4 特征工程常见故障模式速查

故障模式 典型症状 排查方向 修复成本
特征类型误判 维度爆炸、模型不收敛 检查 dtypes 与 nunique() 低
缩放缺失 梯度爆炸、SVM 性能差 检查特征值域差异 低
编码方式不当 过拟合、训练时间过长 评估基数与模型类型 中
特征冗余过多 训练慢、泛化差 使用 Lasso 或 PCA 诊断 中
降维过度 模型性能骤降 检查方差保留比例 低
时间泄露 线上效果远差于线下 检查时间轴切分 高
实践建议: 在历史项目复盘时,建议按以下顺序进行特征工程审计:
1. 特征类型正确性 → 2. 缩放与编码合理性 → 3. 特征选择必要性 → 4. 降维策略有效性。
每一步的修复成本依次递增,但收益也往往集中在前期步骤。