特征工程
特征工程是将原始数据转换为更适合机器学习模型的特征的过程。在传统机器学习中,特征工程往往比模型选择更重要——"数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。"
特征工程概述
为什么特征工程重要?
- 提升模型性能:好的特征可以让简单模型达到复杂模型的效果
- 加速训练:减少冗余特征可以显著加速训练过程
- 增强可解释性:有意义的特征让模型决策更容易理解
- 减少过拟合:移除噪声特征有助于提升泛化能力
特征工程的一般流程
- 数据探索与理解
- 缺失值处理
- 特征编码
- 特征缩放
- 特征构造
- 特征选择
- 验证与迭代
特征选择
特征选择旨在从原始特征中选择最有价值的子集,去除冗余和噪声特征。
Filter 方法
Filter 方法独立于模型,仅依据统计指标评估特征与目标变量的相关性。
相关系数(Pearson Correlation):
衡量特征 \(X\) 与目标 \(Y\) 之间的线性相关性:
\(|r_{XY}|\) 接近 1 表示强线性相关。注意:Pearson 相关系数只能捕捉线性关系。
互信息(Mutual Information):
互信息衡量特征 \(X\) 与目标 \(Y\) 之间的任意依赖关系(包括非线性):
对于连续变量,可以使用 KNN 估计互信息(如 sklearn.feature_selection.mutual_info_classif)。
方差阈值(Variance Threshold):
移除方差低于阈值的特征。如果一个特征几乎不变化,它不太可能携带有用信息:
其他 Filter 方法:
- 卡方检验:适用于分类特征与分类目标
- ANOVA F 检验:适用于连续特征与分类目标
- Fisher Score:类间方差与类内方差之比
Wrapper 方法
Wrapper 方法将特征选择视为搜索问题,使用模型性能作为评估标准。
递归特征消除(RFE):
- 用所有特征训练模型
- 评估每个特征的重要度(如线性模型的系数绝对值)
- 移除最不重要的特征
- 重复步骤 1-3,直到达到目标特征数
RFE 的时间复杂度较高,为 \(O(d \cdot T_{\text{train}})\),其中 \(d\) 为特征数。
其他 Wrapper 方法:
- 前向选择(Forward Selection):从空集开始,每次加入一个最优特征
- 后向消除(Backward Elimination):从全集开始,每次移除一个最差特征
- 遗传算法:使用进化策略搜索最优特征子集
Embedded 方法
Embedded 方法在模型训练过程中自动执行特征选择。
L1 正则化(Lasso):
L1 正则化会将不重要特征的系数压缩为零,实现稀疏化。\(\alpha\) 越大,被置零的系数越多。
树模型特征重要度:
- 基于分裂的重要度:计算每个特征在所有树中被选为分裂特征时带来的信息增益之和
- 基于排列的重要度:打乱某个特征后,模型预测性能的下降量
| 方法类型 | 优点 | 缺点 | 典型方法 |
|---|---|---|---|
| Filter | 计算速度快、独立于模型 | 忽略特征间交互 | 相关系数、互信息、卡方检验 |
| Wrapper | 考虑特征交互 | 计算成本高、容易过拟合 | RFE、前向选择 |
| Embedded | 效率与效果兼顾 | 依赖于特定模型 | Lasso、树模型重要度 |
特征构造
特征构造是基于领域知识和数据特点,从现有特征中创建新特征的过程。
多项式特征
对于特征 \(x_1, x_2\),生成二次多项式特征:
sklearn.preprocessing.PolynomialFeatures 可以自动生成指定阶数的多项式特征。
注意:高阶多项式会导致特征数量爆炸(\(d\) 个特征的 \(k\) 阶多项式产生 \(\binom{d+k}{k}\) 个特征),需要配合正则化使用。
交互特征
手动创建有业务含义的交互特征,例如:
- 电商:
总消费金额 / 购买次数 = 客单价 - 金融:
负债总额 / 年收入 = 负债收入比 - 广告:
点击次数 / 展示次数 = 点击率
时间特征提取
从时间戳中提取多种有意义的特征:
- 周期性特征:年、月、日、小时、星期几、是否周末
- 时间差特征:距上次购买的天数、注册至今的天数
- 滑动窗口特征:过去 7 天/30 天的均值、最大值、标准差
- 正弦/余弦编码:对周期性特征编码以保留循环性:
文本特征
- 词袋模型(BoW):统计词频
- TF-IDF:
- 词嵌入:Word2Vec、GloVe 等预训练嵌入的平均值
特征编码
将非数值特征转换为数值形式是建模的必要步骤。
One-Hot Encoding
将类别特征转换为二进制向量。例如颜色 \(\{红, 绿, 蓝\}\) 编码为:
- 红:\([1, 0, 0]\)
- 绿:\([0, 1, 0]\)
- 蓝:\([0, 0, 1]\)
适用场景:类别数较少(\(< 20\))的无序类别特征。高基数特征会导致维度灾难。
Label Encoding
将每个类别映射为一个整数:红 \(\to 0\),绿 \(\to 1\),蓝 \(\to 2\)。
注意:Label Encoding 会引入人为的大小关系,通常只适用于有序类别(如学历:高中 < 本科 < 硕士 < 博士)或树模型(树模型不受顺序影响)。
Target Encoding
用目标变量的条件均值替换类别值:
其中 \(n_k\) 为类别 \(k\) 的样本数,\(\bar{y}_k\) 为类别 \(k\) 的目标均值,\(m\) 为平滑参数,\(\bar{y}_{\text{global}}\) 为全局目标均值。
风险:容易导致目标泄露(target leakage),必须在交叉验证内进行编码。
WoE(Weight of Evidence)
主要用于信用评分领域:
对应的信息值(IV)衡量特征的预测能力:
| IV 范围 | 预测能力 |
|---|---|
| \(< 0.02\) | 无用 |
| \(0.02 - 0.1\) | 弱 |
| \(0.1 - 0.3\) | 中等 |
| \(0.3 - 0.5\) | 强 |
| \(> 0.5\) | 可疑(可能过拟合) |
特征缩放
不同特征的量纲和数值范围差异可能严重影响模型性能。
StandardScaler(标准化)
将特征缩放到均值为 0、标准差为 1:
适用场景:大多数模型,尤其是基于距离的模型(SVM、KNN)和梯度优化的模型(线性回归、神经网络)。
MinMaxScaler(归一化)
将特征缩放到 \([0, 1]\) 区间:
适用场景:需要有界输入的模型(如神经网络的某些激活函数)。对异常值敏感。
RobustScaler
使用中位数和四分位距,对异常值更鲁棒:
其中 \(\text{IQR} = Q_3 - Q_1\)。
| 缩放方法 | 是否保持分布形状 | 对异常值敏感 | 适用场景 |
|---|---|---|---|
| StandardScaler | 是 | 是 | 通用、基于梯度的模型 |
| MinMaxScaler | 是 | 非常敏感 | 有界输入、图像数据 |
| RobustScaler | 是 | 否 | 含异常值的数据 |
注意:树模型(决策树、随机森林、XGBoost 等)对特征缩放不敏感。
缺失值处理
常用插补策略
| 策略 | 方法 | 适用场景 |
|---|---|---|
| 删除 | 删除含缺失值的行或列 | 缺失比例低(\(< 5\%\)) |
| 均值/中位数 | 用特征的均值或中位数填充 | 数值特征、缺失随机 |
| 众数 | 用最频繁的值填充 | 类别特征 |
| 常数 | 用特定值(如 -1, "Unknown")填充 | 缺失本身有意义 |
| 插值 | 线性插值、样条插值 | 时间序列数据 |
| KNN 插补 | 用最近邻的值填充 | 样本间有相似性 |
MICE(Multiple Imputation by Chained Equations)
MICE 是一种多重插补方法,迭代地对每个含缺失值的特征进行条件建模:
- 对所有缺失值进行初始填充(如均值填充)
- 对于每个含缺失值的特征 \(X_j\): - 将 \(X_j\) 视为目标变量,其他特征作为输入 - 用非缺失样本训练回归模型 - 用训练好的模型预测缺失值
- 重复步骤 2 多轮,直到收敛
- 重复整个过程 \(M\) 次,生成 \(M\) 个完整数据集
MICE 的优势在于能利用特征间的相关性,并且通过多重插补量化不确定性。
自动特征工程
Featuretools
Featuretools 是一个自动特征工程库,基于深度特征合成(Deep Feature Synthesis, DFS):
- 定义实体集和关系(如用户-订单-商品的关系)
- 自动生成聚合特征(如每个用户的平均订单金额)和转换特征(如时间差)
- 支持自定义原语(primitives)
AutoFeat
AutoFeat 自动构造并选择非线性特征:
- 通过特征的算术运算(加减乘除、对数、平方根等)生成大量候选特征
- 使用 L1 正则化从候选特征中选择最有用的子集
- 生成可解释的特征表达式
特征工程 Pipeline 最佳实践
防止数据泄露
- 所有变换必须在训练集上拟合,然后应用到测试集
- 使用
sklearn.pipeline.Pipeline确保正确的顺序 - Target Encoding 必须在交叉验证内部进行
推荐的 Pipeline 顺序
原始数据
→ 缺失值处理(MICE / 简单插补)
→ 特征编码(One-Hot / Target Encoding)
→ 特征构造(多项式 / 交互特征)
→ 特征缩放(StandardScaler / RobustScaler)
→ 特征选择(Embedded / Filter)
→ 模型训练
注意事项
- 先分割数据,再做特征工程:避免用测试集信息影响训练
- 记录所有变换:确保生产环境能复现训练时的特征处理
- 监控特征漂移:部署后持续监控特征分布的变化
- 保持简洁:特征不是越多越好,过多的特征可能导致过拟合和维护困难
不同模型对特征工程的需求
| 模型 | 是否需要缩放 | 是否需要编码 | 能否处理缺失值 | 是否需要特征选择 |
|---|---|---|---|---|
| 线性回归/逻辑回归 | 是 | 是 | 否 | 推荐 |
| SVM | 是 | 是 | 否 | 推荐 |
| KNN | 是 | 是 | 否 | 推荐 |
| 决策树 | 否 | 否(可用 Label) | 部分支持 | 可选 |
| Random Forest | 否 | 否(可用 Label) | 部分支持 | 可选 |
| XGBoost / LightGBM | 否 | 部分需要 | 是 | 可选 |
| 神经网络 | 是 | 是 | 否 | 推荐 |