予測の不確実性を定量化できるConformal Predictionをサクッと解説する - Timee Product Team Blog

Timee Product Team Blog

タイミー開発者ブログ

予測の不確実性を定量化できるConformal Predictionをサクッと解説する

こんにちは、タイミーでデータサイエンティストとして働いている小栗です。

今回は、機械学習モデルの予測の不確実性を定量化する手法であるConformal Predictionについてご紹介します。

Conformal Predictionとは

機械学習モデルの予測値がどの程度信頼できるか知りたい場面は多いと思います。

医療診断のように誤った予測が重大な問題につながる状況でモデルを使用する場合、予測の不確実性を定量化してそれを元に判断できると嬉しいです。

Conformal Prediction(以下CP)はUncertainty Quantification(不確実性の定量化。以下UQ)のパラダイムの1つであり、モデルの予測値の集合/区間を統計的に厳密に作成します。

Conformal Predictionで生成される予測集合の例。出典: Angelopoulos, Bates (2022)

CPの利点

UQ手法には、分類モデルが出力する確信度を用いる方法、複数のモデルから算出した予測値の分散を用いる方法、学習サンプルと予測サンプル間の距離を用いる手法など、さまざまなものがあります。

これらのUQ手法に対するCPの優位性として、以下の点があります。

  1. 予測集合の中に真の結果を含むことをユーザーが指定したエラー率で保証できる
  2. モデルに依存しない手法であり、かつ計算コストが比較的低い
  3. 予測誤差の分布に関する仮定は要求されず、入力Xと出力Yのペアが独立同一分布(i.i.d.)であることのみを仮定する

他のUQ手法で算出した不確実性は1について保証できない場合があるため、1がCPの最も優れた特徴かと思います。

2に関しても、事前学習モデルの有効性が明らかになってきた昨今の状況を考慮に入れると大変ありがたい性質です。

また3についても、現実世界では予測誤差が正規分布でないケースがありますし、i.i.d.は依然として強い仮定ではあるものの機械学習では標準的な仮定であるため、CPの実用性につながっていると感じます。

予測の不確実性を算出する手順

CPにて予測の不確実性を算出するワークフローを簡単にご紹介します。

Conformal Predictionの手順(分類での例)。出典: Angelopoulos, Bates (2022)

  1. 以下の手順でキャリブレーションデータのConformal scoreを計算する
    1. データセットを学習データ、キャリブレーションデータ、テストデータに分ける
    2. 学習データを使ってモデルを訓練する
    3. ユーザーが許容できるエラー率αを設定する(例えば5%)
    4. キャリブレーションデータの各サンプルに対してConformal scoreを計算する。Conformal scoreは値が大きいほど予測が外れていることを表現できるものにする。scoreはユーザーがカスタマイズ可能。上図の例ではモデルの予測値であるsoftmax出力値を1から引いた値が利用されている
  2. キャリブレーションデータのscoreが全体の1-αとなる分位点を求める
  3. テストデータの各サンプルに対し、分位点より大きい予測値を持つクラスをピックアップし、予測集合とする

Conformal score自体も不確実性を表現したスコアですが、その尺度をさらに厳密に較正するためにキャリブレーションデータを用いる、というのがざっくりとしたイメージです。

結果として、ユーザーが定めたエラー率が厳密に保証された予測集合が得られます。

CPの利用方法とコツ

CPを利用したい場合、scikit-learn-contribプロジェクトとして開発されているPythonライブラリ”mapie”を使えば、scikit-learn likeにサクッと実装できます。

回帰の場合

from mapie.regression import MapieRegressor

mapie_regressor = MapieRegressor(regressor)
mapie_regressor.fit(X_train, y_train)

# エラー率αを設定(複数設定することもできる)
alpha = [0.05, 0.32] 

# 予測値と予測区間の上限/下限値を計算
y_pred, y_pis = mapie_regressor.predict(X_test, alpha=alpha)

# 可視化に関するコードは省略
# ↓α=0.05の予測区間は点線、α=0.32の予測区間は色付きの帯で示されている

出典: https://mapie.readthedocs.io/en/latest/quick_start.html

分類の場合

from mapie.classification import MapieClassifier

mapie_classifier = MapieClassifier(estimator=classifier, method='score', cv=5)
mapie_classifier = mapie_classifier.fit(X_train, y_train)

# 予測値と予測集合を計算
y_pred, y_pis = mapie_classifier.predict(X_test, alpha=0.05)

# 可視化に関するコードは省略
# ↓α=0.05での各クラスの領域が示されている

出典: https://mapie.readthedocs.io/en/latest/quick_start.html

CPを行う際に意識したいこととして、Conformal scoreとアルゴリズムの選択があります。

CPではエラー率の保証は常に成り立ちますが、得られた予測集合が有益かどうかは主にConformal scoreによって決まります。

scoreによって予測誤差の大きさに応じて入力Xを正しくランクづけできる場合、予測が簡単な入力には小さな予測集合を、難しい入力には大きな予測集合が得られます。

逆に、ランクづけを正確に反映できないscoreを選択した場合、すべてのクラスが予測集合に含まれるなど、意味のない予測集合が得られてしまうことに注意が必要です。

アルゴリズムについては、データを学習データとキャリブレーションデータに分割するSplit conformal predictionをはじめとし、すべてのデータをモデルの訓練とキャリブレーションの両方に使用するCV+やJackknife+といったものがあります。

基本的なConformal scoreやアルゴリズムはmapieで実装されているため、気になる方は公式ドキュメントをご参照ください。

CPは有用な手法である反面、前述のとおりi.i.d.の仮定が満たされない状況で出力された結果は信頼できないことに注意が必要です。

学習・評価時のデータと推論時のデータの分布が異なる状況は現実世界でしばしば存在するため、そのようなケースで得た予測結果を過信しないよう気をつける必要があります。

おわりに

本記事ではConformal Predictionの概要と利用方法についてご紹介しました。

CPのアイデアは1990年代にすでに提唱されていましたが、特にここ数年で機械学習コミュニティで人気が出てきたようです。

必要な仮定が少ない手法であり、mapieなどのライブラリも充実してきたことから、非常に実用的なUQ手法だと感じています。

すでに英語・日本語でいくつか有益な文献・記事が存在していますので、気になる方はそちらもご参照ください*1*2*3*4

We’re Hiring!

タイミーのデータエンジニアリング部・データアナリティクス部では、ともに働くメンバーを募集しています!!

現在募集中のポジションはこちらです!

「話を聞きたい」と思われた方は、是非一度カジュアル面談でお話ししましょう!