第二十章:数据——AI的燃料
学习目标
- 理解数据集的划分原则和重要性
- 掌握数据标注的类型、流程和挑战
- 了解数据清洗的常见问题和处理方法
- 掌握数据增强的概念和方法
- 能够使用Python进行数据集划分和数据增强
前置要求
建议先学习第四章:机器学习概述,了解机器学习的基本概念和工作流程。
数据集划分
数据集是用于训练和评估AI模型的数据集合。在机器学习中,数据集通常需要划分为不同的子集,以确保模型能够被公正地评估。
| 子集 | 用途 | 典型比例 | 说明 |
|---|---|---|---|
| 训练集(Training Set) | 训练模型参数 | 70%-80% | 模型从中学习规律和模式 |
| 验证集(Validation Set) | 调参和模型选择 | 10%-15% | 用于选择超参数、防止过拟合 |
| 测试集(Test Set) | 最终评估模型性能 | 10%-15% | 模型从未见过的数据,评估泛化能力 |
数据划分的重要原则
- 测试集绝不能参与训练:否则评估结果会过于乐观,无法反映真实性能
- 划分前先打乱数据:避免数据有序排列导致的偏差
- 保持类别比例:使用分层抽样确保各子集的类别分布一致
- 数据不能泄露:确保测试集中的信息不会以任何方式泄露到训练过程中
使用scikit-learn划分数据集
from sklearn.model_selection import train_test_split
import numpy as np
# 模拟数据:1000个样本,每个样本有10个特征
X = np.random.rand(1000, 10) # 特征矩阵
y = np.random.randint(0, 3, size=1000) # 标签(3个类别)
# 第一次划分:分离出测试集(20%)
X_train_val, X_test, y_train_val, y_test = train_test_split(
X, y,
test_size=0.2, # 测试集占20%
random_state=42, # 随机种子,确保可复现
stratify=y # 分层抽样,保持类别比例
)
# 第二次划分:从训练+验证中分离出验证集(占原始数据的15%)
X_train, X_val, y_train, y_val = train_test_split(
X_train_val, y_train_val,
test_size=0.1875, # 0.8 * 0.1875 ≈ 0.15(占原始数据)
random_state=42,
stratify=y_train_val
)
print(f"训练集:{X_train.shape[0]} 样本(80%)")
print(f"验证集:{X_val.shape[0]} 样本(15%)")
print(f"测试集:{X_test.shape[0]} 样本(20%)")
# 验证类别分布
for name, labels in [("训练集", y_train), ("验证集", y_val), ("测试集", y_test)]:
unique, counts = np.unique(labels, return_counts=True)
print(f"\n{name}类别分布:")
for cls, count in zip(unique, counts):
print(f" 类别{cls}: {count} ({count/len(labels)*100:.1f}%)")
数据标注
数据标注是为原始数据添加标签(标注信息)的过程,是监督学习的基础。标注质量直接影响模型性能。
常见标注类型
| 标注类型 | 说明 | 示例 |
|---|---|---|
| 分类标注 | 为数据分配类别标签 | 垃圾邮件/正常邮件、猫/狗/鸟 |
| 目标检测标注 | 标注图像中物体的位置和类别 | 用边界框标注图像中的人、车 |
| 序列标注 | 为序列数据中的每个元素标注 | 命名实体识别(人名、地名、机构名) |
| 情感标注 | 标注文本的情感倾向 | 正面/负面/中性 |
| 偏好标注(RLHF) | 标注多个回答的质量排序 | 回答A优于回答B |
数据标注流程
制定标注规范
明确标注标准、边界情况和质量要求
培训标注人员
确保标注人员理解规范,统一标准
执行标注
标注人员按照规范进行数据标注
质量审核
抽样检查标注质量,计算标注者一致性
迭代改进
根据审核反馈修正规范和标注
数据标注的挑战
- 成本高:大规模高质量标注需要大量人力和时间
- 主观性:某些任务(如情感分析)标注者可能有不同判断
- 一致性:不同标注者之间、同一标注者不同时间的标注可能不一致
- 边界模糊:很多真实数据的标签并不明确
数据清洗
数据清洗是识别并修正数据集中错误、不一致和不完整数据的过程。高质量的数据是训练高质量模型的前提。
常见数据问题及处理方法
| 问题类型 | 说明 | 处理方法 |
|---|---|---|
| 缺失值 | 数据中存在空值或缺失字段 | 删除、填充(均值/中位数/插值) |
| 重复数据 | 存在完全相同或高度相似的数据 | 去重(保留一条或合并) |
| 异常值 | 明显偏离正常范围的数据 | 删除、修正、单独分析 |
| 格式不一致 | 同一字段的数据格式不统一 | 统一格式、标准化处理 |
| 噪声数据 | 包含错误或无意义的数据 | 过滤、修正 |
| 标注错误 | 人工标注的标签有误 | 重新审核、修正标签 |
数据增强
数据增强(Data Augmentation)是通过各种技术手段扩充数据集的方法,在不收集新数据的情况下增加数据量和多样性,提升模型的泛化能力。
图像数据增强示例
对一张猫的图片,可以通过以下方式生成多张"不同"的图片:
- 旋转:将图片旋转一定角度
- 翻转:水平或垂直翻转
- 裁剪:随机裁剪不同区域
- 颜色变换:调整亮度、对比度、饱和度
- 添加噪声:添加随机噪声
为什么需要数据增强?
数据不足:收集和标注数据成本高,增强可以低成本扩充数据集。
防止过拟合:更多样的训练数据帮助模型学习更鲁棒的特征,而不是记忆特定样本。
提升泛化:增强后的数据模拟了真实世界中的各种变化,提升模型在新数据上的表现。
数据增强Python代码示例
# 使用albumentations库进行图像数据增强
# 安装:pip install albumentations
import albumentations as A
import cv2
# 定义增强管道
transform = A.Compose([
A.RandomRotate90(p=0.5), # 随机旋转90度(50%概率)
A.HorizontalFlip(p=0.5), # 水平翻转(50%概率)
A.VerticalFlip(p=0.3), # 垂直翻转(30%概率)
A.RandomBrightnessContrast(
brightness_limit=0.2, contrast_limit=0.2, p=0.8
),
A.GaussNoise(p=0.3), # 添加高斯噪声(30%概率)
A.RandomCrop(height=224, width=224, p=1.0),
])
# 读取图片
image = cv2.imread("cat.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 生成增强后的图片
for i in range(5):
augmented = transform(image=image)["image"]
cv2.imwrite(f"cat_augmented_{i}.jpg",
cv2.cvtColor(augmented, cv2.COLOR_RGB2BGR))
# --- 文本数据增强方法 ---
# 推荐库:nlpaug (pip install nlpaug)
# 常用方法:
# 1. 同义词替换:将部分词替换为同义词
# 2. 随机插入:在句子中随机插入词
# 3. 随机交换:随机交换句子中的词
# 4. 随机删除:随机删除部分词
本章小结
- 数据集通常划分为训练集(70%-80%)、验证集(10%-15%)和测试集(10%-15%),测试集绝不能参与训练过程。
- 数据标注是监督学习的基础,常见类型包括分类标注、目标检测标注、序列标注、情感标注和偏好标注(RLHF)。
- 数据清洗处理缺失值、重复数据、异常值、格式不一致、噪声数据和标注错误等问题,是保证模型质量的关键步骤。
- 数据增强通过旋转、翻转、裁剪、颜色变换等技术扩充数据集,能有效防止过拟合、提升模型泛化能力。
- scikit-learn的train_test_split和albumentations库分别提供了便捷的数据集划分和图像数据增强工具。
练习题
-
数据集划分中,验证集的主要用途是什么?
A. 训练模型参数
B. 最终评估模型性能
C. 调整超参数和选择模型
D. 数据清洗答案:C。验证集用于调整超参数、选择模型架构和进行早停判断,防止模型在训练集上过拟合。最终性能评估使用测试集。
-
以下哪种数据增强方法最适合文本数据?
A. 随机旋转
B. 颜色变换
C. 同义词替换
D. 随机裁剪答案:C。同义词替换是文本数据增强的常用方法,通过将部分词语替换为同义词来生成语义相似但表述不同的新文本。
-
为什么数据增强能帮助防止过拟合?
A. 增强后的数据更干净
B. 增加了数据的多样性,使模型学到更鲁棒的特征
C. 减少了训练数据量
D. 增强后的数据更容易学习答案:B。数据增强通过生成多样化的训练样本,使模型无法记忆特定样本的细节,被迫学习更通用、更鲁棒的特征表示。