Featured image of post Conformal Predictionによるしきい値調整

Conformal Predictionによるしきい値調整

目次

背景

  • しきい値は、多くの場合「なんとなく良さそう」という経験的な決め方になりがち
    • 0.9以上ならpositiveと判定する、など
  • Conformal Predictionを使うと、しきい値の決め方に統計的な保証を持たせられる
  • しきい値調整という実務に絞って、Conformal Predictionの考え方を整理する

しきい値をどう決めるか、という問題

経験的なしきい値選定(パーセンタイル法)

  • よくあるやり方は、キャリブレーション用データ(学習には使っていないホールドアウトデータ)に対してモデルのスコアを計算し、その分布から「これくらいなら安全」というパーセンタイル点をしきい値にする方法
  • 例えば、negativeサンプルのスコアを集めて、その99パーセンタイル点をしきい値にする、というやり方
  • 直感的で実装も簡単だが、以下のような弱点がある
    • そのパーセンタイル値が、本番データでも本当に同じ意味を持つのか(同じ誤り率になるのか)の保証がない
    • キャリブレーションデータの件数が少ないと、パーセンタイル自体の推定がぶれる

経験的な方法の弱点

  • 「99パーセンタイル」という言葉は、キャリブレーションデータの中では正確でも、未来の新しいデータに対して「エラー率が1%以下になる」ことを保証しない
  • 特にサンプル数が少ない場合、単純な分位点の推定には誤差が乗る
  • この誤差を統計的に補正し、有限サンプルでも成り立つ保証を与えるのがConformal Prediction

Conformal Predictionとは

  • モデルの中身に依存しない(モデルフリーな)枠組みで、予測に対して統計的に妥当な保証を与える手法
  • 「分布によらない(distribution-free)」という特徴があり、スコアの分布がどんな形であっても、同じ手順で保証が成り立つ
  • 唯一の前提は、キャリブレーションデータと将来のテストデータが交換可能(exchangeable、i.i.d.なデータもこれに含まれる)であること

交換可能性(exchangeability)とは

  • i.i.d.(独立同分布)は、交換可能性の一種
  • i.i.d.なら必ず交換可能だが、逆は成り立たない(交換可能でも、i.i.d.とは限らない)
  • 交換可能性とは、$n$個のデータ$(x_1, \ldots, x_n)$の同時分布が、順番を入れ替えても変わらないという性質のこと

$$ P(x_1, \ldots, x_n) = P(x_{\pi(1)}, \ldots, x_{\pi(n)}) $$

  • $\pi$は、$1, \ldots, n$のどんな並べ替え(順列)でもよい
  • i.i.d.より緩い条件なので、データ同士に依存があっても交換可能性は満たされる場合がある

以下は、独立ではないが交換可能な例である。

  • 非復元抽出(sampling without replacement): 母集団からデータを1件ずつ取り出すとき、取り出したデータを母集団に戻さずに、次の抽出を行う方法
    • 例: トランプ52枚から1枚引いて、それを戻さずに次の1枚を引く
    • 対義語は復元抽出(sampling with replacement)で、こちらは毎回母集団に戻してから次を引く(同じデータが何度でも選ばれうる)
    • 非復元抽出では、各データの抽出結果はお互いに影響し合う(1枚目でハートのAを引いたら、2枚目でハートのAが出る確率は0になる)ため、独立ではない
    • しかし、母集団自体は変わらないので、どの順番で引いても「その$n$枚の組み合わせが出る確率」は同じになる。これが「独立ではないが交換可能」という状態

Conformal Predictionの証明で重要なのは、「キャリブレーションデータ$n$件+テストデータ1件」を合わせた$n+1$件が交換可能でありさえすればよい、という点である。i.i.d.である必要はなく、より緩い条件で足りるというのが、この手法の強みの1つ。

Nonconformity score(非適合度スコア)

  • Conformal Predictionでは、まずモデルの出力を「どれだけ普通と違うか(適合していないか)」を表すスコアに変換する
  • 分類の場合、以下のようなスコアがよく使われる

$$ s(x, y) = 1 - \hat{p}(y \mid x) $$

  • $\hat{p}(y \mid x)$は、モデルが出力する「入力$x$に対してラベル$y$である確率」
  • 正解ラベルの予測確率が低いほど、このスコアは大きくなる(=モデルの予測と実際のラベルが「適合していない」)

Conformal Predictionによるしきい値の求め方

キャリブレーションデータでのスコア計算

  • キャリブレーションデータ$n$件それぞれについて、正解ラベルに対するnonconformity score $s_1, \ldots, s_n$を計算する

有限サンプル補正つき分位点

