コンテンツにスキップ

Evaluation と Result

このページでは、EvaluatorクラスとResultクラスの詳細な使い方を説明します。

Evaluator

Evaluatorは、収集したデータに対して評価を実行し、過去の評価結果を管理するためのクラスです。

初期化

from ml_debugger.evaluator import Evaluator

evaluator = Evaluator(
    model_name="resnet18",
    version_name="v1",
)

評価の実行

result = evaluator.request_evaluation()

オプションパラメータ

result = evaluator.request_evaluation(
    result_name="my_evaluation",    # 評価結果の識別子(省略可)
    n_epoch="latest",               # 対象エポック(省略可)
)
パラメータ 説明 デフォルト
result_name 評価結果の識別子。省略時は自動生成 自動生成
n_epoch 評価対象のエポック。"latest"で最新エポック 全エポック

n_epochの明示的な指定を推奨

n_epoch はデフォルトでは全エポックが対象ですが、意図しないデータの混在を避けるために明示的に値を指定することを推奨します。 "latest" はtimestampに基づいて最新エポックを判定するため、同じ version_name でエポックをやり直した場合に意図しないデータが使用される可能性があります。 詳細は model_name / version_name を参照してください。

評価結果一覧の取得

results_df = evaluator.list_results()

オプションパラメータ

results_df = evaluator.list_results(
    result_name="my_evaluation",    # 特定のresult_nameでフィルター(省略可)
    method_name="default",          # 評価方法名でフィルター(省略可)
    n_epoch="latest",               # 対象エポックでフィルター(省略可)
)
パラメータ デフォルト 説明
result_name Optional[str] None 特定のresult_nameでフィルター。Noneで全結果を取得
method_name Optional[str] None 評価方法名でフィルター。"default"エイリアス利用可能
n_epoch Union[str, int, None] "latest" 対象エポックでフィルター。"latest"で最新、"all"で全エポック、整数で特定エポック

出力例

                                    result_name        method_name n_epoch  \
0  resnet18_v1_classification_v1_20251219  classification_v1    None

                    created_at                 completed_at options     status
0  2025-12-19T07:49:28.706773Z  2025-12-19T07:49:30.994131Z      {}  Completed

特定の評価結果の取得

result = evaluator.get_result(result_name="resnet18_v1_classification_v1_20251219")

Result

Resultは、単一の評価結果を表すクラスです。メトリクスやエラーコードの詳細を取得できます。

基本情報

print(result.result_name)   # 評価結果の識別子
print(result.model_name)    # モデル名
print(result.version_name)  # バージョン名

メトリクスサマリー

print(result.metrics_summary())

# 特定のdataset_typeのみ表示
print(result.metrics_summary(dataset_type="train"))
パラメータ デフォルト 説明
dataset_type Optional[str] None 出力をフィルタリングするdataset_type。Noneで全dataset_typeを表示

出力例(Classification task):

dataset  counts  accuracy  auroc  auprc  net_entropy_loss  net_entropy  error_proba_auroc  error_proba_auprc
train    5000    0.098     0.457  0.094  12875.500         10480.190    0.857              0.453

出力されるメトリクスはタスクによって異なります。

メトリクス 説明
counts データポイント数
accuracy 正解率
auroc ROC曲線下面積
auprc PR曲線下面積
net_entropy_loss エントロピー損失の合計
net_entropy エントロピーの合計
error_proba_auroc エラー確率推定のAUROC
error_proba_auprc エラー確率推定のAUPRC

AP / AR系の指標は、max detections = [1, 10, 100] の COCOeval に基づいて算出されます。

メトリクス 説明
counts 検出数(予測 + GT)
counts_pred_boxes / counts_gt_boxes 予測BBox / Ground Truth BBox総数
counts_img 画像数
matched_ratio マッチした検出の割合
AP / AP_50 / AP_75 Average Precision(全体 / IoU=0.50 / IoU=0.75)
AP_small / AP_medium / AP_large オブジェクトサイズ別のAP
AR_1 / AR_10 / AR_100 最大検出数別のAverage Recall
AR_small / AR_medium / AR_large オブジェクトサイズ別のAR
average_iou_matched / average_iou マッチした検出 / 全体の平均IoU
average_score 予測スコアの平均
accuracy 分類正解率
net_entropy / net_entropy_loss エントロピー / エントロピー損失の合計
net_focal_loss Focal Lossの合計
average_logit_margin ロジットマージンの平均
error_proba_auroc / error_proba_auprc エラー確率推定のAUROC / AUPRC

2D ODの共通メトリクス(counts, matched_ratio, accuracy, entropy, focal loss, logit margin, error_proba等)に加え、AP/AR系が以下の3D固有メトリクスに置き換わります。

メトリクス 説明
mAP_3D / mAP_BEV 3D / BEV mean Average Precision
AP_3D_025 / AP_3D_05 / AP_3D_07 3D AP(IoU閾値 0.25 / 0.50 / 0.70)
AP_BEV_025 / AP_BEV_05 / AP_BEV_07 BEV AP(IoU閾値 0.25 / 0.50 / 0.70)
average_iou_3d / average_iou_bev 平均3D IoU / 平均BEV IoU

Issue Categoryサマリー

print(result.issue_category_summary())

# 特定のdataset_typeのみ表示
print(result.issue_category_summary(dataset_type="train"))
パラメータ デフォルト 説明
dataset_type Optional[str] None 出力をフィルタリングするdataset_type。Noneで全dataset_typeを表示

出力例:

