自動ブートストラップ法を使用して機械学習のパフォーマンスメトリクスの信頼区間を計算する方法

ソースノード: 1178501

自動ブートストラップ法を使用して機械学習のパフォーマンスメトリクスの信頼区間を計算する方法

モデルのパフォーマンス測定値は、「大規模な」テスト セットのために非常に正確ですか、それとも「小規模」または不均衡なテスト セットのために非常に不確実ですか?


By デビッドBローゼン(PhD)、IBM GlobalFinancingの自動クレジット承認のリードデータサイエンティスト



オレンジ色の線は、Balanced Accuracy 信頼区間の下限として 89.7% を示し、緑は元の観測された Balanced Accuracy=92.4% (点推定)、赤は 94.7% の上限を示しています。 (特に断りのない限り、この画像とすべての画像は著者によるものです。)

概要

 
 
分類子のパフォーマンスがテスト セットで Accuracy=94.8% および F1=92.3% であると報告したとしても、テスト セットのサイズと構成について何らかの知識がなければ、これはあまり意味がありません。 これらのパフォーマンス測定値の誤差範囲は、テスト セットのサイズによって大きく異なります。または、不均衡なデータセットの場合は、主にテスト セットの独立したインスタンスの数によって異なります。 少数 クラスに含まれています (オーバーサンプリングによる同じインスタンスのコピーの増加は、この目的には役立ちません)。

同様の起源を持つ別の独立したテスト セットを収集できた場合、このデータセットでのモデルの精度と F1 は同じになる可能性は低いですが、どの程度異なる可能性がありますか? これと同様の質問は、統計で次のように回答されています。 信頼区間 測定の。

基になる母集団から多くの独立したサンプル データセットを抽出する場合、それらのデータセットの 95% について、メトリクスの真の基になる母集団の値は、その特定のサンプル データセットに対して計算する 95% 信頼区間内になります。

この記事では、ブートストラップ法を使用して、任意の数の機械学習パフォーマンス メトリックの信頼区間を一度に計算する方法を紹介します。 自動的に デフォルトで生成するブート サンプル データセットの数を決定します。

このコードを呼び出して信頼区間を計算する方法だけを知りたい場合は、セクション「結果を計算してください!" 下方に。

ブートストラップ方法論

 
 
データの基礎となる真の分布から追加のテスト データセットを引き出すことができれば、それらのデータセット全体で関心のあるパフォーマンス メトリックの分布を確認できます。 (これらのデータセットを描画するとき、同一または類似のインスタンスを複数回描画することを防ぐために何もしませんが、これはまれにしか発生しない可能性があります。)

それができないので、次善の策は、 経験的分布 これは、新しいブートストラップ サンプル データセットを生成するために、そのインスタンスから置換を伴うサンプリングを行うことを意味します。 置換によるサンプリングとは、特定のインスタンスを描画したら、同じサンプル データセットに対して再度描画できるように元に戻すことを意味します。 したがって、このような各データセットには通常、一部のインスタンスの複数のコピーがあり、基本テスト セットにあるすべてのインスタンスが含まれているわけではありません。

サンプリングしたら 無し 交換すると、元のデータセットの同一のコピーが毎回取得され、異なるランダムな順序でシャッフルされ、何の役にも立たなくなります。

  百分位数 信頼区間を推定するためのブートストラップ方法論は次のとおりです。

  1. 生成する nboots それぞれ元のテスト セットと同じサイズの「ブートストラップ サンプル」データセット。 各サンプル データセットは、置換されたテスト セットからランダムにインスタンスを抽出することによって取得されます。
  2. 各サンプル データセットで、メトリックを計算して保存します。
  3. 95% 信頼区間は 2.5 で与えられます。th 97.5にth パーセンタイル nboots メトリックの計算値。 もしも nboots=1001 で、シリーズ/配列/リストの値を並べ替えました X 長さ 1001、0th パーセンタイルは X[0] と 100th パーセンタイルは X[1000] であるため、信頼区間は次のように与えられます。 X[25]から X[975]。

もちろん、ステップ 2 でサンプル データセットごとに好きなだけメトリックを計算できますが、ステップ 3 では、各メトリックのパーセンタイルを個別に見つけることになります。

