数据的质量决定了模型的天花板

Garbage In, Garbage Out。学会获取、清洗、增强、划分数据集。

数据准备与预处理

数据决定了模型的天花板 —— 垃圾进,垃圾出 (Garbage In, Garbage Out)


1️⃣ 数据获取途径

公开数据集

平台地址说明
Kagglehttps://kaggle.com/datasets最全,竞赛级
HuggingFace Datasetshttps://huggingface.co/datasetsNLP/CV 全都有
Papers with Codehttps://paperswithcode.com/datasets论文配套数据集
UCI ML Repositoryhttps://archive.ics.uci.edu/ml经典数据集
ImageNethttps://www.image-net.org图像分类标杆
Common Crawlhttps://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 df

3️⃣ 数据划分

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 加速
)

🔗 下一篇

模型架构入门