以下は、目標エラー率$\alpha$(例えば5%)に対応する分位点$\hat{q}$の求め方である。

$$ \hat{q} = \text{Quantile}\left({s_1, \ldots, s_n}; \ \frac{\lceil (n+1)(1-\alpha) \rceil}{n}\right) $$

  • 単純に$(1-\alpha)$分位点を取るのではなく、$\frac{\lceil (n+1)(1-\alpha) \rceil}{n}$という、少しだけ大きい分位点を取っているのがポイント
  • この補正が、サンプル数$n$が有限であっても保証が成り立つようにするための調整になっている
  • $n$が大きくなるほど、この補正値は$(1-\alpha)$に近づいていく
  • 同じことだが、$\hat{q}$は「$s_1, \ldots, s_n$を小さい順に並べたとき、$k = \lceil (n+1)(1-\alpha) \rceil$番目に小さい値」と言い換えられる
  • 次の具体例では、この言い換えの方で計算する
  • 注意点として、この分位点は一般的な補間つきの分位点(線形補間など)とは一致しない。値と値の間を補間せず、$k$番目の値をそのまま使う(段階的な)分位点である点がポイント

しきい値としての解釈

  • 新しい入力$x$に対して、nonconformity scoreが$\hat{q}$以下となるラベルだけを予測集合に含める、というのが本来のConformal Predictionの出力(予測集合)
  • 二値分類でFA(誤検知)を抑えたい、という文脈に絞ると、これは「予測確率が、ある値以上ならpositiveとする」という単一のしきい値の形に単純化できる
  • つまり、経験的なパーセンタイル法とほぼ同じ計算をしているが、分位点の取り方に前述の有限サンプル補正が入っている点が異なる

具体例:二値分類でのしきい値計算

  • 迷惑メール判定(positive = 迷惑メール)を例に、実際に手で計算してみる
  • 目標: 本当は迷惑メールではない(negative)メールを誤って迷惑メール判定してしまう率を、20%以下に抑えたい($\alpha = 0.2$)
  • キャリブレーションデータとして、本当はnegativeだと分かっている9件のメールを用意し、それぞれモデルが出す「迷惑メールである確率」を集める

以下は、9件のキャリブレーションデータのスコア(迷惑メール確率)を小さい順に並べたものである。

$$ 0.02,\ 0.05,\ 0.05,\ 0.08,\ 0.10,\ 0.12,\ 0.15,\ 0.22,\ 0.31 $$

  • $n = 9$、$\alpha = 0.2$なので、$k = \lceil (n+1)(1-\alpha) \rceil = \lceil 10 \times 0.8 \rceil = \lceil 8 \rceil = 8$
  • つまり、9件のスコアのうち小さい方から8番目の値を$\hat{q}$として使う
  • 8番目の値は$0.22$なので、$\hat{q} = 0.22$

これで、しきい値が$0.22$と決まった。新しく届いた3通のメールに対して、モデルが出す迷惑メール確率がそれぞれ$0.10$・$0.25$・$0.40$だったとすると、以下のように判定する。

  • $0.10 \leq 0.22$ → negativeと判定(受信)
  • $0.25 > 0.22$ → positiveと判定(迷惑メール扱い)
  • $0.40 > 0.22$ → positiveと判定(迷惑メール扱い)

補正の効果を確認するために、同じ9件のスコアに対して、補正なしの単純な80パーセンタイル(線形補間)を計算すると、以下のようになる。

$$ \text{Quantile}_{0.8}^{\text{naive}} = 0.178 $$

  • 補正なしだと$0.178$、Conformal Predictionの補正ありだと$0.22$と、後者の方が少し大きい(=positive判定に慎重になる)しきい値になる
  • サンプル数$n=9$が少ないため、この差が目立って出ている。$n$が大きくなるほど、この2つの値は近づいていく
  • この差こそが、有限サンプルでも「$\alpha=0.2$以下」という保証を成り立たせるための補正分

保証されること・されないこと

marginal coverageの保証

以下は、Conformal Predictionが与える保証である。

$$ P\left(y_{\text{test}} \in C(x_{\text{test}})\right) \geq 1 - \alpha $$

  • $C(x_{\text{test}})$は、テスト入力に対する予測集合(しきい値の文脈では「positiveと判定される領域」)
  • キャリブレーションデータとテストデータが交換可能であれば、サンプル数に関わらずこの不等式が成り立つ
  • 「marginal」は、「キャリブレーションデータの取り方(乱数)ごと平均すると」という意味
    • 1回のキャリブレーションで固定された$\hat{q}$に対して、個々の入力$x$ごとに条件づけて成り立つ保証(conditional coverage)ではない
    • キャリブレーションをやり直すたびに変わる$\hat{q}$も含めて、全体として平均するとこの不等式が成り立つ、という意味

