共计 2636 个字符,预计需要花费 7 分钟才能阅读完成。
低质量数据的真实危害
最近团队接手了一个电商评论情感分析项目,标注好的数据看似整齐,上线后模型却把 ” 手机续航差到爆炸 ” 预测为正面评价。追溯发现原始数据中混入了大量爬虫生成的垃圾文本,而标注时只简单匹配了表情符号。更糟的是,在医疗影像项目中,由于不同医院 CT 设备的参数差异,未标准化的 DICOM 文件直接导致病灶检测模型的 AUC 下降 37%。这些血泪史告诉我们:数据质量就是模型的生命线。
数据采集:选择你的 ” 捕鱼工具 ”
-
轻量级捕捞 – Requests
适合快速抓取 API 或少量页面,比如获取天气数据:import requests response = requests.get('https://api.weather.com/v1/forecast', params={'key': 'YOUR_KEY', 'city': 'Beijing'}) print(response.json()['temperature']) # 直接获取 JSON 字段 -
工业化捕捞 – Scrapy
当需要爬取整个电商网站时,用 Scrapy 框架更高效:class ProductSpider(scrapy.Spider): name = 'amazon' start_urls = ['https://www.amazon.com/s?k=laptop'] def parse(self, response): for product in response.css('div.s-result-item'): yield {'name': product.css('h2 a::text').get(), 'price': product.css('span.a-price-whole::text').get()} -
避坑提醒 :设置合理的
DOWNLOAD_DELAY(建议 2 - 5 秒),User-Agent 建议使用fake_useragent库轮换,避免触发反爬
数据清洗:给数据做 ” 深度 SPA”
用 Pandas 处理一份存在问题的销售数据表:
import pandas as pd
import numpy as np
# 1. 处理缺失值
# 方法 1:删除缺失超过 30% 的列
df = df.dropna(thresh=len(df)*0.7, axis=1)
# 方法 2:数值列用中位数填充
df['price'].fillna(df['price'].median(), inplace=True)
# 2. 处理异常值
# 方法 3:IQR 去极值
Q1 = df['sales'].quantile(0.25)
Q3 = df['sales'].quantile(0.75)
df = df[~((df['sales'] < (Q1 - 1.5*IQR)) | (df['sales'] > (Q3 + 1.5*IQR)))]
# 3. 标准化处理
# 方法 4:MinMax 缩放
from sklearn.preprocessing import MinMaxScaler
df['normalized'] = MinMaxScaler().fit_transform(df[['value']])
# 4. 文本清洗
# 方法 5:正则表达式去噪
df['review'] = df['review'].str.replace(r'[^\w\s]', '', regex=True)
数据标注:打造 ” 标准化车间 ”
使用 Label Studio 建立标注流程:
- 安装:
pip install label-studio - 启动:
label-studio start my_project --init --template text_classification - 配置
config.xml定义标签体系(建议不超过 10 个类别)
协作要点:
- 设置黄金样本(gold standard)用于计算标注者 Kappa 系数
- 对于争议样本采用多数投票 + 专家仲裁机制
- 定期生成标注质量报告:
label-studio-metrics calculate --input tasks.json
合成数据:制造 ” 数据维生素 ”
用 TensorFlow 搭建简易 GAN 生成手写数字:
from tensorflow.keras.layers import Dense, LeakyReLU
from tensorflow.keras.models import Sequential
# 生成器模型
generator = Sequential([Dense(256, input_dim=100),
LeakyReLU(0.2),
Dense(512),
LeakyReLU(0.2),
Dense(784, activation='tanh') # MNIST 图片尺寸 28x28=784
])
# 训练循环(简化版)for epoch in range(5000):
noise = np.random.normal(0, 1, (batch_size, 100))
gen_imgs = generator.predict(noise)
# 这里需要添加判别器训练代码...

左:真实 MNIST 样本 / 右:GAN 生成样本
性能优化技巧
-
分布式清洗:用 Dask 处理 10GB 以上 CSV 文件
import dask.dataframe as dd ddf = dd.read_csv('big_data/*.csv', blocksize=1e8) # 每个分区 100MB ddf = ddf.groupby('category').mean().compute() -
标注加速:
- 预加载下一批样本到内存
- 对图像标注使用 WebP 格式替代 PNG
- 用 Redis 缓存常用标签
必知避坑指南
- 反爬虫陷阱:
- 避免连续访问相似 URL 模式
-
使用住宅代理 IP 比数据中心 IP 更隐蔽
-
数据偏移检测:
计算训练集与线上数据的 KL 散度:from scipy.stats import entropy kl_div = entropy(p_train, q_online) # >0.3 表示显著偏移 -
标注一致性检查:
使用 Fleiss’ Kappa 统计量(适用于多人标注):from statsmodels.stats.inter_rater import fleiss_kappa kappa = fleiss_kappa(annotations_matrix) # >0.6 为合格
思考题时间
- 当新收集的数据分布与原有数据存在差异时,应该直接混合训练还是分阶段处理?
- 对于医疗等敏感领域,合成数据如何通过伦理审查?
- 如何设计一个实时反馈的数据质量监控系统?
数据工程就像做菜,食材(数据)质量决定最终味道(模型效果)。希望这篇指南能帮你避开那些年我们踩过的坑,从数据管道开始构建可靠的 AI 系统。
正文完
发表至: 未分类
近一天内
