第二十章:数据——AI的燃料

学习目标

  • 理解数据集的划分原则和重要性
  • 掌握数据标注的类型、流程和挑战
  • 了解数据清洗的常见问题和处理方法
  • 掌握数据增强的概念和方法
  • 能够使用Python进行数据集划分和数据增强

前置要求

建议先学习第四章:机器学习概述,了解机器学习的基本概念和工作流程。

数据作为AI燃料的概念图
图20-1 数据——AI的燃料:从数据采集、清洗、标注到训练集划分的完整数据流水线,数据质量决定模型上限

数据集划分

数据集是用于训练和评估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

数据标注流程

1

制定标注规范

明确标注标准、边界情况和质量要求

2

培训标注人员

确保标注人员理解规范,统一标准

3

执行标注

标注人员按照规范进行数据标注

4

质量审核

抽样检查标注质量,计算标注者一致性

5

迭代改进

根据审核反馈修正规范和标注

数据标注的挑战

  • 成本高:大规模高质量标注需要大量人力和时间
  • 主观性:某些任务(如情感分析)标注者可能有不同判断
  • 一致性:不同标注者之间、同一标注者不同时间的标注可能不一致
  • 边界模糊:很多真实数据的标签并不明确

数据清洗

数据清洗是识别并修正数据集中错误、不一致和不完整数据的过程。高质量的数据是训练高质量模型的前提。

常见数据问题及处理方法

问题类型 说明 处理方法
缺失值 数据中存在空值或缺失字段 删除、填充(均值/中位数/插值)
重复数据 存在完全相同或高度相似的数据 去重(保留一条或合并)
异常值 明显偏离正常范围的数据 删除、修正、单独分析
格式不一致 同一字段的数据格式不统一 统一格式、标准化处理
噪声数据 包含错误或无意义的数据 过滤、修正
标注错误 人工标注的标签有误 重新审核、修正标签

数据增强

数据增强(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. 随机删除:随机删除部分词

本章小结

  1. 数据集通常划分为训练集(70%-80%)、验证集(10%-15%)和测试集(10%-15%),测试集绝不能参与训练过程。
  2. 数据标注是监督学习的基础,常见类型包括分类标注、目标检测标注、序列标注、情感标注和偏好标注(RLHF)。
  3. 数据清洗处理缺失值、重复数据、异常值、格式不一致、噪声数据和标注错误等问题,是保证模型质量的关键步骤。
  4. 数据增强通过旋转、翻转、裁剪、颜色变换等技术扩充数据集,能有效防止过拟合、提升模型泛化能力。
  5. scikit-learn的train_test_split和albumentations库分别提供了便捷的数据集划分和图像数据增强工具。

练习题

  1. 数据集划分中,验证集的主要用途是什么?

    A. 训练模型参数
    B. 最终评估模型性能
    C. 调整超参数和选择模型
    D. 数据清洗

    答案:C。验证集用于调整超参数、选择模型架构和进行早停判断,防止模型在训练集上过拟合。最终性能评估使用测试集。

  2. 以下哪种数据增强方法最适合文本数据?

    A. 随机旋转
    B. 颜色变换
    C. 同义词替换
    D. 随机裁剪

    答案:C。同义词替换是文本数据增强的常用方法,通过将部分词语替换为同义词来生成语义相似但表述不同的新文本。

  3. 为什么数据增强能帮助防止过拟合?

    A. 增强后的数据更干净
    B. 增加了数据的多样性,使模型学到更鲁棒的特征
    C. 减少了训练数据量
    D. 增强后的数据更容易学习

    答案:B。数据增强通过生成多样化的训练样本,使模型无法记忆特定样本的细节,被迫学习更通用、更鲁棒的特征表示。