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