Dataset Curator について
Dataset Curatorは、機械学習の学習データを準備するためのスキルです。品質評価、クリーニング、拡張、維持を扱い、ラベル品質やデータの来歴、バージョン管理にも注目します。
主な機能
- 01データセットの品質と偏りの評価
- 02重複の削除と欠損値の処理
- 03ラベル問題の確認と修正
- 04クラス調整とデータ拡張
- 05変更の追跡とバージョン管理
活用シーン
- 01学習前のデータセット品質確認
- 02重複や誤ラベル候補のクリーニング
- 03クラス不均衡への対処とサンプル拡張
- 04再現性のためのデータ処理追跡
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jmsktm/ claude-settings --skill dataset-curatorインストール後、Claude Code で/dataset-curatorを入力して読み込まれたか確認します。
詳細
データセットキュレーター
データセットキュレーターのスキルは、機械学習モデル向けの高品質なトレーニングデータを準備する重要なプロセスをガイドします。データ品質はモデルの性能を左右する最も重要な要素ですが、十分な投資が行われていないことがよくあります。このスキルを活用すると、データセットを体系的にクリーニング、検証、拡張、保守し、より優れたモデルにつなげることができます。
初期収集から継続的な保守まで、このスキルでは重複排除、ラベル品質の評価、バイアスの検出、拡張戦略、バージョン管理を扱います。本番環境の ML システムにおけるベストプラクティスを適用し、データセットを単にクリーンにするだけでなく、学習目標に合わせて戦略的に最適化します。
分類器の構築、LLM のファインチューニング、カスタムモデルのトレーニングのいずれを行う場合も、このスキルを使えばデータの基盤を確かなものにできます。
主なワークフロー
ワークフロー 1:データセットの品質を評価する
- データセットのプロファイルを作成します:
- サイズと次元
- ラベルの分布とバランス
- 欠損値のパターン
- 特徴量の統計情報
- 品質上の問題を特定します:
- 重複(完全一致および類似重複)
- ラベル付けが誤っているサンプル
- 外れ値と異常値
- データリーク
- バイアスと表現の偏り
- 品質指標を測定します:
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) } - 影響度に応じて問題の優先順位を付けます
- 是正計画を作成します
ワークフロー 2:データをクリーニングして準備する
- 重複を削除します:
- 完全一致の重複:ハッシュベースの重複排除
- 類似重複:類似度ベースのクラスタリング
- 方針を決定:最初のもの、最良のものを残す、または統合する
- 欠損値を処理します:
- 欠損のメカニズム(MCAR、MAR、MNAR)を理解する
- 適切に補完、削除、またはフラグ付けする
- ラベル品質を修正します:
- 確信度スコアを使って、ラベル付けが誤っている可能性の高いサンプルを特定する
- 人によるレビュー、または自動修正に回す
- ラベル付けのガイドラインを文書化する
- 正規化と標準化を行います:
- 一貫性のある書式
- スキーマの検証
- エンコーディングの標準化
- クリーニング済みのデータセットを検証します
ワークフロー 3:データを拡張してバランスを調整する
- クラスの不均衡を分析します:
- 不均衡比を計算する
- モデルのトレーニングへの影響を評価する
- バランス調整戦略を適用します:
- 少数クラスのオーバーサンプリング(SMOTE、ランダム)
- 多数クラスのアンダーサンプリング
- トレーニング時のクラス重み
- 拡張データを生成します:
- テキスト:言い換え、類義語への置換、逆翻訳
- 画像:回転、反転、色の揺らぎ、Mixup
- 表形式データ:ノイズの注入、特徴量の摂動
- 拡張データの品質を検証します:
- 拡張サンプルが現実的であることを確認する
- 新たに生じたバイアスがないか確認する
- 変更をバージョン管理し、文書化します
クイックリファレンス
| 操作 | コマンド/トリガー |
|---|---|
| 品質を評価する | "このデータセットの品質を確認して" |
| 重複を見つける | "データセット内の重複を見つけて" |
| ラベルを修正する | "誤ったラベルのデータを修正して" |
| クラスのバランスを調整する | "クラスの不均衡に対処して" |
| データを拡張する | "[task] 向けにデータセットを拡張して" |
| データセットをバージョン管理する | "データセットのバージョン管理を設定して" |
ベストプラクティス
-
処理前にプロファイリングする:データを変更する前に、データの内容を把握します
- 統計量を計算し、分布を可視化します
- 参照できるように元の状態を記録します
- 問題のパターンを特定します
-
来歴を保持する:あらゆる変換を追跡します
- コードと同様にデータセットをバージョン管理します
- すべてのクリーニング操作を記録します
- 元データとクリーニング済みデータの対応関係を維持します
-
ラベルの品質を優先する:不適切なラベルからは、不適切なモデルしか生まれません
- 明確なラベル付けガイドラインの整備に取り組みます
- 複数のアノテーターを起用し、評価者間の一致度を測定します
- ラベルの品質を定期的に監査します
-
クリーニングの影響をテストする:クリーニングの効果を測定します
- 元データとクリーニング済みデータでモデルを学習させます
- どのクリーニング手順が最も効果的かを追跡します
- パフォーマンスを低下させるクリーニングは避けます
-
分割を慎重に層化する:学習用、検証用、テスト用データの分布を維持します
- ラベルと主要な特徴量で層化します
- 関連するサンプルは同じ分割にまとめます
- 該当する場合は時系列順を維持します
-
すべてを記録する:将来の自分が、今の自分に感謝するでしょう
- 主要な統計情報を記載したデータセットカード
- 既知の問題と制限事項
- 収集方法とバイアス
高度な手法
ラベルノイズに対する確信度ベースの学習
誤ったラベルが付いたサンプルを特定して修正します:
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"])
避けるべきよくある落とし穴
- テストデータを学習データと同じ方法でクリーニングする(データリークの原因になります)
- 重複排除を過剰に行い、妥当なバリエーションまで削除してしまう
- 欠損のメカニズムを理解せずに値を補完する
- 非現実的なサンプルを生み出す方法でデータを拡張する
- モデルの学習に失敗するまでクラスの不均衡を無視する
- データセットをバージョン管理せず、実験の再現性を損なう
- データは多いほどよいと考える(量より質が重要です)
- データ収集におけるバイアスと制限事項の記録を怠る