データセットと信頼区間の結果の例

 
 
この以前の記事の結果を例として使用します。 データのバランスを取り直さずに、不均衡な分類に対処する方法歪んだデータのオーバーサンプリングを検討する前に、分類決定のしきい値を調整してみてください.

その記事では、 非常に-不均衡なXNUMXクラスのKaggle クレジットカード詐欺識別データセット. predict() メソッドを使用する際に暗黙的に指定されているデフォルトの 0.5 しきい値とはまったく異なる分類しきい値を使用することを選択したため、データのバランスをとる必要がなくなりました。 このアプローチは時々呼ばれます しきい値の移動、ここで、分類子は、選択したしきい値を予測によって提供される予測クラス確率に適用することにより、クラスを割り当てます_プロバ() 方法。

この記事 (およびコード) の範囲を二項分類に限定します: クラス 0 とクラス 1、慣例によりクラス 1 は「陽性」クラス、具体的には不均衡なデータの少数派クラスですが、コードは回帰 (単一連続ターゲット)も同様です。

XNUMX つのブート サンプル データセットの生成

 
 
信頼区間コードはメトリック関数に渡されるさまざまな数のデータ引数を処理できますが、y_true と y_pred の 0 つのデータ引数を常に受け​​入れる sklearn スタイルのメトリックに焦点を当てます。ここで、y_pred はバイナリ クラス予測 (1または XNUMX)、または連続クラス確率予測または決定関数予測、または y_true も連続の場合は連続回帰予測です。 次の関数は、単一のブート サンプル データセットを生成します。 任意の data_args を受け入れますが、この場合、これらの引数は ytest(実際の/真のテスト セットの目標値は、 前の記事)と hardpredtst_tuned_thresh (予測されたクラス)。 どちらにも、各インスタンスの真のクラスまたは予測クラスを示すゼロと XNUMX が含まれています。

カスタム メトリクス specificity_score() とユーティリティ関数

 
 
特異性のカスタム メトリック関数を定義します。これは、Recall の別の名前です。  クラス (クラス 0)。 また、関心のある一連のメトリックをデータに適用する calc_metrics 関数と、そのためのいくつかのユーティリティ関数:

ここで、メトリックのリストを作成し、それらをデータに適用します。 偽陰性 (真の詐欺を正当なものとして誤分類する) は、偽陽性 (真の正当なものを詐欺として誤分類する) よりもビジネスにとってはるかにコストがかかるため、精度は関連するメトリックであるとは見なしませんでしたが、精度は両方のタイプの誤分類を扱います。これらはより頻繁に発生し、全体的な精度に大きく貢献するため、真のクラスが多数派クラスであるクラスを正しく分類することを好みます。

met=[ metrics.recall_score, specificity_score, metrics.balanced_accuracy_score ]
calc_metrics(met, ytest, hardpredtst_tuned_thresh)



各ブート サンプル データセットを作成し、そのメトリクスを計算する

 
 
raw_metric_samples() では、実際に複数のサンプル データセットを XNUMX つずつ生成し、それぞれのメトリックを保存します。

raw_metric_samples() に、対象のメトリック (または XNUMX つのメトリックのみ) のリストと、真の予測クラス データを指定すると、nboots サンプル データセットが取得され、各データセットから計算されたメトリックの値のみを含むデータフレームが返されます。 _boot_generator() を介して、一度にすべてのデータセットを潜在的に格納するのではなく、ジェネレーター式で one_boot() を一度に XNUMX つずつ呼び出します。巨大な リスト。

7 つのブート サンプル データセットのメトリックを確認する

 
 
メトリック関数のリストを作成し、raw_metric_samples() を呼び出して、7 つのサンプル データセットの結果を取得します。 ここでは、理解のために raw_metric_samples() を呼び出しています。以下の ci_auto() を使用して信頼区間を取得するためには必要ありませんが、ci_auto() にはメトリックのリスト (または XNUMX つのメトリックのみ) を指定します。 is 必要。

np.random.seed(13)
raw_metric_samples(met, ytest, hardpredtst_tuned_thresh, nboots=7).style.format('{:.2%}') #optional #style



