人工智能之核心技术 深度学习 第八章 数据预处理与增强

人工智能之核心技术 深度学习

第八章 数据预处理与增强


文章目录

  • [人工智能之核心技术 深度学习](#人工智能之核心技术 深度学习)
  • [前言:数据预处理与增强 ------ 模型成功的基石](#前言:数据预处理与增强 —— 模型成功的基石)
    • [一、数据预处理(Data Preprocessing)](#一、数据预处理(Data Preprocessing))
      • [1.1 缺失值处理](#1.1 缺失值处理)
      • [1.2 异常值检测与修正](#1.2 异常值检测与修正)
      • [1.3 数据归一化与标准化](#1.3 数据归一化与标准化)
      • [1.4 类别不平衡问题](#1.4 类别不平衡问题)
    • [二、数据增强(Data Augmentation)](#二、数据增强(Data Augmentation))
      • [2.1 图像增强](#2.1 图像增强)
      • [2.2 文本增强](#2.2 文本增强)
        • 常用方法:
        • [代码示例(使用 `nlpaug`):](#代码示例(使用 nlpaug):)
    • 三、完整流程图
    • 四、配套实战代码(端到端)
      • [场景:不平衡图像分类(猫 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 示例:

    python 复制代码
    weights = 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

🔑 黄金法则

  1. 先分析,再处理:可视化缺失、分布、类别比例
  2. 验证集不增强:只对训练集做增强
  3. 保持语义:增强不能改变标签含义
  4. 记录 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》

相关推荐
百***35482 小时前
2026年AI搜索时代的企业认知突围:微盟星启如何重构品牌信息基础设施
人工智能·重构
极智-9962 小时前
GitHub 热榜项目-日榜精选(2026-02-03)| AI智能体、终端工具、RAG技术等 | claude-mem、99、termux-app等
人工智能·网络安全·github·ai智能体·llm应用·rag技术·torrent工具
跨境卫士苏苏2 小时前
跨境电商:从“跑量”到“跑赢利润”的一套打法
大数据·人工智能·跨境电商·亚马逊·内容营销
maoku662 小时前
LLaMA Factory全解析:让大模型“改装”像组装电脑一样简单
人工智能
袋鼠云数栈2 小时前
让多模态数据真正可用,AI 才能走出 Demo
大数据·人工智能·数据治理·多模态
esmap2 小时前
技术深度解析:ESMap引擎VS主流数字孪生竞品
人工智能·物联网·3d·编辑器·智慧城市·webgl
鹧鸪云光伏2 小时前
光伏清洗-AI算法助你找到积尘位置
人工智能·光伏
星河耀银海2 小时前
AI学习第一站:从感知到认知,AI到底是什么?
人工智能·学习·ai
小鸡吃米…2 小时前
机器学习 - 堆叠集成(Stacking)
人工智能·python·机器学习