ラベリング、まだ全部やっていませんか?

画像分類タスクで50万枚の画像があるとします。1枚あたり20秒と仮定しても、2,700時間以上かかります。1日8時間労働で換算すると、1年以上ラベリングだけに費やす計算です。😱

しかし本当の問題は時間ではありません。ほとんどのサンプルはモデル学習にほとんど貢献しないという点です。似たような猫の画像を10万枚ラベリングしても、モデルが得る情報量は数枚分程度です。

そこで登場するのが Active Learning(能動学習) です。核心的なアイデアはシンプルです。

「モデルよ、君が本当に迷っているサンプルだけ人間に聞いてくれ。」

ラベリングが高コストで遅い環境(医療、金融、自動運転など)で特に威力を発揮する手法です。本記事では、実務で即使える 3つのクエリ戦略 をPythonコードとともに解説します。

  1. Uncertainty Sampling — モデルが最も迷うサンプルを選択
  2. Diversity Sampling — 特徴空間で希少な領域のサンプルを選択
  3. Query by Committee — 複数モデルの意見が割れるサンプルを選択

ワークフロー全体とノートブックは 根拠資料 から確認できます。


なぜActive Learningが実務で重要なのか

決定境界付近のサンプルこそが宝

モデルが最も不確実な領域は、通常 決定境界(decision boundary)付近 です。この領域のサンプル1つは、明らかなpositiveサンプル10個よりも情報量が多いです。

自動運転モデルを例に挙げます。駐車車両の陰から突然飛び出す自転車のような long-tailケース は、生データ収集段階ではほとんど取得できません。Active Learningを使えば、こうした希少ケースがモデルによって先にsurfaceされ、人間はそれだけをレビューすればよくなります。

不正検知(fraud detection)も同様です。明らかな正常取引と明らかな不正取引の間の 曖昧なケースのみ を人間がレビューするよう、モデルが誘導できます。

💡 実務のヒント: アノテーター数が限られている国内プロジェクトでは、Active Learningは「アノテーターが1日にレビューできるサンプル数」を変えずにモデル性能を引き上げる、最も現実的なカードです。

Data scientist reviewing unlabeled dataset distribution on dashboard for active learning pipeline System Abstract Visual

戦略1: Uncertainty Sampling — 最初に試すべき基本

実装が最も簡単で初期性能の改善が大きいため、実務で 最初に 試す戦略です。

ワークフロー

  1. 少量の初期ラベルデータでモデルを学習
  2. Unlabeled poolに対して確率予測
  3. 決定境界(0.5)に最も近いサンプルを選択
  4. 人間がラベリング → 再学習 → 繰り返し

初期モデルは高性能である必要はまったくありません。大まかな確率推定 ができれば十分です。

コード: Cross-Validationで最初のモデルを作る

from sklearn.model_selection import StratifiedKFold, GridSearchCV
from sklearn.linear_model import LogisticRegression
import numpy as np

# ラベルデータを学習・検証フォールドに分割
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

# 過学習防止のため軽量なグリッドサーチ
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10]}
base_model = LogisticRegression(max_iter=1000)

grid = GridSearchCV(base_model, param_grid, cv=skf, scoring='f1')
grid.fit(X_labeled, y_labeled)

print(f"Best params: {grid.best_params_}")
print(f"Best F1: {grid.best_score_:.4f}")

コード: Unlabeledデータのスコアリングと不確実領域のサンプル選択

# Unlabeled poolに対する陽性クラス確率の予測
probs = grid.best_estimator_.predict_proba(X_unlabeled)[:, 1]

# 決定境界(0.5)付近のバンドを設定(例: 0.45 ~ 0.55)
uncertainty_window = (probs > 0.45) & (probs < 0.55)
uncertain_indices = np.where(uncertainty_window)[0]

print(f"不確実サンプル数: {len(uncertain_indices)}")

# 次のバッチでラベリング依頼するサンプル
next_batch_X = X_unlabeled[uncertain_indices]
next_batch_indices = uncertain_indices

⚠️ 注意事項

  • 狭い領域ばかり掘りすぎると偏る 可能性があります。数回繰り返したら必ずDiversity Samplingと混ぜてください。
  • モデルの確率推定自体が不正確な場合(例: キャリブレーションされていない深層学習モデル)、効果は半減します。
  • 繰り返すほど不確実領域は狭くなります。これがplateauに達したら戦略を変えるサインです。

戦略2: Diversity Sampling — 特徴空間の空白を埋める

Uncertainty Samplingを数ラウンド回すと、似たようなedge caseばかりが繰り返し選ばれる現象 に遭遇します。このタイミングでDiversity Samplingに切り替えるべきです。

アイデア

  • 密なクラスタ内のサンプル → 既に学習済みのものと類似している可能性が高い
  • 希薄領域のサンプル → まだカバーできていないfeature space

KNNで各サンプルの 最近傍までの平均距離 を計算し、距離が大きいサンプルを優先的にラベリングします。

コード: KNNベースのDiversityサンプリング

from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import StandardScaler

# 距離計算の前に必ずスケーリング(Euclidean距離ベースのため)
scaler = StandardScaler()
X_unlabeled_scaled = scaler.fit_transform(X_unlabeled)

# 各サンプルのk個の最近傍までの平均距離を計算
k = 10
nbrs = NearestNeighbors(n_neighbors=k + 1, metric='euclidean').fit(X_unlabeled_scaled)
distances, _ = nbrs.kneighbors(X_unlabeled_scaled)

# 自分自身を除外して平均距離
avg_distances = distances[:, 1:].mean(axis=1)

