共计 2082 个字符,预计需要花费 6 分钟才能阅读完成。
问题背景:为什么结构化数据也需要增强?
在机器学习项目中,我们常遇到.csv 格式的结构化数据样本不足或类别不平衡的问题。与图像数据通过旋转 / 裁剪等视觉变换增强不同,结构化数据的增强需要保持字段间的逻辑关系。例如:

- 数值字段的扰动不能超出合理范围(如年龄不可能为负值)
- 类别字段的增强必须维持原有的分布规律
- 时间序列数据需保持前后连贯性
5 种核心增强方法实战
1. 基于统计特性的数值扰动
适用于连续型字段,通过概率分布保持原始数据特性:
import pandas as pd
import numpy as np
def numerical_perturbation(df, columns, scale=0.1):
"""
df: 原始 DataFrame
columns: 需要扰动的数值列名列表
scale: 扰动强度系数(标准差比例)"""
result = df.copy()
for col in columns:
# 获取原始数据的统计特性
mean = df[col].mean()
std = df[col].std()
# 生成高斯噪声(注意 clip 防止极端值)noise = np.random.normal(0, std*scale, size=len(df))
result[col] = np.clip(df[col] + noise,
df[col].min(),
df[col].max())
return result
# 示例:对 age 和 income 列进行扰动
perturbed_data = numerical_perturbation(
df,
columns=['age', 'income'],
scale=0.05
)
2. 类别特征的 SMOTE 改进版
传统 SMOTE(Synthetic Minority Over-sampling Technique)需要适配离散特征:
from imblearn.over_sampling import SMOTENC
def categorical_smote(df, target_col, categorical_cols, k_neighbors=3):
"""
df: 包含特征和目标变量的 DataFrame
target_col: 需要平衡的目标列名
categorical_cols: 类别型特征的列名列表
"""
X = df.drop(columns=[target_col])
y = df[target_col]
# 标识类别型特征的索引位置
cat_indices = [i for i, col in enumerate(X.columns)
if col in categorical_cols]
smote = SMOTENC(
categorical_features=cat_indices,
k_neighbors=k_neighbors
)
X_res, y_res = smote.fit_resample(X, y)
return pd.concat([X_res, y_res], axis=1)
# 示例:平衡信用卡欺诈检测中的 class 列
balanced_data = categorical_smote(
df,
target_col='class',
categorical_cols=['education', 'marital_status']
)
(因字数限制,以下展示部分内容,完整版包含 5 种方法完整实现)
生产环境优化策略
内存优化:分块处理
# 使用 chunksize 参数分批处理大文件
chunk_size = 10_000
result_chunks = []
for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size):
processed = numerical_perturbation(chunk, columns=['value'])
result_chunks.append(processed)
final_result = pd.concat(result_chunks)
分布可视化检查
import seaborn as sns
# 对比原始数据与增强数据的分布
sns.kdeplot(data=df['age'], label='Original')
sns.kdeplot(data=augmented_df['age'], label='Augmented')
plt.legend()
三大常见陷阱及解决方案
- 标签泄漏(Label Leakage)
- 现象:增强过程中意外使用了测试集信息
-
解决:始终先划分 train/test 再增强训练集
-
数值溢出(Numerical Overflow)
- 现象:扰动导致数值超出合理范围
-
解决:使用 np.clip 约束上下限
-
类别失衡加剧(Category Distortion)
- 现象:SMOTE 生成不合理的类别组合
- 解决:设置合理的 k_neighbors 参数
完整代码获取
本文所有方法的可执行版本已整理至 Colab:
点击访问实践笔记本
延伸阅读推荐:
–《Feature Engineering for Machine Learning》第 5 章
– Pandas 官方文档:GroupBy 高级用法
– imbalanced-learn 文档:SMOTENC 参数详解
正文完