上記の各列には、0 つのブート サンプル データセット (6 から XNUMX までの番号) から計算されたメトリックが含まれているため、計算されたメトリック値はランダム サンプリングによって異なります。

計算されたデフォルトのブート データセットの数

 
 
私たちの実装では、デフォルトでブート データセットの数 nboots による推奨を満たすように、目的の信頼水準 (95% など) から自動的に計算されます。 ノース、カーティス、シャム ディストリビューションの各末尾に最小数のブート結果が含まれるようにします。 (実際、この推奨事項は次の場合に適用されます。 p-値、したがって仮説検定 受け入れ地域、 だけど 信頼区間 経験則としてこれを使用するのに十分に類似しています。) それらの著者はテールで最低 10 のブート結果を推奨していますが、 デビッドソン&マッキノン 399% の信頼度を得るには、少なくとも 95 のブーツを推奨します。これには、テールに 11 のブーツが必要です。したがって、このより保守的な推奨事項を使用します。

1 – 信頼レベルであるアルファを指定します。 たとえば、95% の信頼度は 0.95 になり、alpha=0.05 になります。 ブートの明示的な数を指定した場合 (おそらく、より少ない nboots より速い結果が必要なため) しかし、要求されたアルファに対して十分でない場合は、そのブート数の正確な信頼区間を取得するために、より高いアルファが自動的に選択されます。 最低でも 51 のブーツが使用されます。th パーセンタイルを 70 にth パーセンタイル (間隔の内側に 40%、外側に 60% を持つ) であり、最小ブーツの推奨がそのようなケースを想定していたかどうかは明らかではありません。

関数 get_alpha_nboots() は、デフォルトの nboots を設定するか、上記のように要求されたアルファと nboots を変更します。

alpha のさまざまな値のデフォルトの nboots を示しましょう。

g = get_alpha_nboots pd.DataFrame( [ g(0.40), g(0.20, None), g(0.10), g(), g(alpha=0.02), g(alpha=0.01, nboots=None), g(0.005, nboots=None) ], columns=['alpha', 'default nboots'] ).set_index('alpha')



明示的な nboots をリクエストすると、次のようになります。

req=[(0.01,3000), (0.01,401), (0.01,2)]
out=[get_alpha_nboots(*args) for args in req]
mydf = lambda x: pd.DataFrame(x, columns=['alpha', 'nboots'])
pd.concat([mydf(req),mydf(out)],axis=1, keys=('Requested','Using'))



小さな nboots 値はアルファを 0.05 と 0.40 に増やし、nboots=2 は最小の 51 に変更されました。

バランス精度のみの信頼区間を示すブートストラップ サンプル データセットのヒストグラム

 
 
ここでも、ci_auto() を呼び出して以下の信頼区間を取得するためにこれを行う必要はありません。

np.random.seed(13)
metric_boot_histogram (metrics.balanced_accuracy_score, ytest, hardpredtst_tuned_thresh)



オレンジ色の線は、Balanced Accuracy 信頼区間の下限として 89.7% を示し、緑は元の観測された Balanced Accuracy=92.4% (点推定)、赤は 94.7% の上限を示しています。 (この記事のトップに同じ画像が表示されます。)

メトリクスのリストのすべての信頼区間を計算する方法

 
 
上記を呼び出し、メトリクス結果のパーセンタイルから信頼区間を計算し、結果の出力データフレームの最初の列としてポイント推定値を挿入するメイン関数を次に示します。

結果を計算してください!

 
 
本当に必要なのはこれだけです: ci_auto() を以下のようにメトリクスのリスト (met 上記で割り当てられた) を使用して、信頼区間を取得します。 パーセンテージの書式設定はオプションです。

np.random.seed(13)
ci_auto( met, ytest, hardpredtst_tuned_thresh ).style.format('{:.2%}')



得られた信頼区間の考察

 
 
からの混同行列は次のとおりです 原著. クラス 0 はネガティブ (多数クラス) で、クラス 1 はポジティブ (非常にまれなクラス) です。



再現率 (真陽性率) の 134/(134+14) は、カウント数が少ない二項比率であるため、信頼区間が最も広くなります。

