mcpField
D
Dataset Curator

Dataset Curator

github.com/jmsktm数据与数据库10208 次安装40 周前更新
代码仓库

关于 Dataset Curator

Dataset Curator 是面向机器学习从业者的数据集整理技能,覆盖质量评估、清理、增强与维护,并强调标签质量、数据溯源和版本记录。

主要功能

  1. 01评估数据集质量与偏差
  2. 02清除重复并处理缺失值
  3. 03检查并修正标签问题
  4. 04平衡类别并增强数据
  5. 05记录变更并管理版本

适用场景

  1. 01训练前检查数据集质量
  2. 02清理重复项和疑似错误标签
  3. 03缓解类别不平衡并扩充样本
  4. 04追踪数据处理过程以便复现

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/jmsktm/claude-settings --skill dataset-curator

安装后在 Claude Code 中输入/dataset-curator确认已加载。

详细介绍

数据集整理器

Dataset Curator 技能将引导你完成为机器学习模型准备高质量训练数据这一关键流程。数据质量是影响模型性能的最重要因素,但在这方面的投入往往不足。此技能可帮助你系统地清理、验证、扩充和维护数据集,从而训练出更好的模型。

从初始收集到持续维护,此技能涵盖去重、标签质量评估、偏差检测、扩充策略和版本控制。它采用生产级 ML 系统的最佳实践,确保你的数据集不仅干净,还能针对学习目标进行策略性优化。

无论你是在构建分类器、微调大模型,还是训练自定义模型,此技能都能确保你的数据基础稳固。

核心工作流

工作流 1:评估数据集质量
  1. 分析数据集:
    • 大小和维度
    • 标签分布和平衡情况
    • 缺失值模式
    • 特征统计信息
  2. 识别质量问题:
    • 重复项(完全重复和近似重复)
    • 错误标注的样本
    • 异常值和异常情况
    • 数据泄漏
    • 偏差和代表性缺失
  3. 衡量质量指标:
    def assess_quality(dataset):
        return {
            "size": len(dataset),
            "duplicate_rate": find_duplicates(dataset).ratio,
            "missing_rate": dataset.isnull().mean(),
            "label_balance": compute_entropy(dataset.labels),
            "outlier_rate": detect_outliers(dataset).ratio,
            "estimated_label_noise": estimate_label_noise(dataset)
        }
    
  4. 按影响确定问题优先级
  5. 制定整改计划
工作流 2:清理和准备数据
  1. 删除重复项:
    • 完全重复:基于哈希去重
    • 近似重复:基于相似度进行聚类
    • 决定:保留第一项、最佳项,或合并
  2. 处理缺失值:
    • 理解缺失机制(MCAR、MAR、MNAR)
    • 适当进行插补、删除或标记
  3. 修正标签质量:
    • 通过置信度评分识别可能的错误标签
    • 转交人工审核或自动更正
    • 记录标注指南
  4. 规范化并标准化:
    • 统一格式
    • 验证架构
    • 统一编码
  5. 验证清理后的数据集
工作流 3:扩充并平衡数据
  1. 分析类别不平衡情况:
    • 计算不平衡比例
    • 评估对模型训练的影响
  2. 应用平衡策略:
    • 过采样少数类(SMOTE、随机采样)
    • 欠采样多数类
    • 训练时使用类别权重
  3. 生成扩充样本:
    • 文本:释义改写、同义词替换、回译
    • 图像:旋转、翻转、颜色抖动、mixup
    • 表格数据:注入噪声、扰动特征
  4. 验证扩充质量:
    • 确保扩充样本符合实际情况
    • 检查是否引入偏差
  5. 对变更进行版本管理并记录

快速参考

操作命令/触发语
评估质量“检查此数据集的质量”
查找重复项“查找数据集中的重复项”
清理标签“修正错误标注的数据”
平衡类别“处理类别不平衡”
扩充数据“为 [task] 扩充数据集”
管理数据集版本“设置数据集版本管理”

最佳实践

  • 先分析,再处理:在修改数据前先了解数据

    • 计算统计数据并可视化分布
    • 记录数据的原始状态,以供参考
    • 找出问题中的规律
  • 保留数据溯源信息:跟踪每一项转换

    • 像管理代码一样对数据集进行版本控制
    • 记录所有清洗操作
    • 维护原始数据与清洗后数据之间的映射关系
  • 优先保证标签质量:垃圾标签进,垃圾模型出

    • 制定清晰的标注指南
    • 使用多位标注人员并衡量一致性
    • 定期对标签进行质量审核
  • 测试清洗效果:衡量清洗的影响

    • 分别使用原始数据和清洗后的数据训练模型
    • 跟踪哪些清洗步骤最有效
    • 避免影响性能的清洗操作
  • 谨慎分层拆分:确保训练集、验证集和测试集的分布一致

    • 按标签和关键特征进行分层
    • 将相关样本放在同一数据集中
    • 如适用,确保时间顺序
  • 记录所有内容:未来的你会感谢现在的你

    • 编写数据集卡片,列出关键统计数据
    • 记录已知问题和限制
    • 记录数据收集方法和偏差

高级技术

使用 Confident Learning 处理标签噪声

识别并修正标注错误的样本:

from cleanlab import find_label_issues

# Train model to get predicted probabilities
model.fit(X_train, y_train)
pred_probs = model.predict_proba(X_train)

# Find likely mislabeled examples
issues = find_label_issues(
    labels=y_train,
    pred_probs=pred_probs,
    return_indices_ranked_by="self_confidence"
)

# Review and correct top issues
for idx in issues[:100]:
    review_and_correct(X_train[idx], y_train[idx])
基于相似度去重

使用嵌入向量移除近似重复项:

def deduplicate_semantic(texts, threshold=0.95):
    embeddings = embed(texts)
    clusters = cluster_by_similarity(embeddings, threshold)

    # Keep one representative per cluster
    deduplicated = []
    for cluster in clusters:
        representative = select_best(cluster)  # longest, most recent, etc.
        deduplicated.append(representative)

    return deduplicated
使用主动学习提高标注效率

优先投入标注工作:

def active_learning_loop(unlabeled_pool, labeled_set, budget):
    while len(labeled_set) < budget:
        # Train on current labeled data
        model.fit(labeled_set)

        # Score unlabeled by uncertainty
        uncertainties = model.uncertainty(unlabeled_pool)

        # Select most uncertain for labeling
        to_label = select_top_k(unlabeled_pool, uncertainties, k=10)
        labels = human_label(to_label)

        # Update sets
        labeled_set.add(to_label, labels)
        unlabeled_pool.remove(to_label)

    return labeled_set
数据切片分析

找出有问题的子群体:

def find_weak_slices(model, data, features):
    # Evaluate on all slices
    slices = generate_slices(data, features)

    weak_slices = []
    for slice_name, slice_data in slices:
        performance = evaluate(model, slice_data)
        if performance < overall_performance - threshold:
            weak_slices.append({
                "slice": slice_name,
                "size": len(slice_data),
                "performance": performance
            })

    return sorted(weak_slices, key=lambda x: x["performance"])

应避免的常见陷阱

  • 对测试数据采用与训练数据相同的清洗方式(会导致数据泄漏)
  • 过度去重,移除有效的差异样本
  • 未了解缺失机制就填补缺失值
  • 以引入不真实样本的方式进行数据增强
  • 等到模型训练失败时才关注类别不平衡
  • 未对数据集进行版本控制,导致实验无法复现
  • 认为数据越多越好(质量优于数量)
  • 未记录数据收集过程中的偏差和限制

评论

支持 Markdown