SHAPリファレンス¶
SHAP(SHapley Additive exPlanations)は、精度と説明可能性のジレンマに対処するために使用されるオープンソースのアルゴリズムです。 SHAPは、ノーベル賞を受賞した経済学者Lloyd Shapleyによる協力ゲーム理論のフレームワークであるShapley値に基づきます。 これらの値は特徴量の有用性を表す統一指標であり、機械学習モデルからの予測を解釈するために使用されます。 SHAP値は、特徴量の有用性だけでなく、関係性の方向(正または負)も示します。
1つの特徴量のSHAP値の合計は、インスタンスの予測値と予想される予測値(データセット全体の平均)の差になります。 複数の入力特徴量に基づいて予測を行うモデルを考えた場合、各特徴量のSHAP値は、考えられるすべての特徴量の組み合わせにおけるその特徴量の平均限界寄与を表します。
プロジェクトの発端を理解するには:
Lloyd Shapleyはこう尋ねました。各メンバーがさまざまな貢献をした協力チーム間で支払いをどのように分割すべきでしょうか。
Shapley値は次のような答えを提供します。
- メンバーXのShapley値はメンバーが取得するクレジットの量です。
- 各サブチームにおいて、メンバーXがサブチームに参加すると、どれだけの限界価値が追加されるでしょうか。Shapley値は、この限界価値の加重平均です。
- 支払い総額は、メンバーのShapley値の合計です。
Scott Lundbergは、SHAP Pythonパッケージの主な作者であり、予測を説明するプログラミング手法を提供しています。
モデル予測のクレジットを特徴量で分割することが可能です!
特徴量の各値がゲームの「プレーヤー」であると想定すると、予測は支払いになります。 SHAPは、「支払い」を特徴量間で公平に配分する方法を説明します。
SHAPは、以下を開発したSHAPオープンソースパッケージのおかげで人気が高まっています。
- フリーアンサンブル法のための高速正確アルゴリズム「TreeExplainer」。
- ディープラーニングモデル用の高速近似アルゴリズム「DeepExplainer」。
- 任意のモデルでShapley値を推定する、モデルに依存しない複数のアルゴリズム("KernelExplainer"と"PermutationExplainer∕を含む)。
SHAPの以下の主要なプロパティは、DataRobot機械学習に特に適しています。
- ローカル精度:特徴量の属性の合計は、DataRobotが「説明」するモデルの出力に等しくなります。
- 欠損:すでに欠損している特徴量のインパクトはありません。
- 一貫性:特徴量のモデルへの有用性が大きくなるようにモデルを変更しても、その特徴量に割り当てられているSHAP属性が減少することはありません。 (たとえば、モデルAは特徴量Xを使用します。 次に、特徴量Xをより多く使用する新しいモデルBを作成します(おそらく、その特徴量の係数を2倍にし、他はすべては同じに保持して)。 SHAPの品質の一貫性により、モデルBの特徴量XのSHAP有用性は、少なくともモデルAの特徴量Xの場合と同じくらい高くなります。)
追加の資料を以下に示します。
SHAPは、モデルの説明可能性に次のように貢献します。
-
特徴量のインパクト:SHAPは、モデルの決定を推進している特徴量を概要レベルで示します。 SHAPがない場合、結果はサンプルサイズの影響を受けやすく、サンプルが非常に大きい場合を除き、再計算すると変化する可能性があります。 ディープダイブを参照してください。
-
予測の説明:すべての列の結果を生成するのに適さない特定のタイプのデータがあります。 これは、銀行や保険など規制の厳しい業界では特に問題になります。 SHAPは、特定の予測が平均と異なる予測において各特徴量の責任の割合を説明します。 たとえば、Xドルで販売されると予測された不動産レコードがある場合、SHAP予測の説明は、各特徴量がその価格にどれだけ貢献しているかを示します。
-
特徴量ごとの作用:
- ワークベンチでは、特徴量ごとの作用は常にPermutationベースの特徴量のインパクトを使用します。
- DataRobot Classicでは、SHAPは特徴量ごとの作用の結果を変更しません。 予測、実測値、および部分依存プロットは、SHAPをまったく使用しません。 ただし、左側の棒グラフは、通常のPermutationベースの特徴量のインパクトではなく、SHAPベースの特徴量のインパクトの順に並べられています。
特徴量のインパクト¶
特徴量のインパクトは、モデルによって使用される各特徴量(j)に有用性を割り当てます。
SHAPベース¶
モデルといくつかの観測値(トレーニングデータで最大5000行)が提供された場合、各特徴量jに対する特徴量のインパクトは次のように計算されます。
abs(shap_values for feature j)のサンプル平均
上位の特徴量のインパクトが100%になるように値を正規化します。
Permutationベース¶
モデルといくつかの観測値(既定では2500、最大100,000)が提供された場合、実際のデータに基づいてモデルの指標を計算します。 各列jに対して以下の処理を行います。
- 列
jの値にPermutationを実行します。 - Permutationが行われたデータで指標を計算します。
- 有用性 =
metric_actual - metric_perm
(オプション)最大の結果値で正規化します。
予測の説明¶
SHAP予測の説明は加法性です。 SHAP値の合計は、次の値と完全に等しくなります。
[prediction - average(training_predictions)]
_DataRobot Classicのみ(WorkbenchはSHAPのみ)_XEMPとSHAPのどちらかを選択する場合は、精度と解釈可能性、パフォーマンスの必要性を考慮してください。 XEMPでは、すべてのブループリントがオートパイロットに含まれているので、結果の精度はわずかに高くなる可能性があります。 しかし、SHAPはすべての主要なブループリントをサポートするので、これはすべてのケースに当てはまるわけではなく、精度が同じであることがあります。 SHAPは、より高い解釈性とパフォーマンスを提供します。
- 結果は直感的です。
- SHAPはすべての機能に対して計算されます
- 多くの場合、結果は5〜20倍速く返されます。
- SHAPは加法性。
- オープンソースの特性は透明性を提供します
どのモデルにどの説明子が使用されますか?¶
ブループリント内では、各モデリングステップは、モデルタイプに最も最適化されたSHAP Explainerを使用します。
- ツリーベースのモデル(XGBoost、LightGBM、Random Forest、決定木):
TreeExplainer - Kerasディープラーニングモデル:
DeepExplainer - 線形モデル:
LinearExplainer
1つのブループリントに複数のモデリングタスクが含まれている場合、SHAP値は加算的に結合され、そのブループリント全体でのSHAP値が生成されます。
モデリングタスクの中には、タイプ固有の説明者がサポートしていないものもあります。 ブループリントにそのようなタスクが含まれている場合、モデルに依存しないPermutationExplainerによって、そのブループリント全体が一つのユニットとして説明されます。
予測の説明における加法性¶
場合によっては、SHAP値が予測に加算されないことがあります。 理由は、次のような状態の一部または全部である可能性があります。
-
一部のモデルでは、リンク関数を使用して、モデリングタスクの直接出力を別のスケールに変換します。 これは、
logitリンク関数を使用することが多い二値分類モデルで非常によく見られる現象であり、logリンク関数を使用する歪んだターゲットを持つ連続値モデルでも発生します。 SHAPPermutationExplainerが使用されている場合、SHAP値は、すでにを考慮されているリンク変換を備えた予測と同じ単位になります。基本値と合計すると、予測が再現されます。 ただし、TreeExplainerやDeepExplainerのようなタスク固有のexplainerが使用されている場合、SHAP値はリンク変換前のマージン単位になります。 予測を再現するには、SHAP値を基本値と合計してから、以下のように逆リンク変換を適用する必要があります。-
ほとんどの二値分類問題では、SHAP値は確率空間とは異なるスケール[0,1]に対応します。 これは、これらのアルゴリズムが(最も一般的にはロジスティック関数
prob = logistic(y)のような非線形関数を使用して)直接出力yを常に0と1の間の値にマッピングすることに起因します。 (専門用語では、モデルの「リンク関数」はlogit(p)で、logistic(y)の逆です。 モデルの直接出力(y)は「log-odds」単位で表され、最終予測probは確率単位で表されます。この一般的な状況では、SHAP値はリンク前の「マージンスペース」で加法的に機能し、最終的な確率空間では機能しません。 これはsum(shap_values) = logit(prob) - logit(prob_0)を意味します。ここでprob_0はモデルの予測のトレーニング平均です。 -
歪んだターゲットを含む連続値問題は自然対数
log()を同様のリンク関数として使用する場合があります。
-
-
リンクの前に適用されるオフセットや、リンクの後に適用されるエクスポージャーが設定されている可能性があります。 (ワークベンチの設定は こちら、Classicの設定は こちらを参照してください。)オフセットとエクスポージャーは通常の特徴量の列ではないので、SHAP値は得られません。代わりに、後処理ステップとしてモデル出力に適用されます。 SHAP値は、すべてのオフセットが0、エクスポージャーが1であるものとして計算されます。
-
モデルは、その予測を「制限」または「監査」します(それらを負以外の値に強制するなど)。
次の疑似コードは、これらのケースで加法性を検証するために使用できます。
この例では、SHAP値はマージン単位で表されます。
# shap_values = output from SHAP prediction explanations
# If you obtained the base_value from the UI prediction distribution chart, first transform it by the link.
base_value = api_shap_base_value or link_function(ui_shap_base_value)
pred = base_value + sum(shap_values)
if offset is not None:
pred += offset
if link_function == 'log':
pred = exp(pred)
elif link_function == 'logit:
pred = exp(pred) / (1 + exp(pred))
if exposure is not None:
pred *= exposure
pred = predictions_capping(pred)
# at this point, pred matches the prediction output from the model
この例では、SHAP値は予測と同じ単位で表されます。
if link_function == 'log':
pred = (base_value + sum(shap_values)) * exposure * exp(offset)
elif link_function == 'logit':
# here expit(x) = exp(x) / (1 + exp(x))
pred = expit(offset + logit(base_value + sum(shap_values)))
else:
pred = offset + base_value + sum(shap_values)
時間を認識したSHAP値の計算方法¶
時間認識エクスペリメントでは、ワークベンチ(または API)を使用すると、SHAPベースの説明とインパクトを確認できます。計算は、入力特徴量に基づいて行われ、時間認識モデリングの実行結果である派生特徴量に基づいて行われるわけではありません。 このデータの計算方法は、予測エクスペリメントで使用されるものとは異なります。 以下のセクションで概要を説明します。
一般的に、SHAPでは、一度に1行ずつ入力データを取り込んで予測を行い、値をシャッフルして別の予測を行うという処理を繰り返し、結果のグリッドを作成します。 DataRobotでは、新しい行に進むたびにPermutationが実行され、次の行に移動します。 そして、すべての結果が一元化され、それを使用してSHAP値が計算されます。 しかし、時間認識エクスペリメントでは行単位の予測を行わないため、この計算方法は使えません。 時間認識は、同じ日付と系列のPermutationを処理するようには設計されておらず、系列を重複させることもできません。 時間認識では、系列全体に日付の流れがあります。
時間認識でSHAP値を提供するために、DataRobotではSHAPを2回実行します。 まず、データを確認して、SHAPが試行する可能性のある予測のPermutationのセットを収集します。 次に、それらを個別に処理するのではなく、並列予測キャッシュとして保存します。 各キャッシュは時系列の整合性を維持し、1つのキャッシュ内に同じ日付が複数存在することはありません。 予測後、結果がリシャッフルされ、期待される形式でSHAPに返されます。 これにより、SHAPは個々のPermutationを処理したかのように見えますが、実際には時間の連続性が保たれています。
たとえば、10個の特徴量を持つデータセットの場合、SHAPは、特定の特徴量の値を含めるか除外して、各行に10個のバリエーションを作成できます。 10個の特徴量がある場合、列または行のコピーが10個、それぞれ異なる設定で作成されます。 その結果は、10個の並列キャッシュとして保存されます。 各キャッシュは個別に予測され、データがリシャッフルされます。SHAPは一意のものを10個作成して予測し、それらが値を返したと「考えます」。
SHAPが実行するPermutationの数、つまり並列キャッシュの数は、「特徴量の数 × 2 - 1」になります。 これらは並列で保存されるため、各キャッシュには基本的に各Permutation(1月2日、3日など)が保存されますが、1つのキャッシュに同じ日付が複数存在することはありません。 このSHAP互換性の機能は、重複した時間ステップが競合することを防ぎます。競合すると、時系列モデルが壊れてしまうためです。
予測SHAPでは、行の順序に関係なく値の一貫性が保たれます。データをシャッフルしてSHAP値を計算した後、結果に影響を与えることなく、データを元の順序に戻すことができます。 各行のSHAP値は、その特徴値のみに依存します。 これに対し、時間認識SHAPでは、値は位置に依存します。 2つのデータポイントに同じ特徴量値(日付自体を除く)があっても、時間シーケンス内の位置が異なる場合、別々のSHAP値が割り当てられます。 時間軸でデータポイントを前後に移動すると、SHAP値が変化します。これは、時系列モデルが本質的に時間的な関係とパターンを考慮しているためです。 この時間依存性は、時間認識のSHAP値を解釈する際に考慮すべき重要な要素です。 時系列におけるデータポイントの位置は、データポイントの有用性と予測への貢献度に直接影響します。
その他の資料¶
以下の公開情報には、オープンソースのSHAPに関する追加情報が記載されます。