1. 机器学习数据准备全景指南
刚入行时我以为模型效果只取决于算法选择,直到连续三个项目因为数据问题翻车后才明白:数据质量决定模型上限。这份指南将系统梳理我从金融风控到医疗影像领域积累的20+种数据预处理技术,涵盖结构化与非结构化数据场景。
2. 数据准备核心逻辑解析
2.1 数据质量评估四象限
评估数据集时我习惯从四个维度建立检查清单:
- 完整性:缺失值分布与模式识别(MCAR/MAR/MNAR)
- 一致性:单位统一性、时间对齐、编码规范
- 准确性:异常值检测与业务合理性验证
- 均衡性:类别分布与特征尺度分析
实战经验:医疗数据常出现MNAR(非随机缺失),比如患者回避敏感问题导致的系统性缺失,这类问题不能简单用均值填充
2.2 特征工程技术图谱
根据特征类型选择处理方式:
graph TD A[数值型] --> B[标准化/归一化] A --> C[非线性变换] A --> D[分箱离散化] E[类别型] --> F[One-Hot编码] E --> G[Target Encoding] E --> H[嵌入表示] I[文本型] --> J[词袋模型] I --> K[TF-IDF] I --> L[预训练嵌入]3. 结构化数据预处理实战
3.1 缺失值处理方案对比
通过信用卡违约预测项目验证的处理效果:
| 方法 | 适用场景 | AUC变化 | 实现复杂度 |
|---|---|---|---|
| 均值/中位数填充 | MCAR类型缺失 | +0.02 | ★ |
| KNN填充 | 小规模MAR缺失 | +0.05 | ★★★ |
| MICE多重插补 | 复杂缺失模式 | +0.08 | ★★★★ |
| 缺失作为单独类别 | 高缺失率特征 | +0.12 | ★★ |
# 使用Feature-engine库实现高级填充 from feature_engine.imputation import ArbitraryNumberImputer imputer = ArbitraryNumberImputer( variables=['income', 'debt_ratio'], arbitrary_number=-999 ) X_train = imputer.fit_transform(X_train)3.2 异常值检测三重奏
- 统计方法:3σ原则/IQR规则
- 金融场景需调整阈值至2.5σ(更敏感)
- 机器学习:Isolation Forest检测
- 参数设置:contamination=0.01, n_estimators=150
- 业务规则:如年龄>150岁直接剔除
避坑指南:电商场景中高消费用户不应简单判为异常,需结合用户分层分析
4. 非结构化数据处理要点
4.1 图像数据增强策略
医疗影像分类项目的增强组合:
albumentations.Compose([ RandomRotate90(p=0.5), GridDistortion(p=0.3), RGBShift(r_shift_limit=15, p=0.2), RandomGamma(gamma_limit=(80,120), p=0.3) ])关键参数说明:
p值设置建议不超过0.5(避免过度扭曲)- 病理图像慎用颜色变换(可能改变诊断特征)
4.2 文本数据处理流程
金融舆情分析项目中的NLP预处理:
- 特殊字符过滤(保留$、%等金融符号)
- 领域词典增强(添加上市公司简称/代码)
- 基于spaCy的命名实体识别
- 动态停用词表(保留"加息"等关键术语)
5. 特征选择与降维技术
5.1 特征重要性评估矩阵
通过特征筛选提升模型效率的案例对比:
| 方法 | 计算成本 | 可解释性 | 适用场景 |
|---|---|---|---|
| 方差阈值 | 低 | 中 | 初筛阶段 |
| 互信息法 | 中 | 高 | 非线性关系 |
| XGBoost重要性评分 | 高 | 中 | 集成模型配套 |
| SHAP值分析 | 极高 | 极高 | 需要解释性的场景 |
5.2 降维技术选型指南
人脸识别项目中的对比实验:
| 维度 | PCA(95%) | t-SNE | UMAP |
|---|---|---|---|
| 100→50 | 0.89 | 0.92 | 0.93 |
| 100→30 | 0.85 | 0.88 | 0.91 |
| 100→10 | 0.72 | 0.79 | 0.83 |
性能提示:UMAP在大规模数据(>10万样本)时速度比t-SNE快10倍以上
6. 数据泄露预防方案
6.1 时间序列数据分割
股票预测项目中验证的方案:
- 传统K折交叉验证导致未来信息泄露
- 改进方案:TimeSeriesSplit + 滚动窗口验证
from sklearn.model_selection import TimeSeriesSplit tscv = TimeSeriesSplit( n_splits=5, gap=30 # 防止相邻窗口重叠 )6.2 目标编码陷阱规避
分类变量编码时的数据泄露预防:
- 在交叉验证循环内部拟合Target Encoder
- 添加高斯噪声(噪声标准差=0.05)
- 使用CatBoost等自带编码的算法
7. 自动化工具链搭建
7.1 基于PyCaret的快速流程
from pycaret.classification import * exp = setup(data, target='churn', normalize=True, feature_interaction=True, remove_multicollinearity=True) best = compare_models()7.2 自定义Transformer开发
可复用的分箱转换器示例:
from sklearn.base import BaseEstimator, TransformerMixin class OptimalBinningTransformer(BaseEstimator, TransformerMixin): def __init__(self, n_bins=5, strategy='quantile'): self.n_bins = n_bins self.strategy = strategy def fit(self, X, y=None): self.binner_ = KBinsDiscretizer( n_bins=self.n_bins, encode='ordinal', strategy=self.strategy ) return self.binner_.fit(X) def transform(self, X): return self.binner_.transform(X)8. 领域适配经验谈
在金融风控项目中发现的特殊处理需求:
- 交易金额需做对数变换(右偏分布)
- 时间特征转换为"距最近交易天数"
- 组合特征构造(如余额/信用额度比值)
医疗影像项目的注意事项:
- DICOM文件需要窗宽窗位调整
- 3D图像需特殊采样策略
- 标注不一致问题需通过consensus机制解决
最后分享一个数据校验的黄金法则:任何预处理步骤都应该在训练集上拟合参数,然后统一应用到测试集,这个简单的规则帮我避免了90%的数据泄露问题。