特異度 (真陰性率) は 80,388/(80,388+4,907) です。 ずっと カウントが大きいため、信頼区間は [94.11% ~ 94.40%] と非常に狭くなります。

Balanced Accuracy は Recall と Specificity の単純な平均として計算されるため、信頼区間の幅は両者の中間です。

テスト データの変動とトレーニング データの変動によるメトリック測定の不正確さ

 
 
ここでは、   私たちのランダム性に基づいて トレーニング データ (ただし、再トレーニングの繰り返しを自動化し、将来のモデルのパフォーマンスがどの程度変化するかを知りたい場合など、いくつかの目的でも興味深い場合があります) ではなく、このパフォーマンスの測定における変動性のみ 特定の モデル (特定のトレーニング データから作成されたもの) のランダム性による test データ。

十分な数の独立したテスト データがあれば、基礎となる母集団に対するこの特定のモデルのパフォーマンスを非常に正確に測定でき、モデルをどのように構築したか、またどのようにモデルを構築するかどうかに関係なく、このモデルが展開された場合にどのように機能するかを知ることができます。異なるトレーニング サンプル データセットを使用して、より良いモデルまたはより悪いモデルを取得します。

個々のインスタンスの独立性

 
 
ブートストラップ法では、各インスタンス (ケース、観察) が基礎となる母集団から独立して引き出されることを前提としています。 テスト セットに、互いに独立していない行のグループがある場合。たとえば、相互に相関する可能性が高い同じエンティティの繰り返し観測、またはテスト内の他のインスタンスからオーバーサンプリング/複製/生成されたインスタンスなどです。設定すると、結果が有効でない可能性があります。 使用する必要があるかもしれません グループ化された サンプリング。個々の行ではなく、グループ全体をランダムにまとめて描画しますが、グループを分割したり、その一部だけを使用したりすることは避けます。

また、トレーニング セットとテスト セットにまたがって分割されたグループがないことを確認する必要があります。これは、テスト セットが必ずしも独立しているとは限らず、過剰適合が検出されない可能性があるためです。 たとえば、オーバーサンプリングを使用する場合、通常は次のことのみを行う必要があります After 以前ではなく、テスト セットから分割されました。 また、通常はトレーニング セットをオーバーサンプリングしますが、テスト セットはオーバーサンプリングしません。これは、テスト セットが将来の展開時にモデルが参照するインスタンスを代表し続ける必要があるためです。 相互検証には、scikit-learn の model_selection.GroupKFold().

まとめ

 
 
評価メトリクスの信頼区間をいつでも計算して、モデルのパフォーマンスをテスト データでどの程度正確に測定できるかを確認できます。 確率予測 (または信頼スコア — 統計的信頼度とは関係ありません) を評価するメトリクスの信頼区間を示す別の記事を計画しています。つまり、ログ ロスや ROC AUC などのソフト分類です。モデルによるクラスの個別の選択 (ハード分類)。 同じコードが、回帰 (連続ターゲット変数の予測) と同様に両方で機能します。別の種類の予測 (および回帰の場合は別の種類の真のターゲット) を渡すだけで済みます。

この jupyter ノートブックは github で入手できます。 bootConfIntAutoV1o_standalone.ipynb

この記事は参考になりましたか、または役に立ちましたか? この記事について、または信頼区間、ブートストラップ、ブート回数、この実装、データセット、モデル、しきい値の移動、または結果についてコメントや質問がある場合は、以下にコメントを投稿してください。

前述したものに加えて、 前の記事、あなたも私のことに興味があるかもしれません パンダでCSVファイルを読み取るときに日付/日時列を自動検出してデータ型を設定する方法とはいえ、今回の記事とは直接関係ありません。

一部の権利は留保されています

 
バイオ: デビッドBローゼン(PhD) IBM GlobalFinancingの自動クレジット承認のリードデータサイエンティストです。 デビッドの著作の詳細については、 dabruro.medium.com.

元の。 許可を得て転載。

関連する

ソース: https://www.kdnuggets.com/2021/10/calculate-confidence-intervals-performance-metrics-machine-learning.html

タイムスタンプ:

より多くの KDナゲット