数据的质量决定了模型的天花板
Garbage In, Garbage Out。学会获取、清洗、增强、划分数据集。
数据准备与预处理
数据决定了模型的天花板 —— 垃圾进,垃圾出 (Garbage In, Garbage Out)
1️⃣ 数据获取途径
公开数据集
| 平台 | 地址 | 说明 |
|---|---|---|
| Kaggle | https://kaggle.com/datasets | 最全,竞赛级 |
| HuggingFace Datasets | https://huggingface.co/datasets | NLP/CV 全都有 |
| Papers with Code | https://paperswithcode.com/datasets | 论文配套数据集 |
| UCI ML Repository | https://archive.ics.uci.edu/ml | 经典数据集 |
| ImageNet | https://www.image-net.org | 图像分类标杆 |
| Common Crawl | https://commoncrawl.org | 海量网页文本 |
自制数据集方案
# 1. 网络爬虫 (需注意版权)
# 2. 公开 API
# 3. 传感器采集
# 4. 人工标注
# 5. 数据合成 (GAN / 数据增强)2️⃣ 数据清洗 (Data Cleaning)
常见问题 & 处理方法
| 问题 | 处理方法 | 代码示例 |
|---|---|---|
| 缺失值 | 填充均值/中位数/众数,或删除 | df.fillna(df.mean()) |
| 重复数据 | 删除重复行 | df.drop_duplicates() |
| 异常值 | 3σ 原则或 IQR 法 | df[(np.abs(z) < 3)] |
| 格式不统一 | 正则清洗,统一格式 | re.sub(r'\s+', ' ', text) |
| 标签不平衡 | 重采样/加权/数据增强 | imbalanced-learn 库 |
代码示例:快速清洗
import pandas as pd
import numpy as np
def quick_clean(df):
"""基础数据清洗函数"""
# 1. 删除全空列
df = df.dropna(axis=1, how='all')
# 2. 填充数值列的缺失值
num_cols = df.select_dtypes(include=[np.number]).columns
df[num_cols] = df[num_cols].fillna(df[num_cols].median())
# 3. 删除重复行
df = df.drop_duplicates()
# 4. 处理异常值(3σ)
for col in num_cols:
mean, std = df[col].mean(), df[col].std()
df = df[(df[col] > mean - 3*std) & (df[col] < mean + 3*std)]
return df3️⃣ 数据划分
from sklearn.model_selection import train_test_split
# 简单划分
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# 再从训练集切验证集
X_train, X_val, y_train, y_val = train_test_split(
X_train, y_train, test_size=0.2, random_state=42
)推荐比例:
- 小数据集 (< 10K):60% 训练 / 20% 验证 / 20% 测试
- 大数据集 (> 100K):98% 训练 / 1% 验证 / 1% 测试
4️⃣ 标准化与归一化
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# Z-score 标准化 (最常用)
scaler = StandardScaler() # 均值0,方差1
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# Min-Max 归一化 (缩放到 [0,1])
scaler = MinMaxScaler()
X_train_norm = scaler.fit_transform(X_train)⚠️ 永远先 fit 训练集,再用同一个 scaler transform 验证/测试集!
5️⃣ 数据增强 (Data Augmentation)
图像增强
import torchvision.transforms as transforms
train_transform = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(p=0.5),
transforms.RandomRotation(15),
transforms.ColorJitter(brightness=0.2, contrast=0.2),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
])文本增强
# 常用方法
# 1. 同义词替换
# 2. 随机插入/删除
# 3. 回译 (Back Translation):英→中→英
# 4. EDA (Easy Data Augmentation)6️⃣ PyTorch DataLoader 最佳实践
from torch.utils.data import Dataset, DataLoader
class MyDataset(Dataset):
def __init__(self, data, labels, transform=None):
self.data = data
self.labels = labels
self.transform = transform
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
x = self.data[idx]
y = self.labels[idx]
if self.transform:
x = self.transform(x)
return x, y
# 创建 DataLoader
dataset = MyDataset(X_train, y_train, transform=train_transform)
dataloader = DataLoader(
dataset,
batch_size=32,
shuffle=True, # 训练集打乱
num_workers=4, # 多进程加载
pin_memory=True # GPU 加速
)🔗 下一篇
→ 模型架构入门