人工智能之核心技术 深度学习
第八章 数据预处理与增强
文章目录
- [人工智能之核心技术 深度学习](#人工智能之核心技术 深度学习)
- [前言:数据预处理与增强 ------ 模型成功的基石](#前言:数据预处理与增强 —— 模型成功的基石)
- [一、数据预处理(Data Preprocessing)](#一、数据预处理(Data Preprocessing))
- [二、数据增强(Data Augmentation)](#二、数据增强(Data Augmentation))
- 三、完整流程图
- 四、配套实战代码(端到端)
- [场景:不平衡图像分类(猫 vs 稀有动物)](#场景:不平衡图像分类(猫 vs 稀有动物))
- 五、总结与最佳实践
- 资料关注
前言:数据预处理与增强 ------ 模型成功的基石
"Garbage in, garbage out."
再强大的模型,若输入的是脏乱、不平衡或信息贫乏的数据,也难以发挥性能。
本章将系统讲解如何将原始数据转化为高质量、高信息量、适合训练的格式。
一、数据预处理(Data Preprocessing)
目标:清洗 + 转换 + 平衡,为模型提供"干净燃料"。
1.1 缺失值处理
常见策略:
| 方法 | 适用场景 | 代码示例 |
|---|---|---|
| 删除 | 缺失比例高(>50%)且无规律 | df.dropna() |
| 均值/中位数填充 | 数值型,分布近似正态 | df.fillna(df.mean()) |
| 众数填充 | 分类型 | df.fillna(df.mode()[0]) |
| 前向/后向填充 | 时间序列 | df.fillna(method='ffill') |
| 模型预测填充 | 高维复杂数据 | KNN、随机森林回归 |
⚠️ 注意:避免在测试集上使用训练集以外的统计量!
1.2 异常值检测与修正
检测方法:
- Z-Score : ∣ z ∣ > 3 |z| > 3 ∣z∣>3 视为异常(假设正态分布)
- IQR(四分位距) :
Lower = Q 1 − 1.5 × IQR , Upper = Q 3 + 1.5 × IQR \text{Lower} = Q1 - 1.5 \times \text{IQR}, \quad \text{Upper} = Q3 + 1.5 \times \text{IQR} Lower=Q1−1.5×IQR,Upper=Q3+1.5×IQR - 孤立森林(Isolation Forest):无监督异常检测
- 可视化:箱线图、散点图
处理策略:
- 删除:明显错误(如年龄=200)
- 截断(Winsorizing):将异常值设为边界值
- 分箱(Binning):将连续值离散化
python
# IQR 示例
Q1 = df['age'].quantile(0.25)
Q3 = df['age'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df = df[(df['age'] >= lower_bound) & (df['age'] <= upper_bound)]
1.3 数据归一化与标准化
| 方法 | 公式 | 适用场景 |
|---|---|---|
| Min-Max 归一化 | x ′ = x − x min x max − x min x' = \frac{x - x_{\min}}{x_{\max} - x_{\min}} x′=xmax−xminx−xmin | CNN 输入(如图像 [0,1]) |
| Z-Score 标准化 | x ′ = x − μ σ x' = \frac{x - \mu}{\sigma} x′=σx−μ | 线性模型、SVM、神经网络 |
| Robust Scaling | x ′ = x − median IQR x' = \frac{x - \text{median}}{\text{IQR}} x′=IQRx−median | 含异常值的数据 |
✅ 深度学习推荐:
- 图像 → 归一化到 [0,1] 或 [-1,1]
- 其他数值特征 → StandardScaler(Z-Score)
python
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test) # 注意:只用训练集 fit!
# 图像归一化(PyTorch)
transforms.ToTensor() # 自动将 [0,255] → [0,1]
1.4 类别不平衡问题
当某一类样本远多于其他类(如欺诈检测中 99% 正常,1% 欺诈),模型会偏向多数类。
解决方案:
类别不平衡
重采样
算法层面
评估指标
过采样:复制少数类
欠采样:删除多数类
SMOTE:合成新样本
代价敏感学习
(class_weight)
Focal Loss
不用 Accuracy!
用 Precision/Recall/F1/AUC
(1)SMOTE(Synthetic Minority Oversampling Technique)
- 在少数类样本间插值生成新样本
- 避免简单复制导致的过拟合
python
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=42)
X_res, y_res = smote.fit_resample(X_train, y_train)
(2)代价敏感学习
-
给少数类更高损失权重
-
PyTorch 示例:
pythonweights = torch.tensor([1.0, 10.0]) # 少数类权重=10 criterion = nn.CrossEntropyLoss(weight=weights)
✅ 最佳实践:
- 小数据集 → SMOTE + 过采样
- 大数据集 → 欠采样 + Focal Loss
二、数据增强(Data Augmentation)
目标:人工扩充数据集,提升模型泛化能力与鲁棒性。
💡 核心思想 :对输入做合理扰动,标签不变!
2.1 图像增强
常用技术:
| 类型 | 方法 | 作用 |
|---|---|---|
| 几何变换 | 旋转、翻转、裁剪、缩放 | 提升位置/尺度不变性 |
| 色彩变换 | 亮度、对比度、饱和度抖动 | 提升光照鲁棒性 |
| 噪声添加 | 高斯噪声、椒盐噪声 | 提升抗噪能力 |
| 高级方法 | MixUp、CutMix、RandAugment | 正则化 + 提升泛化 |
PyTorch 实现(torchvision.transforms):
python
from torchvision import transforms
train_transform = transforms.Compose([
transforms.RandomHorizontalFlip(p=0.5), # 随机水平翻转
transforms.RandomRotation(degrees=15), # 随机旋转 ±15°
transforms.ColorJitter(brightness=0.2, contrast=0.2), # 色彩抖动
transforms.RandomResizedCrop(size=224, scale=(0.8, 1.0)), # 随机裁剪
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]) # ImageNet 标准化
])
# 测试时通常只做 Resize + Normalize
test_transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
可视化示例:
原始图像
水平翻转
旋转 15°
随机裁剪
色彩抖动
增强后图像集合
📌 注意:
- 分类任务:可大幅增强
- 检测/分割:需同步修改标注(如 bounding box)
2.2 文本增强
文本是离散符号,增强需保持语义一致性。
常用方法:
| 方法 | 描述 | 工具 |
|---|---|---|
| 同义词替换 | 用 WordNet 或 embeddings 替换词 | nlpaug, textattack |
| 随机插入 | 随机插入同义词 | --- |
| 随机删除 | 随机删除词(概率<0.2) | --- |
| 回译(Back Translation) | 中文 → 英文 → 中文 | Google Translate API |
| EDA(Easy Data Augmentation) | 上述方法组合 | 开源库 |
代码示例(使用 nlpaug):
python
import nlpaug.augmenter.word as naw
# 同义词替换(基于 WordNet)
aug = naw.SynonymAug(aug_src='wordnet')
text = "This movie is great!"
augmented_text = aug.augment(text)
print(augmented_text) # e.g., "This film is wonderful!"
# 回译(需网络)
# aug = naw.BackTranslationAug(
# from_model_name='facebook/wmt19-en-de',
# to_model_name='facebook/wmt19-de-en'
# )
⚠️ 警告:
- 避免改变关键实体(如"不治之症" → "可治愈疾病")
- 医疗、法律等敏感领域慎用!
三、完整流程图
原始数据
预处理
缺失值处理
异常值处理
归一化/标准化
类别平衡
清洗后数据
数据增强
图像增强
文本增强
最终数据集
模型训练
四、配套实战代码(端到端)
场景:不平衡图像分类(猫 vs 稀有动物)
python
import torch
from torch.utils.data import DataLoader, WeightedRandomSampler
from torchvision import datasets, transforms
from sklearn.utils.class_weight import compute_class_weight
import numpy as np
# 1. 定义增强
train_transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(10),
transforms.ColorJitter(0.1, 0.1, 0.1),
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 2. 加载数据
train_dataset = datasets.ImageFolder('data/train', transform=train_transform)
# 3. 处理类别不平衡:计算采样权重
labels = [sample[1] for sample in train_dataset.samples]
class_weights = compute_class_weight('balanced', classes=np.unique(labels), y=labels)
sample_weights = [class_weights[label] for label in labels]
# 4. 使用 WeightedRandomSampler
sampler = WeightedRandomSampler(sample_weights, len(sample_weights))
train_loader = DataLoader(train_dataset, batch_size=32, sampler=sampler)
# 5. 模型训练(略)
✅ 优势:
- 增强提升泛化
- 加权采样解决不平衡
- 标准化适配预训练模型
五、总结与最佳实践
| 任务类型 | 推荐策略 |
|---|---|
| 图像分类 | RandAugment + MixUp + Class Weight |
| 目标检测 | Mosaic + Copy-Paste + Box-aware Aug |
| 文本分类 | EDA + Back Translation(谨慎) |
| 时间序列 | Jittering + Scaling + Time Warping |
| 表格数据 | SMOTE + StandardScaler + Outlier Removal |
🔑 黄金法则:
- 先分析,再处理:可视化缺失、分布、类别比例
- 验证集不增强:只对训练集做增强
- 保持语义:增强不能改变标签含义
- 记录 pipeline:确保可复现
资料关注
公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》