数据工程入门指南:从数据采集到合成数据的全流程实战

1次阅读
没有评论

共计 2636 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

低质量数据的真实危害

最近团队接手了一个电商评论情感分析项目,标注好的数据看似整齐,上线后模型却把 ” 手机续航差到爆炸 ” 预测为正面评价。追溯发现原始数据中混入了大量爬虫生成的垃圾文本,而标注时只简单匹配了表情符号。更糟的是,在医疗影像项目中,由于不同医院 CT 设备的参数差异,未标准化的 DICOM 文件直接导致病灶检测模型的 AUC 下降 37%。这些血泪史告诉我们:数据质量就是模型的生命线。

数据采集:选择你的 ” 捕鱼工具 ”

  1. 轻量级捕捞 – Requests
    适合快速抓取 API 或少量页面,比如获取天气数据:

    import requests
    response = requests.get('https://api.weather.com/v1/forecast', 
                           params={'key': 'YOUR_KEY', 'city': 'Beijing'})
    print(response.json()['temperature'])  # 直接获取 JSON 字段

  2. 工业化捕捞 – 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()}

  3. 避坑提醒 :设置合理的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 建立标注流程:

  1. 安装:pip install label-studio
  2. 启动:label-studio start my_project --init --template text_classification
  3. 配置 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 生成样本

性能优化技巧

  1. 分布式清洗:用 Dask 处理 10GB 以上 CSV 文件

    import dask.dataframe as dd
    ddf = dd.read_csv('big_data/*.csv', blocksize=1e8)  # 每个分区 100MB
    ddf = ddf.groupby('category').mean().compute()

  2. 标注加速

  3. 预加载下一批样本到内存
  4. 对图像标注使用 WebP 格式替代 PNG
  5. 用 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 为合格

思考题时间

  1. 当新收集的数据分布与原有数据存在差异时,应该直接混合训练还是分阶段处理?
  2. 对于医疗等敏感领域,合成数据如何通过伦理审查?
  3. 如何设计一个实时反馈的数据质量监控系统?

数据工程就像做菜,食材(数据)质量决定最终味道(模型效果)。希望这篇指南能帮你避开那些年我们踩过的坑,从数据管道开始构建可靠的 AI 系统。

正文完
 0
评论(没有评论)