なぜ成り立つのか(交換可能性と順位の対称性)

  • この保証は近似ではなく、交換可能性(exchangeability)だけから導ける、組み合わせ論的な事実
  • キャリブレーションの$n$個のスコア$s_1, \ldots, s_n$と、テストデータのスコア$s_{n+1}$を合わせた$n+1$個が交換可能(どの並び順も同じ確率で起こる)だとする
  • このとき、$s_{n+1}$が全体の中で何番目に大きいかは、対称性からどの順位も等確率になる
  • したがって、$s_{n+1}$が上位$k$番目以内に入る確率は、ちょうど$\frac{k}{n+1}$になる

以下のように$k$を選んでおくと、この確率が目標の$1-\alpha$以上になることが保証される。

$$ k = \lceil (n+1)(1-\alpha) \rceil \implies \frac{k}{n+1} \geq 1 - \alpha $$

  • この議論は、モデルの中身にも、スコアの分布の形にも一切依存していない
  • モデルの性能が悪くても、この保証自体は定理として成り立つ(ただし、モデルが悪いとしきい値が緩くなりすぎて、実用上は使い物にならなくなる、という形で影響が出る)
  • つまり、保証の強さは丸ごと「交換可能性」という前提に懸かっている。分布シフトなどでこの前提が崩れると、証明も成り立たなくなる

条件付きカバレッジは保証されない

  • marginal coverageは、データ全体で平均した保証であって、クラスやサブグループ単位では保証されない
  • 例えば、あるサブクラスだけエラー率が目標を大きく超えていても、別のサブクラスでエラー率が低ければ、全体の平均としては目標を満たしてしまうことがある
  • 対策として、クラスごとに別々にキャリブレーションを行うclass-conditional conformal predictionという拡張がある
    • クラスごとにキャリブレーションデータを分けて、それぞれ別の$\hat{q}$を求める

分布シフトで保証が崩れる

  • 交換可能性の前提が崩れると(キャリブレーション時と本番運用時でデータの分布が変わると)、保証は成り立たなくなる
  • これは、以前書いた分布シフトの問題そのもの
  • 運用中にデータの性質が変わっていないか、定期的に確認する必要がある

実装イメージ

以下は、二値分類でのしきい値調整をConformal Predictionで行う場合の実装イメージである。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import numpy as np

# calib_scores: キャリブレーションデータに対する、モデルのpositive確率
# calib_labels: キャリブレーションデータの正解ラベル(0 or 1)
# negativeサンプルだけを使って、FA率を抑えるしきい値を求める
negative_scores = calib_scores[calib_labels == 0]

n = len(negative_scores)
alpha = 0.01  # 目標エラー率(この場合はFA率)1%

q_level = np.ceil((n + 1) * (1 - alpha)) / n
threshold = np.quantile(negative_scores, min(q_level, 1.0), method="inverted_cdf")

# 本番では、モデルのpositive確率がこのthresholdを超えたらpositiveと判定する
  • q_levelが1を超える場合(サンプル数が少なすぎる場合)は、保証を与えられないケースなので、サンプル数を増やす必要がある
  • method="inverted_cdf"を指定しているのは、これが前述の「小さい方から$k$番目の値」という定義と厳密に一致する分位点の取り方だから
    • method="higher"など、他の補間方法を指定すると、$k$番目の値より大きい値になり、具体例で計算した$\hat{q}$とは異なる結果になってしまう

運用での使い方

  • キャリブレーションデータは、本番データの分布とずれないよう、定期的に更新して再計算する
  • 目標エラー率$\alpha$を明示的なパラメータとして持てるため、「FA/hourをこの値以下に抑えたい」といった運用要件に、しきい値選定の手順を直接結びつけやすい
  • ただし、marginal coverageの保証はクラス・サブクラス単位では成り立たないため、サブクラスごとに運用上重要な誤り率がある場合は、class-conditionalな較正も検討する

まとめ

  • しきい値の経験的な決め方(パーセンタイル法)は、直感的だが将来のデータに対する統計的な保証がない
  • Conformal Predictionは、nonconformity scoreの分位点を有限サンプル補正つきで求めることで、分布によらない統計的保証(marginal coverage)を与える
  • 保証されるのはデータ全体で平均したエラー率であり、クラス・サブグループ単位の保証や、分布シフトへの耐性は別途考える必要がある
  • 経験的なパーセンタイル法とほぼ同じ手順で計算できるため、既存のしきい値調整の運用に組み込みやすい

参考文献

Built with Hugo
テーマ StackJimmy によって設計されています。