dataset  stable_coverage_ratio  operational_coverage_ratio  hotspot_ratio  recessive_hotspot_ratio  critical_hotspot_ratio  aleatoric_hotspot_ratio
train    0.000                  0.001                       0.753          0.226                    0.019                   0.006

Issue Categoryの説明

MLdebuggerは、データポイントを内部特徴量の安定性とエラー確率に基づいて6つのカテゴリに分類します。

カテゴリ 説明 推奨アクション
stable_coverage (Highly Stable) 内部特徴量が安定しており、予測の信頼性が高い領域 対応不要
operational_coverage (Stable) モデルの確信度は高くないが、内部特徴量が安定しており運用上許容される領域 データ追加(低優先度)、継続モニタリング
hotspot (Unstable) 内部特徴量が不安定で、予測の信頼性を保証することが困難な領域 データ追加、再学習、Data Augmentation
recessive_hotspot (Under-Confidence) モデルの確信度が低く、エラーを予測しやすい領域 確信度フィルタリング、Human-in-the-loop、別モデル分岐
critical_hotspot (Over-Confidence) 内部特徴量からエラーが頻発する可能性が高い領域 最優先でデータ追加、Hard Negative Mining、アンサンブル検討
aleatoric_hotspot (Outlier) 特徴量が不十分で、モデルが学習困難な領域 アノテーション修正、タスク定義見直し、OOD検出で除外

詳細サマリー

result.get_summary()

# 特定のdataset_typeのみ表示
result.get_summary(dataset_type="train")
パラメータ デフォルト 説明
dataset_type Optional[str] None 出力をフィルタリングするdataset_type。Noneで全dataset_typeを表示

このメソッドは以下を含む詳細なサマリーを表示します:

  • 評価情報(model, version, result_name)
  • メトリクスサマリー
  • Issue Categoryサマリー
  • 各カテゴリの詳細なエラーコード分布

Issue一覧の取得

issues_df = result.get_issues()

DataFrameとして全てのIssue(エラーコード)の一覧を取得できます。

カラム

カラム 説明
issue_id Issue ID
dataset_type データセット種別
category Issue Category
error_code エラーコード
debug_code デバッグコード(epistemic/aleatoric)
counts_ratio 全体に対する割合
counts データポイント数
その他 タスク固有のメトリクス

Object Detection(2D / 3D)では、上記に加えて diagnosis(診断結果)、counts_pred_boxes / counts_gt_boxes(予測/GT BBox数)、average_iouaverage_score が含まれます。 3D ODではさらに average_iou_3daverage_iou_bev が追加されます。

タスク別のエラーコード

error_codedebug_codeの形式はタスクによって異なります。 詳細はError Codes - ClassificationおよびError Codes - Object Detectionを参照してください。

カスタムビューの取得

任意の条件別にIssueの状況を可視化するための機能です。 Tracerでデータ収集時にカスタムメタデータ(追加カラム)を記録していた場合、そのメタデータごとのIssue分布の違いを可視化できます。

view_df = result.get_view(
    groupby=["category", "error_code"],
    adjustby="category",
)

パラメータ

パラメータ 説明
groupby List[str] グループ化するカラムのリスト
adjustby Optional[str] 比率を調整する基準カラム
query Optional[str] フィルタリング条件(pandas query形式)

基本的な使用例

# Hotspotカテゴリのみを取得
hotspot_view = result.get_view(
    query="category == 'hotspot'",
    groupby=["error_code"],
)

# dataset_type別に集計
dataset_view = result.get_view(
    groupby=["dataset_type", "category"],
)

カスタムメタデータを使った分析

Tracerでデータ収集時に追加カラムを定義していた場合、そのカラムでグループ化してIssue分布を分析できます。

# Object Detection: オブジェクトサイズ別のエラー分布を確認
size_view = result.get_view(
    groupby=["object_size", "category"],
    adjustby="object_size",
)

# Classification: 撮影条件別のエラー分布を確認
condition_view = result.get_view(
    groupby=["lighting_condition", "category"],
    adjustby="lighting_condition",
)

カスタムメタデータの活用

Tracerでデータ収集時にadditional_columnsを定義することで、任意のメタデータを記録できます。 これにより、以下のような分析が可能になります:

  • Object Detection: オブジェクトサイズ別、オクルージョン有無別のエラー発生状況
  • Classification: 撮影環境別、データソース別のエラー分布
  • 共通: 時間帯別、デバイス別、地域別などの条件別分析

エラーコードについて

エラーコードの形式と読み方はタスクによって異なります。

完全なサンプルコード

from ml_debugger.evaluator import Evaluator

# Evaluatorの初期化
evaluator = Evaluator(
    model_name="resnet18",
    version_name="v1",
)

# 評価の実行
result = evaluator.request_evaluation(
    result_name="experiment_20251219",
    n_epoch="latest",
)

# 結果の確認
print("=== Metrics Summary ===")
print(result.metrics_summary())

print("\n=== Issue Category Summary ===")
print(result.issue_category_summary())

print("\n=== Detailed Summary ===")
result.get_summary()

# Issue一覧をDataFrameで取得
issues_df = result.get_issues()
print(f"\nTotal issues: {len(issues_df)}")

# Hotspotの詳細を確認
hotspot_issues = issues_df[issues_df["category"] == "hotspot"]
print(f"Hotspot issues: {len(hotspot_issues)}")

# カスタムビューの取得
view = result.get_view(
    groupby=["category"],
    adjustby=None,
)
print("\n=== Category Distribution ===")
print(view)

次のステップ