Skip to content

ガイド

分類器と回帰器

予測モデルは他のシステムと同じように評価されます。呼び出し可能オブジェクトが各ケースに対して予測を返し、評価器がそれを読みます。変わるのは分母です。正解率 (accuracy)、再現率 (recall)、適合率 (precision) は、3 つの異なる行の集合に対する 3 つの割合であり、モデルはそのうちの 1 つでは良く見えても、ビジネスが問うている問いには答えられていないことがあります。

このページで実行するプロジェクトは examples/churn_model/ です。200 件のアカウント、決定的な解約予測モデルからなり、プロバイダーの認証情報は不要です。

予測

システムはラベルと、モデルにスコアがあればその根拠となるスコアを返します。

from oloproof import system


@system(name="churn-model", version="slice-f-example")
def run(account):
    score = churn_score(account)
    return {"label": score >= 0.5, "score": round(score, 4)}

ケースは expected の下に正解を宣言します。

{"expected": {"label": false}, "id": "account_000", "input": {"recent_upgrade": true, "support_contacts": 0, "tenure_months": 0}, "metadata": {"plan": "enterprise"}}

`predictive:` ブロック

予測、そのスコア、正解がどこにあるかは、プロジェクトに対して一度だけ宣言します。

predictive:
  label_field: label
  score_field: score
  expected_field: label
  positive: true
  calibration_bins: 10
  thresholds: [0.3, 0.4, 0.5, 0.6, 0.7]
フィールドデフォルト意味
label_fieldlabel予測ラベルを保持する出力フィールド
score_fieldscoreその根拠となるスコアを保持する出力フィールド
expected_fieldlabelexpected の下で正解を保持するフィールド
positivetrueどのラベル値を陽性とみなすか。refund、1、true など
calibration_bins10キャリブレーション表が使うスコア帯の数
thresholdsなしスイープするカットオフ。それぞれはエビデンスであり、推奨ではありません
averageなし複数クラスにわたる集計のための macro または micro

field、expected_field、positive を自身で指定しない予測系の評価器は、すべてこのブロックからそれらを受け取ります。そのため 1 つのスイートには陽性クラスが 1 つだけです。混同行列の件数、キャリブレーション表、しきい値スイープを生み出すのもこのブロックです。このブロックのないプロジェクトはメトリクスを得ますが、その他は何も得られません。

どのケースのラベルとも一致しない陽性クラスは、何かを実行する前に拒否されます。それに対する再現率は、何もない集合に対する割合になってしまうからです。同じプロジェクトで positive: churned とした場合です。

Configuration error: evaluator 'recall' counts 'churned' as the positive class, and no case's 'label' is 'churned' (labels: False, True); declare `positive:` on the evaluator or in the `predictive:` block

評価器

evaluators:
  - {type: predictive_correct, criterion: accuracy}
  - {type: predictive_recall, criterion: recall}
  - {type: predictive_precision, criterion: precision}
  - {type: predictive_brier, criterion: brier}
  - {type: predictive_log_loss, criterion: log_loss, clip: 0.02}
  - {type: predictive_ranking, criterion: rank}
metrics:
  - {id: roc_auc, type: ranking, criterion: rank, statistic: roc_auc}
  - {id: pr_auc, type: ranking, criterion: rank, statistic: average_precision}
slices: [metadata.plan, "confidence:0.5"]
min_slice_support: 20

predictive_log_loss には clip が必須です。そうしなければ、確信を持った誤りが 1 つあるだけで無限大になるからです。predictive_ranking はランキングメトリクスが行を並べる基準であり、統計量を指定する metrics: のエントリが必要です。ROC-AUC と平均適合率 (average precision) は異なる問いに答えるものであり、エンジンがどちらかを代わりに選ぶことはありません。

