data-labeling について
機械学習向けのデータラベリングを設計・実行するエージェント用スキルです。スキーマ設計から品質管理、出力まで、手動、モデル支援、アクティブラーニング、弱教師あり学習を扱います。
主な機能
- 01ラベルスキーマとガイドラインの設計
- 02手動およびモデル支援アノテーション
- 03アクティブラーニングによるサンプル選定
- 04ラベリング関数による弱教師あり学習
- 05一致度評価と品質管理
- 06機械学習用データのエクスポート
活用シーン
- 01テキスト、画像、対話データセットの準備
- 02不確実なサンプルの優先的なラベリング
- 03複数アノテーター間の一致度測定
- 04検証済みラベルの学習形式への出力
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ seb1n/ awesome-ai-agent-skills --skill data-labelingインストール後、Claude Code で/data-labelingを入力して読み込まれたか確認します。
詳細
データラベリング
このスキルを使うと、AI エージェントは機械学習プロジェクト向けのデータラベリングワークフローを設計し、実行できます。Label Studio などのツールを使った手動アノテーション、モデルによる事前アノテーションを活用した半自動ラベリング、情報量が最も多いサンプルを優先するアクティブラーニングのループ、ラベリング関数を使ったプログラムによる弱教師あり学習を扱います。エージェントは、ラベルスキーマの設計、アノテーター向けガイドラインの作成、アノテーター間一致度による品質管理、ML で使用できる形式へのエクスポートを行います。
ワークフロー
-
ラベリングスキーマとガイドラインを定義する: ラベルの分類体系を設計します。分類タスクのクラス、NER のエンティティタイプ、物体検出のバウンディングボックスカテゴリ、またはセマンティックセグメンテーションのセグメントラベルなどです。各ラベルについて、境界事例や曖昧な状況を含めた、肯定例と否定例を示す明確なアノテーター向けガイドラインを作成します。
-
ラベリング環境をセットアップする: ラベリングツール(Label Studio、Labelbox、Prodiagy)にスキーマを設定し、生データをインポートして、適切な権限を持つユーザーアカウントを設定します。タスクの種類(テキスト分類、スパンアノテーション、画像のバウンディングボックス、複数ターンの対話タグ付けなど)に合ったラベリングインターフェースのテンプレートを定義します。
-
モデルの予測で事前アノテーションを行う: 既存のモデルやヒューリスティックなルールを使って、データセットの暫定ラベルを生成します。アノテーターは一からラベル付けするのではなく、予測を確認して修正するため、アノテーション時間を40~60%短縮できる可能性があります。これは、すでに妥当なベースラインモデルがあるタスクで特に有効です。
-
品質管理を行いながらラベリングを実施する: 冗長性を組み込んでアノテーターにラベリングタスクを割り当てます。同じ項目を2~3人のアノテーターにラベル付けしてもらい、アノテーター間一致度(Cohen のカッパ係数または Fleiss のカッパ係数)を測定します。一致度の低い項目にはフラグを立て、上級アノテーターによるレビューに回します。タスクキューに組み込んだゴールドスタンダードのデータセットを使って、アノテーターの精度を追跡します。
-
アクティブラーニングを繰り返す: 最初のラベル付きデータセットが作成されたら、モデルをトレーニングし、不確実性サンプリングまたはクエリ・バイ・コミッティーを使って、次のアノテーション対象として最も情報量の多い未ラベルの例を選択します。ラベル付けするサンプルごとのモデル改善を最大化できるため、ラベリングの予算が限られている場合に特に重要です。
-
エクスポートして検証する: トレーニングパイプラインで必要な形式(JSONL、COCO、CoNLL、CSV)でラベル付きデータをエクスポートします。検証を実行して、ラベルの一貫性、アノテーションの欠落、クラス分布が要件を満たしているかを確認します。再現性を確保するため、ラベリングのプロセスとデータセットの統計情報を記録します。
対応技術
- アノテーションツール: Label Studio、Labelbox、Prodigy(spaCy)、Amazon SageMaker Ground Truth、CVAT
- 弱教師あり学習: Snorkel、Flyingsquid、Skweak
- アクティブラーニング: modAL、ALiPy、Prodigy のアクティブラーニングレシピ
- 一致度指標: Cohen のカッパ係数、Fleiss のカッパ係数、Krippendorff のアルファ係数
- エクスポート形式: COCO JSON、Pascal VOC XML、CoNLL、JSONL、Hugging Face Datasets
使用方法
生データセット、タスクの種類(分類、NER、物体検出など)、ラベルカテゴリをエージェントに渡します。必要に応じて、希望するラベリングツールや品質要件(アノテーター間一致度の最低基準)も指定します。エージェントはラベリング環境を設定し、品質管理を整えて、アノテーションワークフローを管理します。
例
例1:テキスト分類のための Label Studio パイプライン
Label Studio のラベリングインターフェース設定(config.xml):
<View>
<Header value="Classify the customer review sentiment:" />
<Text name="text" value="$text" />
<Choices name="sentiment" toName="text" choice="single-column" showInline="true">
<Choice value="positive" />
<Choice value="negative" />
<Choice value="neutral" />
</Choices>
<Textarea name="notes" toName="text" placeholder="Optional: explain ambiguous cases"
maxSubmissions="1" editable="true" />
</View>
プロジェクトをセットアップしてデータをインポートする Python スクリプト:
from label_studio_sdk import Client
ls = Client(url="http://localhost:8080", api_key="your-api-key")
project = ls.start_project(
title="Customer Review Sentiment",
label_config=open("config.xml").read(),
description="Label customer reviews as positive, negative, or neutral.",
)
# Import tasks from a CSV file
import csv
tasks = []
with open("reviews.csv") as f:
for row in csv.DictReader(f):
tasks.append({"data": {"text": row["review_text"]}, "meta": {"source_id": row["id"]}})
project.import_tasks(tasks)
# Configure inter-annotator overlap: each task gets 2 annotators
project.set_params(maximum_annotations=2, overlap_cohort_percentage=100)
print(f"Created project with {len(tasks)} tasks, 2 annotators per task")
# After annotation, export results
annotations = project.export_tasks(export_type="JSON")
# Compute agreement
from sklearn.metrics import cohen_kappa_score
labels_a1 = [a["annotations"][0]["result"][0]["value"]["choices"][0] for a in annotations if len(a["annotations"]) >= 2]
labels_a2 = [a["annotations"][1]["result"][0]["value"]["choices"][0] for a in annotations if len(a["annotations"]) >= 2]
print(f"Cohen's kappa: {cohen_kappa_score(labels_a1, labels_a2):.3f}")
例2:Snorkel のラベリング関数を使った弱教師あり学習
import pandas as pd
import numpy as np
from snorkel.labeling import labeling_function, PandasLFApplier, LFAnalysis
from snorkel.labeling.model import LabelModel
SPAM = 1
HAM = 0
ABSTAIN = -1
df = pd.DataFrame({
"text": [
"Congratulations! You've won a free iPhone!", "Meeting at 3pm tomorrow",
"URGENT: claim your prize now!!!", "Can you review the Q3 report?",
"Buy cheap meds online fast", "Lunch plans for Thursday?",
"Click here for a free vacation", "Project deadline is next Friday",
]
})
@labeling_function()
def lf_contains_free(x):
return SPAM if "free" in x.text.lower() else ABSTAIN
@labeling_function()
def lf_contains_urgent(x):
return SPAM if "urgent" in x.text.lower() else ABSTAIN
@labeling_function()
def lf_contains_click(x):
return SPAM if "click" in x.text.lower() else ABSTAIN
@labeling_function()
def lf_excessive_punctuation(x):
return SPAM if x.text.count("!") >= 3 else ABSTAIN
@labeling_function()
def lf_contains_meeting(x):
return HAM if any(w in x.text.lower() for w in ["meeting", "project", "report", "deadline"]) else ABSTAIN
@labeling_function()
def lf_short_and_casual(x):
return HAM if len(x.text.split()) < 8 and "?" in x.text else ABSTAIN
lfs = [lf_contains_free, lf_contains_urgent, lf_contains_click,
lf_excessive_punctuation, lf_contains_meeting, lf_short_and_casual]
applier = PandasLFApplier(lfs=lfs)
L_train = applier.apply(df=df)
print(LFAnalysis(L=L_train, lfs=lfs).lf_summary())
# Train the label model to combine noisy labeling functions
label_model = LabelModel(cardinality=2, verbose=True)
label_model.fit(L_train=L_train, n_epochs=500, log_freq=100, seed=42)
# Get probabilistic labels
probs = label_model.predict_proba(L=L_train)
df["label"] = label_model.predict(L=L_train)
df["confidence"] = np.max(probs, axis=1)
# Filter out low-confidence samples for manual review
confident = df[df["confidence"] > 0.8]
needs_review = df[df["confidence"] <= 0.8]
print(f"Confidently labeled: {len(confident)}, needs manual review: {len(needs_review)}")
ベストプラクティス
- 詳細なアノテーションガイドラインを作成します。 各ラベルにつき、エッジケースを含む肯定例を少なくとも3つ、否定例を少なくとも3つ用意します。アノテーション担当者がラベル付け中に曖昧なケースを見つけたら、ガイドラインを更新します。
- 正解ラベルが既知のゴールドスタンダード項目(タスクの5〜10%)をアノテーションキューに組み込み、アノテーション担当者の品質を継続的に監視して、疲労や混乱を検出します。
- アノテーション担当者間の一致度を、Cohenのκ係数(担当者2人)またはFleissのκ係数(担当者3人以上)で測定します。κ係数が0.6を下回る場合は、先に進む前にガイドラインまたはスキーマを見直す必要があります。
- ラベル付けの予算が限られている場合は、アクティブラーニングを使用します。 不確実性が最も高い、または情報量の多いサンプルにアノテーション作業を集中させることで、ラベル付きサンプルを30〜50%減らしても、同等のモデル性能を達成できます。
- ラベル付きデータセットをバージョン管理します。 アノテーション担当者のID、タイムスタンプ、ガイドラインのバージョンなど、明確なメタデータを記録することで、ラベルを特定のアノテーションキャンペーンまでたどり、結果を再現できます。
- 規模を拡大する前に、50〜100サンプルのパイロットラウンドから始めます。 パイロットを使ってガイドラインを調整し、アノテーション速度を見積もり、スキーマの問題を早期に特定します。
エッジケース
- アノテーション担当者間の不一致が大きい場合: κ係数が0.4を下回る場合は、タスクの定義が曖昧である可能性が高いです。問題のあるラベルをより具体的なサブラベルに分割する、ガイドラインに例を追加する、または認識をそろえるためにアノテーション担当者との調整セッションを実施します。
- 生データのクラス不均衡が著しい場合: 対象クラスがまれ(5%未満)だと、ランダムサンプリングでは肯定例がほとんど得られません。キーワードフィルタリング、モデルベースの事前選別、または層化サンプリングを使い、肯定例である可能性が高いサンプルをアノテーションキューに多く含めます。
- 弱教師あり学習でラベリング関数が競合する場合: 複数のラベリング関数が同じサンプルに異なるラベルを付けると、ラベルモデルの予測信頼度が低くなる可能性があります。より具体的な関数を追加してラベリング関数の網羅性を高めるか、競合するサンプルを手動アノテーションに回します。
- 大量のバッチでアノテーション担当者が疲労する場合: 2〜3時間続けてラベル付けすると、品質が低下します。作業を100〜200項目のセッションに分割し、タスクの順序をランダム化して、ゴールドスタンダードに対するセッションごとの正解率を追跡し、品質の低下を検出します。
- プロジェクト途中でスキーマが変更された場合: アノテーション開始後に新しいラベルカテゴリが追加された場合は、以前にラベル付けしたデータをすべて新しいカテゴリについて見直す必要があります。既存のアノテーションを遡って編集するのではなく、バージョン管理されたスキーマと再アノテーションキューを使用します。