数据是 AI 的基石
高质量的数据集是构建优秀 AI 模型的前提。“垃圾进,垃圾出”(Garbage In, Garbage Out)是机器学习领域最经典的警示。无论模型结构多先进,训练数据质量不高的模型表现都不会好。
数据采集
采集来源
- 公开数据集 — ImageNet、COCO、GLUE、Hugging Face Datasets
- 网络爬虫 — 从互联网自动收集文本、图片等数据
- API 获取 — 通过数据平台或服务商 API 获取
- 传感器采集 — IoT 设备、摄像头等硬件采集
- 用户生成 — 日志记录、用户反馈、标注平台
# 使用 Hugging Face 加载数据集
from datasets import load_dataset
dataset = load_dataset("imdb", split="train")
print(f"样本数: {len(dataset)}")
print(f"第一条文本: {dataset[0]['text'][:200]}")
数据采集的注意事项
- 版权和合规问题
- 用户隐私保护(需脱敏)
- 数据分布的覆盖范围
- 采集频率和实时性要求
数据清洗
常见问题与处理方法
- 缺失值 — 删除、填充(均值/中位数/众数)、插值
- 重复数据 — 基于精确匹配或近似去重
- 异常值 — 基于统计方法(3σ、IQR)或领域知识识别
- 格式不一致 — 统一日期格式、文字编码、单位
import pandas as pd
df = pd.read_csv("raw_data.csv")
# 处理缺失值
df["age"].fillna(df["age"].median(), inplace=True)
# 去除重复行
df.drop_duplicates(inplace=True)
# 使用 IQR 识别异常值
Q1 = df["salary"].quantile(0.25)
Q3 = df["salary"].quantile(0.75)
IQR = Q3 - Q1
df = df[
(df["salary"] >= Q1 - 1.5 * IQR) &
(df["salary"] <= Q3 + 1.5 * IQR)
]
# 统一日期格式
df["date"] = pd.to_datetime(df["date"])
数据标注
数据标注是监督学习的基础工作,也是最耗费人力和时间的环节。
标注类型
- 分类标注 — 为数据分配类别标签
- 边界框标注 — 标出目标物体的位置
- 语义分割标注 — 逐像素标注
- 文本标注 — 命名实体标注、情感标注
- 关键点标注 — 人体姿态关键点
标注策略
- 人工标注 — 通过标注平台(LabelImg、Label Studio、CVAT)
- 半自动标注 — 模型先预测,人工修正
- 主动学习 — 模型选择最不确定的样本由人工标注
- 众包标注 — 通过 Amazon Mechanical Turk 等平台分发
数据增强
数据增强通过对现有数据施加变换来生成新样本,可以有效增加数据量、提高模型泛化能力。
图像增强方法
- 几何变换:旋转、翻转、裁剪、缩放
- 色彩变换:亮度调整、对比度调整、色彩抖动
- 噪声注入:高斯噪声、椒盐噪声
- 高级方法:MixUp、CutMix、RandAugment
from torchvision import transforms
data_augmentation = transforms.Compose([
transforms.RandomRotation(10),
transforms.RandomHorizontalFlip(p=0.5),
transforms.ColorJitter(
brightness=0.2, contrast=0.2
),
transforms.RandomResizedCrop(224),
transforms.ToTensor(),
])
文本增强方法
- 同义词替换
- 回译(翻译成另一种语言再翻译回来)
- 随机插入/删除/交换
特征工程
特征工程是将原始数据转换为模型更容易理解的特征的过程。好的特征能显著提升模型性能。
特征处理
- 数值特征 — 标准化、归一化、离散化、多项式特征
- 类别特征 — One-Hot 编码、Label 编码、Target 编码
- 时间特征 — 年、月、日、星期、是否为节假日
- 文本特征 — TF-IDF、词向量、句向量
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
# 文本特征提取
vectorizer = TfidfVectorizer(max_features=5000)
text_features = vectorizer.fit_transform(texts)
# 数值特征标准化
scaler = StandardScaler()
numerical_features = scaler.fit_transform(numerical_data)
# 类别特征编码
encoder = OneHotEncoder(sparse_output=False)
categorical_features = encoder.fit_transform(categories)
特征选择
- 过滤法(基于统计指标)
- 包裹法(递归特征消除)
- 嵌入法(基于模型的特征重要性)
数据工程在整个 AI 项目中往往占据 60% 以上的工作量,投入足够的时间和精力在数据上通常会带来最大的回报。