oloproof run
│ accuracy  │ 88.5%    │ [83.2%, 92.6%]  │ 177 / 200 observed · 0 missing · 0 excluded                                │
│ recall    │ 81.2%    │ [69.5%, 90.0%]  │ 52 / 64 observed · 0 missing · 136 excluded                                │
│ precision │ 82.5%    │ [70.9%, 91.0%]  │ 52 / 63 observed · 0 missing · 137 excluded                                │
│ brier     │ 0.120    │ [0.094, 0.154]  │ mean of 200 observed · 0 missing · 0 excluded                              │
│ log_loss  │ 0.389    │ [0.323, 0.499]  │ mean of 200 observed · 0 missing · 0 excluded                              │
│ roc_auc   │ 92.3%    │ [69.3%, 100.0%] │ roc_auc over 64 positive · 136 negative · 0 missing · 0 excluded           │
│ pr_auc    │ 86.5%    │                 │ average_precision over 64 positive · 136 negative · 0 missing · 0 excluded │

excluded の列を読んでください。再現率は解約した 64 件のアカウントに対して測定されるため、残りの 136 件はそこから除外されます。適合率はモデルが陽性と判定した 63 件に対して測定されます。これらのアカウントの 32% が解約するので、誰も解約しないと予測するモデルは正解率 68% で、しかも誰も見つけられません。正解率だけに下限を置くとそのモデルは合格してしまいます。この例のポリシーがそれぞれの割合に下限を置いているのはそのためです。

pr_auc には推定値があり、区間がありません。200 行では、その区間は ROC-AUC の区間よりも本質的に弱く、エンジンは裏付けられない境界を表示するよりも、それを出さないことを選びます。これに対するルールは次のようになります。

pr: INSUFFICIENT_EVIDENCE (interval_unavailable)

メトリクス以外の出力

混同行列の件数は件数であり、割合ではありません。

│ actually positive │ 52                 │ 12                 │
│ actually negative │ 11                 │ 125                │

これらの 1 つを指定するリリースルールは設定エラーになります。件数はメトリクスではないからです。

Configuration error: release rule 'fp' refers to unknown metric 'false_positives'

キャリブレーション表は、モデルが主張したことと実際に起きたことを、スコア帯ごとに並べます。

│ 0.2-0.3 │ 26.7%   │ 0.0%     │ 34 rows │
│ 0.5-0.6 │ 53.4%   │ 81.0%    │ 21 rows │

そしてしきい値スイープは、宣言した各カットオフで何が測定されたかを示します。

│ 0.3     │ 57.4%     │ 96.9%  │ 62/108 predicted positive · 62/64 actual positive │
│ 0.5     │ 82.5%     │ 81.2%  │ 52/63 predicted positive · 52/64 actual positive  │
│ 0.7     │ 100.0%    │ 37.5%  │ 24/24 predicted positive · 24/64 actual positive  │

このスイープには Thresholds (exploratory; recommends nothing) という見出しが付いています。どのカットオフが正しいかは、偽陽性のコストと偽陰性のコストの比較で決まり、それはエンジンが知りうることではありません。

回帰

回帰器は絶対誤差でスコア付けされ、そのためには目標値がとる範囲が必要です。

evaluators:
  - type: predictive_absolute_error
    criterion: days_error
    field: days
    expected_field: days
    target_range: [0, 20]
rules:
  - id: error-budget
    metric: days_error
    max: 1.5
│ days_error │ 1.02     │ [0.78, 1.88] │ mean of 120 observed · 0 missing · 0 excluded │
error-budget: INSUFFICIENT_EVIDENCE (interval_overlaps_threshold)

target_range は必須であり、デフォルト値はありません。絶対誤差は有界な平均であり、その区間はすべての値が収まる範囲の中でのみ成り立ちます。範囲が広ければ区間も広くなるので、目標値が実際にとりうる範囲を宣言してください。このルールは判定できません。推定値は予算内にありますが、120 件の注文では、真の平均誤差が予算内であることをまだ示せないからです。

次に読むページ

  • スライス では、confidence: の帯とスライスのサポートを説明しています。
  • 比較ルール では、2 つのモデルバージョンの比較を説明しています。