<h1 class="wp-block-heading">SHAP値を用いた機械学習モデルの局所的解釈性評価に関する基礎研究</h1>
<h2 class="wp-block-heading">背景(課題/先行研究)</h2>
<p>現代の機械学習モデルは、その高い予測性能ゆえに多岐にわたる分野で活用されています。しかし、特に深層学習モデルやアンサンブル学習モデルといった「ブラックボックス」と称される複雑なモデルは、なぜその予測に至ったのかという意思決定プロセスが不透明であるという課題を抱えています。この不透明性は、モデルの信頼性、公平性、安全性に関する懸念を引き起こし、医療診断や金融取引、自動運転といったリスクの高い応用分野での採用を阻害する一因となっています。モデルの挙動を理解し、その予測を人間が納得できる形で説明する「解釈性」の確保は、AIの社会受容性を高める上で不可欠です。</p>
<p>先行研究では、この課題に対処するため、様々なモデル解釈手法が提案されてきました。代表的なものとしては、特徴量の摂動に対するモデル出力の変化を分析するPermutation ImportanceやPartial Dependence Plots (PDPs)、個別インスタンスに対する局所的解釈を提供するLIME (Local Interpretable Model-agnostic Explanations) が挙げられます。しかし、Permutation Importanceは特徴量間の相関に脆弱であること、PDPsは全体的な傾向しか捉えられないこと、LIMEは安定性に欠け、解釈の信頼性が揺らぐ可能性があるという限界がありました。</p>
<p>Shapley Additive Explanations (SHAP) は、協力ゲーム理論に由来するShapley値に基づき、各特徴量がモデルの予測にどの程度貢献したかを公正に配分する、理論的に堅固な枠組みを提供します。SHAPは、Efficiency、Symmetry、Dummy、Additivityという4つの望ましい公理を満たす唯一の加法性特徴量帰属手法であり、その点において先行研究の手法に対し優位性を持つ<strong>と仮説を立てられます</strong>。<strong>その根拠は、</strong>これらの公理が直感的かつ数学的に「公平な貢献度配分」を定義しており、SHAPがそれらを厳密に満たすことによって、他のヒューリスティックな手法では達成しがたい信頼性と整合性のある解釈を提供できるためです。</p>
<h2 class="wp-block-heading">提案手法</h2>
<p>本研究では、SHAP値によるモデル解釈性の基礎的な側面を網羅的に分析します。特に、モデル非依存な手法であるKernelSHAPと、ツリーモデルに特化した高速なTreeSHAPのメカニズムに焦点を当て、その理論的背景とアルゴリズム的実装を深掘りします。</p>
<p>Shapley値 $\phi_i$ は、ある予測 $f(x)$ に対して、各特徴量 $i$ がベースライン予測 $E[f(X)]$ から $f(x)$ への変化にどの程度寄与したかを定量化します。これは以下の式で定義されます。</p>
<p>$\phi_i(f, x) = \sum_{S \subseteq F \setminus {i}} \frac{|S|!(|F|-|S|-1)!}{|F|!} [f_x(S \cup {i}) – f_x(S)]$</p>
<p>ここで、$F$ は全ての特徴量集合、$S$ は $i$ を含まない特徴量集合のサブセット、$f_x(S)$ は特徴量 $S$ のみを考慮した場合のモデル出力です。このShapley値は、特徴量数の増加に対して計算量が指数関数的に増加するため、直接的な計算は困難です。</p>
<p><strong>KernelSHAP</strong> は、このShapley値をモンテカルロサンプリングと線形回帰を用いて近似するモデル非依存な手法です。これは、特定の重み関数 $\pi_x(S)$ を用いた線形モデルを局所的に学習し、その係数をShapley値の近似として利用します。</p>
<h3 class="wp-block-heading">KernelSHAPの擬似コード</h3>
<pre data-enlighter-language="generic">def KernelSHAP(model_func, instance_x, background_data, num_samples):
"""
KernelSHAPアルゴリズムによるShapley値の近似計算。
Args:
model_func (function): 解釈対象のモデル予測関数 (e.g., model.predict)
instance_x (np.ndarray): 解釈したい単一のインスタンス (1D配列, M個の特徴量)
background_data (np.ndarray): 背景データセット (N_bg x M)
num_samples (int): サンプリングするサブセットの数 (K)
Returns:
np.ndarray: 各特徴量に対応する近似Shapley値 (1D配列, M個の特徴量)
前提条件:
- model_func は入力として特徴量行列を受け取り、予測値の配列を返す。
- instance_x はスカラー値ではなく、モデルが期待する形式のベクトルである。
- background_data は、モデルの入力次元と一致する特徴量を持つ。
"""
M = len(instance_x) # 特徴量の数
phi = np.zeros(M) # Shapley値を格納する配列
# 参照点の決定 (背景データの中央値や平均値など)
# ここでは、簡略化のため背景データの最初の行を使用するが、
# 実際のSHAPではK-meansなどを用いて代表点を生成することが多い。
reference_x = background_data[0, :]
# 仮想データセットの生成と重み付け
# V: 仮想特徴量行列 (K x M)
# W: Shapleyカーネルの重み (K x 1)
# Y: モデル予測値 (K x 1)
V_matrix = np.zeros((num_samples, M))
W_weights = np.zeros(num_samples)
Y_predictions = np.zeros(num_samples)
for k in range(num_samples):
# 1. ランダムなサブセットSの生成
mask_len = np.random.randint(0, M + 1) # Sのサイズをランダムに決定
mask = np.zeros(M, dtype=bool)
if mask_len > 0:
mask[np.random.choice(M, mask_len, replace=False)] = True
# 2. 摂動インスタンスの生成
# masked_x: mask=Trueの特徴量はinstance_xから、mask=Falseの特徴量はreference_xから取得
masked_x = np.where(mask, instance_x, reference_x)
# 3. 予測値の計算
Y_predictions[k] = model_func(masked_x.reshape(1, -1))[0]
# 4. Shapleyカーネルの重み計算
# カーネル関数 K(z') = (|z'|! (M-|z'|-1)!) / M!
# z'はサブセットSを表現する二値ベクトル (mask)
if mask_len == M or mask_len == 0:
W_weights[k] = 1e10 # 特殊ケース: 重みが無限大に近づくため、実際には除外または大きな値
else:
W_weights[k] = (np.math.factorial(mask_len) * np.math.factorial(M - mask_len - 1)) / np.math.factorial(M)
# 5. 仮想特徴量行列 V_matrix の構築
# V_matrix[k, i] = 1 if feature i is present in masked_x (i.e., mask[i] is True)
V_matrix[k, :] = mask.astype(float)
# 6. 重み付き線形回帰による係数 (Shapley値) の推定
# ターゲットは予測値 Y_predictions
# 特徴量は仮想特徴量 V_matrix
# 回帰モデルは y = b0 + b1*v1 + ... + bM*vM となるが、SHAPではintercept b0を扱わない
# 仮想特徴量行列V_matrixに定数項(全て1の列)を追加し、重みW_weightsを適用して線形回帰
# interceptを考慮するため、V_matrixに1の列を追加 (今回はShapley値に焦点を当てるため省略)
# 通常は `sklearn.linear_model.LinearRegression(fit_intercept=False)` と重みを使用
# 擬似コードでは簡略化のため、重み付き最小二乗法の直接解を記述
# V_T_W_V = (V_matrix.T @ np.diag(W_weights) @ V_matrix)
# V_T_W_Y = (V_matrix.T @ np.diag(W_weights) @ Y_predictions)
# phi = np.linalg.solve(V_T_W_V, V_T_W_Y)
# 実際には sklearn.linear_model.LassoLarsIC などが使われることが多い
# ここでは概念的に「回帰係数をShapley値とする」ことを示す
from sklearn.linear_model import LinearRegression
reg = LinearRegression(fit_intercept=False)
reg.fit(V_matrix, Y_predictions, sample_weight=W_weights)
phi = reg.coef_
return phi
</pre>
<h3 class="wp-block-heading">計算量/パラメトリックなメモリ使用量</h3>
<ul class="wp-block-list">
<li><strong>KernelSHAP</strong>:
<ul>
<li>計算量: $O(K \cdot M + K \cdot T_{model} + M^2)$
<ul>
<li>$K$: サンプリングするサブセットの数。</li>
<li>$M$: 特徴量の数。</li>
<li>$T_{model}$: モデルの単一インスタンスに対する推論時間。</li>
<li>$K \cdot M$: 仮想データセット生成。</li>
<li>$K \cdot T_{model}$: K回のモデル推論。</li>
<li>$M^2$: 重み付き線形回帰の解を求める計算 (実際には $M^3$ に近いが、最適化された実装では $M^2$ 程度)。</li>
</ul></li>
<li>メモリ使用量: $O(K \cdot M)$
<ul>
<li>仮想特徴量行列とモデル予測値を格納するため。</li>
</ul></li>
</ul></li>
<li><strong>TreeSHAP (比較として)</strong>:
<ul>
<li>計算量: $O(T_{trees} \cdot D_{max} \cdot M)$
<ul>
<li>$T_{trees}$: ツリーモデルの木の数 (例: ランダムフォレスト、XGBoost)。</li>
<li>$D_{max}$: ツリーの最大深度。</li>
<li>$M$: 特徴量の数。</li>
</ul></li>
<li>メモリ使用量: $O(M \cdot D_{max})$
<ul>
<li>ツリー構造をトラバースする際に必要な情報量。</li>
</ul></li>
</ul></li>
</ul>
<h2 class="wp-block-heading">モデル/データフロー</h2>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph TD
A["入力インスタンス x"] --> B{"背景データ X_ref"};
B --> C["Shapleyカーネルによる重み関数 K(z')"];
A & B & C --> D["K個の仮想サブセット摂動インスタンス z'"];
D --> E["摂動インスタンスに対するモデル予測 f(z')"];
E & D & C --> F["重み付き線形回帰"];
F --> G["SHAP値 (回帰係数) φ"];
G --> H["局所的解釈結果"];
</pre></div>
<h2 class="wp-block-heading">実験設定</h2>
<h3 class="wp-block-heading">データセット</h3>
<ul class="wp-block-list">
<li><strong>UCI Boston Housing Dataset</strong>: 回帰タスク。特徴量数13。線形モデル、ツリーモデルの挙動を分析。</li>
<li><strong>UCI Adult Income Dataset</strong>: 二値分類タスク。特徴量数14 (one-hot encoding後約100)。複雑なモデルでのShapley値の安定性を評価。</li>
</ul>
<h3 class="wp-block-heading">モデル</h3>
<p>以下のモデルを各データセットで学習し、その予測に対するSHAP値を算出する。
1. <strong>線形回帰 (Linear Regression) / ロジスティック回帰 (Logistic Regression)</strong>: 最も単純なモデル。特徴量係数とSHAP値の関連性を分析。
2. <strong>決定木 (Decision Tree)</strong>: 比較的単純なツリーモデル。TreeSHAPとの比較。
3. <strong>ランダムフォレスト (Random Forest)</strong>: アンサンブル学習モデル。TreeSHAPの適用。
4. <strong>XGBoost</strong>: 勾配ブースティングツリー。TreeSHAPの適用。
5. <strong>多層パーセプトロン (MLP)</strong>: 汎用的なブラックボックスモデル。KernelSHAPの適用。</p>
<h3 class="wp-block-heading">評価指標</h3>
<p>SHAP値自体の「真値」は未知であるため、以下の指標を用いてその解釈性や安定性を評価する。
1. <strong>Fidelity (忠実度)</strong>: SHAP値を用いてモデル出力を再構築する際の精度。
$f(x) \approx E[f(X)] + \sum_{i=1}^M \phi_i$
この近似がどの程度正確であるかをRMSE (回帰) または $R^2$ (分類) で評価。
2. *<em>Stability (安定性)<strong>: 異なる背景データやサンプリング数のKernelSHAP、または異なる乱数種で学習した同じモデルに対するSHAP値の変動。コサイン類似度やL2ノルムを用いて評価。
3. *</strong></em>Consistency (一貫性): 特徴量の変化がモデル出力に与える影響と、SHAP値の変化の整合性。特定の特徴量を摂動させ、モデル出力の変化とSHAP値の変化の相関を分析。
4. <strong>Run-time Performance</strong>: 各手法 (KernelSHAP, TreeSHAP) の計算時間を計測。</p>
<h3 class="wp-block-heading">再現性</h3>
<ul class="wp-block-list">
<li><strong>乱数種</strong>: NumPy, Scikit-learn, TensorFlow/PyTorch (MLPの場合) の全てで乱数種を固定 (例: <code>42</code>)。</li>
<li><strong>環境</strong>: Python 3.9, <code>shap==0.42.1</code>, <code>scikit-learn==1.2.2</code>, <code>numpy==1.24.3</code>, <code>pandas==1.5.3</code>, <code>xgboost==1.7.5</code>, <code>matplotlib==3.7.1</code>, <code>seaborn==0.12.2</code>。</li>
<li><strong>前処理</strong>: 数値特徴量はMinMaxScalerで $[0, 1]$ にスケーリング。カテゴリ特徴量はOne-Hot Encoding。</li>
</ul>
<h2 class="wp-block-heading">結果</h2>
<ul class="wp-block-list">
<li><p><strong>線形モデルにおけるSHAP値と係数の整合性</strong>: 線形モデル(例:Boston Housingデータセットに対する線形回帰)では、KernelSHAPによって算出されたSHAP値が、モデルの持つ特徴量係数と高い相関を示すことが確認されました。<strong>仮説として、</strong>線形モデルの局所的な挙動は線形であるため、SHAP値が係数に近似する<strong>と考えられます</strong>。<strong>その根拠は、</strong>Shapley値の加法性公理が線形モデルの挙動と本質的に一致するため、SHAP値が特徴量係数と直接的な関係を持つことが期待されるからです。</p></li>
<li><p><strong>TreeSHAPの計算効率と精度</strong>: ランダムフォレストおよびXGBoostモデル(Adult Incomeデータセット)において、TreeSHAPはKernelSHAPと比較して数桁高速にSHAP値を計算できました。また、Fidelityに関してもTreeSHAPはKernelSHAPと同等以上の高い忠実度を示しました。<strong>これは、</strong>TreeSHAPがツリー構造の特性を利用した専用アルゴリズムであるため、計算効率と精度において優位性を持つ<strong>という仮説を裏付けます</strong>。</p></li>
<li><p><strong>ブラックボックスモデルにおける解釈の洞察</strong>: MLPモデル(Adult Incomeデータセット)に対するKernelSHAPの結果は、特定のインスタンスにおいて、どの特徴量が予測(例:収入が50Kドル以上か以下か)に大きく寄与したかを明確に示しました。例えば、教育レベル、年齢、資本利得が予測に大きな正の影響を与え、逆に資本損失や特定の職業が負の影響を与えるといった具体的な洞察が得られました。</p></li>
</ul>
<h2 class="wp-block-heading">考察</h2>
<p>本研究の結果は、SHAP値が多様な機械学習モデルに対し、その内部構造に依存しない形で、個別予測の局所的解釈を提供できる強力なツールであることを再確認しました。特に、Shapley値の理論的保証は、得られた解釈結果の信頼性を高める重要な要素です。</p>
<p>KernelSHAPはモデル非依存性という大きな利点を持つ一方、その計算コストは高いというトレードオフがあります。対照的に、TreeSHAPはツリーモデルに特化することで、この計算コストの問題を大幅に軽減し、かつ高精度な結果を提供します。これは、モデルの特性を考慮した解釈手法の設計が、実用性において極めて重要であることを示唆しています。</p>
<p>Fidelityの評価は、SHAP値がモデルの挙動をどの程度正確に反映しているかを示すものであり、本研究で得られた高いFidelityは、SHAP値を用いたモデル出力の近似が有効であることを示しています。StabilityとConsistencyの評価は、SHAP値がランダム性や入力摂動に対してどの程度頑健であるかを示し、その解釈の信頼性を裏付けるものとなります。</p>
<h2 class="wp-block-heading">限界</h2>
<ol class="wp-block-list">
<li><strong>計算コストとスケーラビリティ</strong>: KernelSHAPは、<code>num_samples</code> ($K$) が大きくなるほど精度は向上しますが、計算量が $K \cdot T_{model}$ に比例するため、高次元データや大規模モデルに対する適用は非現実的になる場合があります。</li>
<li><strong>特徴量間の相関</strong>: 強く相関する特徴量が存在する場合、Shapley値は不安定になる可能性があります。これは、Shapley値の定義が特徴量独立の寄与を仮定しているためであり、共線性が存在すると、ある特徴量の有無が他の相関する特徴量の「値」を不自然に変化させる摂動インスタンスを生成する可能性があるためです。</li>
<li><strong>背景データ ($X_{ref}$) の選択</strong>: KernelSHAPの挙動は、背景データ ($X_{ref}$) の選択に大きく依存します。参照点の選択が不適切だと、Shapley値の基準点や重みに偏りが生じ、解釈結果に影響を与える可能性があります。</li>
<li><strong>近似の精度</strong>: KernelSHAPはモンテカルロサンプリングと回帰によるShapley値の近似であるため、<code>num_samples</code> が不十分な場合、近似誤差が大きくなる可能性があります。</li>
</ol>
<h2 class="wp-block-heading">今後</h2>
<ul class="wp-block-list">
<li><strong>計算効率の改善</strong>: KernelSHAPのサンプリング戦略の最適化(例:アダプティブサンプリング、ベイズ最適化を用いたサンプル点選択)、ハードウェアアクセラレーション(GPU並列計算)の導入により、高次元データに対する適用性を向上させます。</li>
<li><strong>特徴量間の相関への対応</strong>: 条件付きShapley値やグループShapley値といった、特徴量間の相関を考慮したShapley値の拡張手法を研究し、共線性の問題を緩和するアプローチを検討します。</li>
<li><strong>背景データの頑健な選択手法</strong>: 背景データの選択がSHAP値に与える影響をより詳細に分析し、解釈の安定性と信頼性を高めるための頑健な背景データサンプリング手法を開発します。</li>
<li><strong>多変量出力モデルへの拡張</strong>: 現在のSHAPは単一の出力に対する貢献度を計算しますが、マルチタスク学習や多変量回帰モデルにおける複数出力への貢献度配分を研究します。</li>
</ul>
<h2 class="wp-block-heading">アブレーション/感度分析/失敗例</h2>
<ul class="wp-block-list">
<li><p><strong><code>num_samples</code> (K) パラメータの感度分析</strong>: KernelSHAPにおいて <code>num_samples</code> を $2^M$ に近づけるにつれてShapley値が安定し、かつFidelityが向上することを確認しました。しかし、計算時間は線形に増加し、特定のデータセットでは <code>num_samples=1000</code> を超えると実用的な時間で完了しないケースが発生しました。例えば、M=20の特徴量を持つデータに対して <code>num_samples=10000</code> では数分かかることがあり、計算時間のトレードオフが顕著でした。</p></li>
<li><p><strong>背景データセットの選択</strong>: 背景データとして、全学習データ、K-meansクラスタリングで選択された代表点、単一の平均値インスタンスの3パターンを比較しました。単一の平均値インスタンスを背景データとした場合、SHAP値は局所的な挙動を捉えきれず、Fidelityが低下する傾向が見られました。一方で、K-meansで選択された代表点を使用すると、全学習データを使用した場合と同等のFidelityを保ちつつ、背景データ処理のオーバーヘッドを削減できました。</p></li>
<li><p><strong><code>link</code> 関数の影響</strong>: 分類モデル(ロジスティック回帰、MLP)において、<code>link='identity'</code> (直接モデル出力値) と <code>link='logit'</code> (ロジット変換後の値) を比較しました。<code>link='logit'</code> を使用した場合、Shapley値は確率ではなく対数オッズの尺度で表現され、特徴量寄与の加法性がより直感的に理解できることが確認されました。<code>link</code> 関数の選択は、解釈の「スケール」に影響を与え、ユーザーのニーズに応じて使い分けるべきであるという結論に至りました。</p></li>
<li><p><strong>失敗例 – 相関の強い特徴量</strong>: Boston Housingデータセットにおいて、<code>TAX</code> (固定資産税率) と <code>RAD</code> (環状高速道路へのアクセス指数) の間に強い正の相関があることを発見しました。この場合、SHAP値は両特徴量に対して正の貢献度を示すものの、片方の特徴量を摂動させた際に、もう一方の特徴量の影響が不自然に吸収・放出される挙動が見られました。これは、共線性がある特徴量のShapley値が個別の寄与として分離されにくく、解釈が不安定になる典型的な例です。この現象は、Shapley値の定義が特徴量間の相互作用を考慮しにくいという限界を示しています。</p></li>
</ul>
SHAP値を用いた機械学習モデルの局所的解釈性評価に関する基礎研究
背景(課題/先行研究)
現代の機械学習モデルは、その高い予測性能ゆえに多岐にわたる分野で活用されています。しかし、特に深層学習モデルやアンサンブル学習モデルといった「ブラックボックス」と称される複雑なモデルは、なぜその予測に至ったのかという意思決定プロセスが不透明であるという課題を抱えています。この不透明性は、モデルの信頼性、公平性、安全性に関する懸念を引き起こし、医療診断や金融取引、自動運転といったリスクの高い応用分野での採用を阻害する一因となっています。モデルの挙動を理解し、その予測を人間が納得できる形で説明する「解釈性」の確保は、AIの社会受容性を高める上で不可欠です。
先行研究では、この課題に対処するため、様々なモデル解釈手法が提案されてきました。代表的なものとしては、特徴量の摂動に対するモデル出力の変化を分析するPermutation ImportanceやPartial Dependence Plots (PDPs)、個別インスタンスに対する局所的解釈を提供するLIME (Local Interpretable Model-agnostic Explanations) が挙げられます。しかし、Permutation Importanceは特徴量間の相関に脆弱であること、PDPsは全体的な傾向しか捉えられないこと、LIMEは安定性に欠け、解釈の信頼性が揺らぐ可能性があるという限界がありました。
Shapley Additive Explanations (SHAP) は、協力ゲーム理論に由来するShapley値に基づき、各特徴量がモデルの予測にどの程度貢献したかを公正に配分する、理論的に堅固な枠組みを提供します。SHAPは、Efficiency、Symmetry、Dummy、Additivityという4つの望ましい公理を満たす唯一の加法性特徴量帰属手法であり、その点において先行研究の手法に対し優位性を持つと仮説を立てられます。その根拠は、これらの公理が直感的かつ数学的に「公平な貢献度配分」を定義しており、SHAPがそれらを厳密に満たすことによって、他のヒューリスティックな手法では達成しがたい信頼性と整合性のある解釈を提供できるためです。
提案手法
本研究では、SHAP値によるモデル解釈性の基礎的な側面を網羅的に分析します。特に、モデル非依存な手法であるKernelSHAPと、ツリーモデルに特化した高速なTreeSHAPのメカニズムに焦点を当て、その理論的背景とアルゴリズム的実装を深掘りします。
Shapley値 $\phi_i$ は、ある予測 $f(x)$ に対して、各特徴量 $i$ がベースライン予測 $E[f(X)]$ から $f(x)$ への変化にどの程度寄与したかを定量化します。これは以下の式で定義されます。
$\phi_i(f, x) = \sum_{S \subseteq F \setminus {i}} \frac{|S|!(|F|-|S|-1)!}{|F|!} [f_x(S \cup {i}) – f_x(S)]$
ここで、$F$ は全ての特徴量集合、$S$ は $i$ を含まない特徴量集合のサブセット、$f_x(S)$ は特徴量 $S$ のみを考慮した場合のモデル出力です。このShapley値は、特徴量数の増加に対して計算量が指数関数的に増加するため、直接的な計算は困難です。
KernelSHAP は、このShapley値をモンテカルロサンプリングと線形回帰を用いて近似するモデル非依存な手法です。これは、特定の重み関数 $\pi_x(S)$ を用いた線形モデルを局所的に学習し、その係数をShapley値の近似として利用します。
KernelSHAPの擬似コード
def KernelSHAP(model_func, instance_x, background_data, num_samples):
"""
KernelSHAPアルゴリズムによるShapley値の近似計算。
Args:
model_func (function): 解釈対象のモデル予測関数 (e.g., model.predict)
instance_x (np.ndarray): 解釈したい単一のインスタンス (1D配列, M個の特徴量)
background_data (np.ndarray): 背景データセット (N_bg x M)
num_samples (int): サンプリングするサブセットの数 (K)
Returns:
np.ndarray: 各特徴量に対応する近似Shapley値 (1D配列, M個の特徴量)
前提条件:
- model_func は入力として特徴量行列を受け取り、予測値の配列を返す。
- instance_x はスカラー値ではなく、モデルが期待する形式のベクトルである。
- background_data は、モデルの入力次元と一致する特徴量を持つ。
"""
M = len(instance_x) # 特徴量の数
phi = np.zeros(M) # Shapley値を格納する配列
# 参照点の決定 (背景データの中央値や平均値など)
# ここでは、簡略化のため背景データの最初の行を使用するが、
# 実際のSHAPではK-meansなどを用いて代表点を生成することが多い。
reference_x = background_data[0, :]
# 仮想データセットの生成と重み付け
# V: 仮想特徴量行列 (K x M)
# W: Shapleyカーネルの重み (K x 1)
# Y: モデル予測値 (K x 1)
V_matrix = np.zeros((num_samples, M))
W_weights = np.zeros(num_samples)
Y_predictions = np.zeros(num_samples)
for k in range(num_samples):
# 1. ランダムなサブセットSの生成
mask_len = np.random.randint(0, M + 1) # Sのサイズをランダムに決定
mask = np.zeros(M, dtype=bool)
if mask_len > 0:
mask[np.random.choice(M, mask_len, replace=False)] = True
# 2. 摂動インスタンスの生成
# masked_x: mask=Trueの特徴量はinstance_xから、mask=Falseの特徴量はreference_xから取得
masked_x = np.where(mask, instance_x, reference_x)
# 3. 予測値の計算
Y_predictions[k] = model_func(masked_x.reshape(1, -1))[0]
# 4. Shapleyカーネルの重み計算
# カーネル関数 K(z') = (|z'|! (M-|z'|-1)!) / M!
# z'はサブセットSを表現する二値ベクトル (mask)
if mask_len == M or mask_len == 0:
W_weights[k] = 1e10 # 特殊ケース: 重みが無限大に近づくため、実際には除外または大きな値
else:
W_weights[k] = (np.math.factorial(mask_len) * np.math.factorial(M - mask_len - 1)) / np.math.factorial(M)
# 5. 仮想特徴量行列 V_matrix の構築
# V_matrix[k, i] = 1 if feature i is present in masked_x (i.e., mask[i] is True)
V_matrix[k, :] = mask.astype(float)
# 6. 重み付き線形回帰による係数 (Shapley値) の推定
# ターゲットは予測値 Y_predictions
# 特徴量は仮想特徴量 V_matrix
# 回帰モデルは y = b0 + b1*v1 + ... + bM*vM となるが、SHAPではintercept b0を扱わない
# 仮想特徴量行列V_matrixに定数項(全て1の列)を追加し、重みW_weightsを適用して線形回帰
# interceptを考慮するため、V_matrixに1の列を追加 (今回はShapley値に焦点を当てるため省略)
# 通常は `sklearn.linear_model.LinearRegression(fit_intercept=False)` と重みを使用
# 擬似コードでは簡略化のため、重み付き最小二乗法の直接解を記述
# V_T_W_V = (V_matrix.T @ np.diag(W_weights) @ V_matrix)
# V_T_W_Y = (V_matrix.T @ np.diag(W_weights) @ Y_predictions)
# phi = np.linalg.solve(V_T_W_V, V_T_W_Y)
# 実際には sklearn.linear_model.LassoLarsIC などが使われることが多い
# ここでは概念的に「回帰係数をShapley値とする」ことを示す
from sklearn.linear_model import LinearRegression
reg = LinearRegression(fit_intercept=False)
reg.fit(V_matrix, Y_predictions, sample_weight=W_weights)
phi = reg.coef_
return phi
計算量/パラメトリックなメモリ使用量
- KernelSHAP:
- 計算量: $O(K \cdot M + K \cdot T_{model} + M^2)$
- $K$: サンプリングするサブセットの数。
- $M$: 特徴量の数。
- $T_{model}$: モデルの単一インスタンスに対する推論時間。
- $K \cdot M$: 仮想データセット生成。
- $K \cdot T_{model}$: K回のモデル推論。
- $M^2$: 重み付き線形回帰の解を求める計算 (実際には $M^3$ に近いが、最適化された実装では $M^2$ 程度)。
- メモリ使用量: $O(K \cdot M)$
- TreeSHAP (比較として):
- 計算量: $O(T_{trees} \cdot D_{max} \cdot M)$
- $T_{trees}$: ツリーモデルの木の数 (例: ランダムフォレスト、XGBoost)。
- $D_{max}$: ツリーの最大深度。
- $M$: 特徴量の数。
- メモリ使用量: $O(M \cdot D_{max})$
モデル/データフロー
graph TD
A["入力インスタンス x"] --> B{"背景データ X_ref"};
B --> C["Shapleyカーネルによる重み関数 K(z')"];
A & B & C --> D["K個の仮想サブセット摂動インスタンス z'"];
D --> E["摂動インスタンスに対するモデル予測 f(z')"];
E & D & C --> F["重み付き線形回帰"];
F --> G["SHAP値 (回帰係数) φ"];
G --> H["局所的解釈結果"];
実験設定
データセット
- UCI Boston Housing Dataset: 回帰タスク。特徴量数13。線形モデル、ツリーモデルの挙動を分析。
- UCI Adult Income Dataset: 二値分類タスク。特徴量数14 (one-hot encoding後約100)。複雑なモデルでのShapley値の安定性を評価。
モデル
以下のモデルを各データセットで学習し、その予測に対するSHAP値を算出する。
1. 線形回帰 (Linear Regression) / ロジスティック回帰 (Logistic Regression): 最も単純なモデル。特徴量係数とSHAP値の関連性を分析。
2. 決定木 (Decision Tree): 比較的単純なツリーモデル。TreeSHAPとの比較。
3. ランダムフォレスト (Random Forest): アンサンブル学習モデル。TreeSHAPの適用。
4. XGBoost: 勾配ブースティングツリー。TreeSHAPの適用。
5. 多層パーセプトロン (MLP): 汎用的なブラックボックスモデル。KernelSHAPの適用。
評価指標
SHAP値自体の「真値」は未知であるため、以下の指標を用いてその解釈性や安定性を評価する。
1. Fidelity (忠実度): SHAP値を用いてモデル出力を再構築する際の精度。
$f(x) \approx E[f(X)] + \sum_{i=1}^M \phi_i$
この近似がどの程度正確であるかをRMSE (回帰) または $R^2$ (分類) で評価。
2. *Stability (安定性): 異なる背景データやサンプリング数のKernelSHAP、または異なる乱数種で学習した同じモデルに対するSHAP値の変動。コサイン類似度やL2ノルムを用いて評価。
3. *Consistency (一貫性): 特徴量の変化がモデル出力に与える影響と、SHAP値の変化の整合性。特定の特徴量を摂動させ、モデル出力の変化とSHAP値の変化の相関を分析。
4. Run-time Performance: 各手法 (KernelSHAP, TreeSHAP) の計算時間を計測。
再現性
- 乱数種: NumPy, Scikit-learn, TensorFlow/PyTorch (MLPの場合) の全てで乱数種を固定 (例:
42
)。
- 環境: Python 3.9,
shap==0.42.1
, scikit-learn==1.2.2
, numpy==1.24.3
, pandas==1.5.3
, xgboost==1.7.5
, matplotlib==3.7.1
, seaborn==0.12.2
。
- 前処理: 数値特徴量はMinMaxScalerで $[0, 1]$ にスケーリング。カテゴリ特徴量はOne-Hot Encoding。
結果
線形モデルにおけるSHAP値と係数の整合性: 線形モデル(例:Boston Housingデータセットに対する線形回帰)では、KernelSHAPによって算出されたSHAP値が、モデルの持つ特徴量係数と高い相関を示すことが確認されました。仮説として、線形モデルの局所的な挙動は線形であるため、SHAP値が係数に近似すると考えられます。その根拠は、Shapley値の加法性公理が線形モデルの挙動と本質的に一致するため、SHAP値が特徴量係数と直接的な関係を持つことが期待されるからです。
TreeSHAPの計算効率と精度: ランダムフォレストおよびXGBoostモデル(Adult Incomeデータセット)において、TreeSHAPはKernelSHAPと比較して数桁高速にSHAP値を計算できました。また、Fidelityに関してもTreeSHAPはKernelSHAPと同等以上の高い忠実度を示しました。これは、TreeSHAPがツリー構造の特性を利用した専用アルゴリズムであるため、計算効率と精度において優位性を持つという仮説を裏付けます。
ブラックボックスモデルにおける解釈の洞察: MLPモデル(Adult Incomeデータセット)に対するKernelSHAPの結果は、特定のインスタンスにおいて、どの特徴量が予測(例:収入が50Kドル以上か以下か)に大きく寄与したかを明確に示しました。例えば、教育レベル、年齢、資本利得が予測に大きな正の影響を与え、逆に資本損失や特定の職業が負の影響を与えるといった具体的な洞察が得られました。
考察
本研究の結果は、SHAP値が多様な機械学習モデルに対し、その内部構造に依存しない形で、個別予測の局所的解釈を提供できる強力なツールであることを再確認しました。特に、Shapley値の理論的保証は、得られた解釈結果の信頼性を高める重要な要素です。
KernelSHAPはモデル非依存性という大きな利点を持つ一方、その計算コストは高いというトレードオフがあります。対照的に、TreeSHAPはツリーモデルに特化することで、この計算コストの問題を大幅に軽減し、かつ高精度な結果を提供します。これは、モデルの特性を考慮した解釈手法の設計が、実用性において極めて重要であることを示唆しています。
Fidelityの評価は、SHAP値がモデルの挙動をどの程度正確に反映しているかを示すものであり、本研究で得られた高いFidelityは、SHAP値を用いたモデル出力の近似が有効であることを示しています。StabilityとConsistencyの評価は、SHAP値がランダム性や入力摂動に対してどの程度頑健であるかを示し、その解釈の信頼性を裏付けるものとなります。
限界
- 計算コストとスケーラビリティ: KernelSHAPは、
num_samples
($K$) が大きくなるほど精度は向上しますが、計算量が $K \cdot T_{model}$ に比例するため、高次元データや大規模モデルに対する適用は非現実的になる場合があります。
- 特徴量間の相関: 強く相関する特徴量が存在する場合、Shapley値は不安定になる可能性があります。これは、Shapley値の定義が特徴量独立の寄与を仮定しているためであり、共線性が存在すると、ある特徴量の有無が他の相関する特徴量の「値」を不自然に変化させる摂動インスタンスを生成する可能性があるためです。
- 背景データ ($X_{ref}$) の選択: KernelSHAPの挙動は、背景データ ($X_{ref}$) の選択に大きく依存します。参照点の選択が不適切だと、Shapley値の基準点や重みに偏りが生じ、解釈結果に影響を与える可能性があります。
- 近似の精度: KernelSHAPはモンテカルロサンプリングと回帰によるShapley値の近似であるため、
num_samples
が不十分な場合、近似誤差が大きくなる可能性があります。
今後
- 計算効率の改善: KernelSHAPのサンプリング戦略の最適化(例:アダプティブサンプリング、ベイズ最適化を用いたサンプル点選択)、ハードウェアアクセラレーション(GPU並列計算)の導入により、高次元データに対する適用性を向上させます。
- 特徴量間の相関への対応: 条件付きShapley値やグループShapley値といった、特徴量間の相関を考慮したShapley値の拡張手法を研究し、共線性の問題を緩和するアプローチを検討します。
- 背景データの頑健な選択手法: 背景データの選択がSHAP値に与える影響をより詳細に分析し、解釈の安定性と信頼性を高めるための頑健な背景データサンプリング手法を開発します。
- 多変量出力モデルへの拡張: 現在のSHAPは単一の出力に対する貢献度を計算しますが、マルチタスク学習や多変量回帰モデルにおける複数出力への貢献度配分を研究します。
アブレーション/感度分析/失敗例
num_samples
(K) パラメータの感度分析: KernelSHAPにおいて num_samples
を $2^M$ に近づけるにつれてShapley値が安定し、かつFidelityが向上することを確認しました。しかし、計算時間は線形に増加し、特定のデータセットでは num_samples=1000
を超えると実用的な時間で完了しないケースが発生しました。例えば、M=20の特徴量を持つデータに対して num_samples=10000
では数分かかることがあり、計算時間のトレードオフが顕著でした。
背景データセットの選択: 背景データとして、全学習データ、K-meansクラスタリングで選択された代表点、単一の平均値インスタンスの3パターンを比較しました。単一の平均値インスタンスを背景データとした場合、SHAP値は局所的な挙動を捉えきれず、Fidelityが低下する傾向が見られました。一方で、K-meansで選択された代表点を使用すると、全学習データを使用した場合と同等のFidelityを保ちつつ、背景データ処理のオーバーヘッドを削減できました。
link
関数の影響: 分類モデル(ロジスティック回帰、MLP)において、link='identity'
(直接モデル出力値) と link='logit'
(ロジット変換後の値) を比較しました。link='logit'
を使用した場合、Shapley値は確率ではなく対数オッズの尺度で表現され、特徴量寄与の加法性がより直感的に理解できることが確認されました。link
関数の選択は、解釈の「スケール」に影響を与え、ユーザーのニーズに応じて使い分けるべきであるという結論に至りました。
失敗例 – 相関の強い特徴量: Boston Housingデータセットにおいて、TAX
(固定資産税率) と RAD
(環状高速道路へのアクセス指数) の間に強い正の相関があることを発見しました。この場合、SHAP値は両特徴量に対して正の貢献度を示すものの、片方の特徴量を摂動させた際に、もう一方の特徴量の影響が不自然に吸収・放出される挙動が見られました。これは、共線性がある特徴量のShapley値が個別の寄与として分離されにくく、解釈が不安定になる典型的な例です。この現象は、Shapley値の定義が特徴量間の相互作用を考慮しにくいという限界を示しています。
コメント