1. 特征工程在机器学习项目中的核心地位
刚接触机器学习的新手常犯一个错误——拿到数据后直接往模型里灌,结果发现效果惨不忍睹。我在2016年参与银行风控项目时就吃过这个亏,当时用原始数据训练的模型AUC只有0.65,经过两周的特征工程后直接提升到0.82。这个经历让我深刻认识到:特征工程才是机器学习项目真正的胜负手。
特征工程本质上是将原始数据转化为更能代表问题本质的特征的过程。就像厨师处理食材,数据科学家需要:
- 清洗"变质数据"(缺失值/异常值处理)
- 切割"食材"(特征分箱/离散化)
- 调配"酱料"(特征交叉/组合)
- 控制"火候"(特征选择/降维)
2. 简单特征探索方法论
2.1 数据质量诊断四步法
我习惯用这个检查清单开始每个新项目:
- 缺失值扫描
import pandas as pd missing_rates = df.isnull().mean().sort_values(ascending=False) print(missing_rates[missing_rates > 0].head(10))重要经验:缺失率超过30%的特征建议直接剔除,除非业务上能证明其重要性
- 异常值检测
- 数值型:IQR方法(比3σ更鲁棒)
- 分类型:检查取值分布是否合理
- 数据类型验证
df.dtypes.value_counts()特别注意object类型可能隐藏的数据质量问题
- 描述统计审查
df.describe(include='all').T2.2 特征分布分析实战技巧
2.2.1 数值特征分析
我常用的可视化组合:
import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 3, figsize=(15,4)) df['age'].plot(kind='hist', bins=30, ax=axes[0]) df['age'].plot(kind='box', ax=axes[1]) pd.plotting.scatter_matrix(df[['age','income']], ax=axes[2])2.2.2 类别特征分析
重点关注:
- 类别数量(超过20个要考虑编码策略)
- 类别分布(长尾分布需要特殊处理)
- 与目标变量的相关性
pd.crosstab(df['education'], df['target']).plot(kind='bar', stacked=True)3. 特征变换基础操作
3.1 数值特征标准化
为什么需要标准化?
- 量纲差异导致模型偏差
- 梯度下降类算法需要
常用方法对比:
| 方法 | 公式 | 适用场景 |
|---|---|---|
| Z-score | (x-μ)/σ | 分布近似正态 |
| MinMax | (x-min)/(max-min) | 有明确边界 |
| Robust | (x-median)/IQR | 存在异常值 |
3.2 类别特征编码
我的选择策略:
- OrdinalEncoder:有序类别
- OneHotEncoder:无序且类别少(<10)
- TargetEncoder:高基数类别
- Embedding:超多类别(如用户ID)
踩坑记录:OneHot后一定要用
drop='first'避免多重共线性
4. 特征交互与构造
4.1 基础交互方法
- 算数运算:A+B, A/B等
- 多项式特征:sklearn的PolynomialFeatures
- 业务知识驱动:如金融中的负债收入比
4.2 时间特征处理
时间戳至少拆解出:
df['hour'] = df['timestamp'].dt.hour df['dayofweek'] = df['timestamp'].dt.dayofweek df['is_weekend'] = df['dayofweek'] >= 55. 特征选择策略
5.1 过滤式方法
- 方差阈值:移除低方差特征
- 卡方检验:分类问题
- 互信息法:非线性关系
5.2 嵌入式方法
- L1正则化(Lasso)
- 树模型的特征重要性
5.3 实战建议
我通常的流程:
- 先用过滤法去掉明显无关特征
- 用嵌入式方法进一步筛选
- 最后用包裹法优化(计算成本高)
6. 特征工程效果验证
6.1 评估指标选择
- 分类:AUC/KS/F1
- 回归:RMSE/R²
- 聚类:轮廓系数
6.2 验证方法
我的黄金准则:
- 一定要在验证集/测试集上评估
- 采用交叉验证避免数据泄露
- 记录每次特征工程的版本和结果
from sklearn.model_selection import cross_val_score baseline = cross_val_score(model, X_raw, y, cv=5).mean() improved = cross_val_score(model, X_processed, y, cv=5).mean() print(f"特征工程带来{improved - baseline:.4f}的AUC提升")7. 工程化实践建议
- 可复现性:用Pipeline封装处理流程
from sklearn.pipeline import make_pipeline pipe = make_pipeline( SimpleImputer(strategy='median'), StandardScaler(), SelectKBest(k=20) )- 性能优化:
- 对大类别特征使用hash编码
- 对稀疏特征使用CSR格式存储
- 使用category类型减少内存占用
- 监控机制:
- 特征稳定性PSI检测
- 线上线下的特征分布对比
在实际项目中,我通常会保留3-5个特征工程版本并行测试。记得去年做推荐系统时,简单的用户行为序列重构就让CTR提升了11%。特征工程就像玩魔方,有时候一个巧妙的特征组合就能打开新局面。