# 平均距離が大きい(希薄領域)サンプルをtop-N選択
batch_size = 55
diverse_indices = np.argsort(avg_distances)[-batch_size:]

print(f"選択されたdiverseサンプル数: {len(diverse_indices)}")

バッチサイズは通常 50〜60個 程度が実務で扱いやすいです。ラベリング後に再学習し、確率分布を再度プロットしながら次のラウンド戦略を決定します。

💡 実務のヒント: レコメンドシステムや異常検知プロジェクトで、ラベルデータが特定のユーザー層に偏っている場合、Diversity Samplingがバイアス緩和に特に有効です。

Python code editor showing uncertainty sampling and KNN diversity selection implementation Developer Related Image

戦略3: Query by Committee — モデル間の意見対立を活用する

単一モデルの代わりに 複数モデルの委員会(committee) を構成し、意見が割れるサンプルをラベリング対象とする戦略です。

なぜ効果的なのか

異なる学習アルゴリズム(線形、木、カーネル)はデータを異なる視点で見ます。複数モデルが 同時に同じ予測 を出せばそのサンプルは情報量が少なく、意見が割れれば 決定境界付近の難しいサンプルであることを意味します。

コード: 3種類のモデルでCommitteeを構成

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC

def train_committee(X_labeled, y_labeled):
    """現在のラベルデータで異なる3種類のモデルを学習"""
    committee = {
        'lr': LogisticRegression(C=0.001, max_iter=1000),
        'rf': RandomForestClassifier(n_estimators=100, max_depth=7, min_samples_leaf=4, random_state=42),
        'svm': SVC(C=1, probability=True, random_state=42),
    }
    for name, model in committee.items():
        model.fit(X_labeled, y_labeled)
    return committee

committee = train_committee(X_labeled, y_labeled)

コード: Committee不一致スコアの計算

# 各モデルの陽性クラス確率を収集
committee_probs = np.column_stack([
    model.predict_proba(X_unlabeled)[:, 1]
    for model in committee.values()
])

# モデル間の分散 = disagreement score
disagreement_scores = committee_probs.var(axis=1)

# 不一致が大きいtopサンプルを選択
batch_size = 55
disagree_indices = np.argsort(disagreement_scores)[-batch_size:]

print(f"選択されたdisagreementサンプル数: {len(disagree_indices)}")

Stackingで性能まで確保する

Committeeの各モデル予測値をfeatureとして積み上げ、メタモデル(stacking layer) を学習すると性能が大きく向上します。

ModelBest ParamsF1PrecisionRecall
LogisticRegressionC=0.0010.76880.69750.8564
RandomForestdepth=7, leaf=4, n=1000.87530.87180.8806
ExtraTreesdepth=7, leaf=6, n=1000.87720.86190.8977
SVMC=10.92580.96360.8936
Stacking (LR)C=0.10.93600.92230.9500

Stacking後に Recallが0.95まで 上昇するのがポイントです。Precisionはわずかに犠牲になりますが、陽性サンプルを見逃すと致命的なドメイン(医療、不正検知)ではこのトレードオフは十分に価値があります。

3つの戦略、いつ何を使うべきか

状況推奨戦略
ラベルデータが少なく、初期性能改善が急務Uncertainty Sampling
Uncertaintyがplateauに達し、バイアスが懸念されるDiversity Sampling
決定境界がnoisy、または既に複数モデルを保有Query by Committee

⚠️ Active Learningの限界

  • サンプリング戦略がすべてです。 悪い戦略はモデルを収束不可能にします。
  • Sampling Biasのリスク。 Uncertaintyのみを回すと特定領域に過集中し、汎化が崩れます。
  • 人間は依然として必要です。 サンプル選択は自動化されますが、ラベリング自体は専門家が行う必要があるドメイン(医療、法律、セキュリティ)が多いです。
  • 追加の計算コスト。 毎サイクルで再学習が必要なため、ラベリング削減 vs 計算コストを天秤にかける必要があります。

次のステップ学習方向

  • Deep Active Learning: Bayesian Neural NetworkやMC Dropoutで深層学習モデルの不確実性を推定
  • BALD (Bayesian Active Learning by Disagreement): 情報理論ベースのサンプル選択
  • Core-Set Selection: カバレッジ最大化の観点からのバッチ選択
  • Human-in-the-loopパイプライン: Label Studio、ProdigyなどのツールとActive Learningループの連携

AIエージェントのトレンドにも興味があれば、Holotron-12BとNVIDIA Nemotronベースのコンピュータ使用AIモデル分析も合わせてご覧ください。

Machine learning engineer training committee of models for query by committee active learning workflow Coding Session Visual

まとめ

Active Learningの本質はシンプルです。「ラベリングする価値のあるサンプルだけをラベリングする。」

  • ラベルコストが高い組織ほど効果が大きい
  • 3つの戦略を 混ぜて使う ことが単一戦略よりはるかに強力
  • 序盤はUncertainty、中盤はDiversity、境界がnoisyならCommittee

アノテーター数が限られているスタートアップや、社内データラベリングプロセスを初めて構築するチームに特におすすめしたい手法です。50万枚すべてをラベリングする必要はありません。本当に必要な5千枚をうまく選べばよいのです。🚀

あわせて読みたい

原文のワークフローとノートブックは 根拠資料 から確認できます。

本コンテンツは、信頼性の高い情報源をもとにAIツールを活用して作成され、編集者によるレビューを経て公開されています。専門家によるアドバイスの代替となるものではありません。