Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Tree SHAP

決定木ベースの手法で高速にSHAPを計算する手法。

論文上のアルゴリズム名はTreeSHAP、shapパッケージの実装としては TreeExplainer

アルゴリズム

Shapley values

NN は全特徴量集合、MM は特徴量数とする。特徴量集合 SS が観測されているときの条件付き期待値 fx(S)=E[f(x)xS]f_x(S)=E[f(x)\mid x_S] をとすると、Shapley valuesは

ϕi=SN{i}S!(MS1)!M![fx(S{i})fx(S)]\phi_i = \sum_{S \subseteq N \setminus \{i\}} \frac{|S|!(M-|S|-1)!}{M!} [f_x(S \cup \{i\}) - f_x(S)]

となる。

Tree SHAPアルゴリズムは木構造に特化してShapley valuesを厳密に計算し、計算量を従来の O(TL2M)O(TL2^M) から O(TLD2)O(TLD^2) に削減できる。ここで TT は木の数、LL は各木の最大葉数、DD は最大の深さである。

上の式のうち fx(S)=E[f(x)xS]f_x(S)=E[f(x)\mid x_S] の推定が課題となる。

シンプルだが O(TL2M)O(TL2^M) のアルゴリズム

fx(S)=E[f(x)xS]f_x(S)=E[f(x)\mid x_S] を推定する単純で計算量の多いアルゴリズム。

次のような木を考える

root: x_1 <= 5 ?
├── left leaf:  v = 10, cover = 30
└── right node: cover = 70
    ├── x_2 <= 3 leaf: v = 20,  cover = 50
    └── x_2 > 3  leaf: v = 100, cover = 20

説明対象のインスタンスがx1=7,x2=2x_1 = 7, x_2 = 2だとする

S={1,2}S = \{1, 2\}の場合:
x1<=5x_1 <= 5 → right node
x2<=3x_2 <= 3v=20v=20E[f(X)X1=7,X2=2]=20E[f(X) \mid X_1=7, X_2=2]=20

S=1S = {1} の場合:
x1<=5x_1 <= 5 → right node
x2x_2が未知なのでカバー比率rrで子ノードを荷重和

E[f(X)X1=7]=507020+2070100=30007042.86E[f(X) \mid X_1=7] =\frac{50}{70} \cdot 20+\frac{20}{70} \cdot 100 = \frac{3000}{70} \approx 42.86

特徴量の数MMに対し、部分集合SS2M2^M個あるので計算量が多いのが問題

O(TLD2)O(TLD^2) のアルゴリズム

決定木では、ある葉の値に影響するのは、基本的にはその葉に至るパス上に現れた特徴量だけなので、ほかの特徴についてのパスは無視できる → 深さDDに対しO(TLD2)O(TLD^2)

Algorithm 2 は、決定木の各葉に到達する確率が、ある特徴量を条件付けるかどうかでどれだけ変わるかを計算し、その差に葉の出力値を掛けて特徴量ごとの寄与に分配するアルゴリズム

  1. 木を根から葉まで再帰的にたどる

  2. 各分岐で、対象サンプル x が進む方向を hot child とする

  3. 特徴量が「ある」場合は hot child にだけ進む

  4. 特徴量が「ない」場合は、訓練データのカバー比 r_child / r_parent で左右に分配する

  5. パス上では、特徴量ごとの zero fraction, one fraction, Shapley重みを管理する

  6. 葉に到達したら、w * (one fraction - zero fraction) * 葉の値 を各特徴量のSHAP値に加算する

変化

φ_{m_i} ← φ_{m_i} + w * (m_i.o - m_i.z) * v_j
# w: 重み
# (m_i.o - m_i.z): 特徴の条件付けでの葉の到達確率の変化
# v_j: 葉ノードでの出力値

SHAP interaction values

TreeSHAPと同じ論文で提案された、特徴量同士の交互作用の強さを評価する手法

主効果から相互作用効果を分離することで、さらに追加の洞察を得ることができる。ペアごとの相互作用を考えると、あるモデル予測に対して、すべての特徴量ペアが与える影響を表す寄与度行列が得られる。SHAP値はゲーム理論における古典的なShapley値に基づいているため、相互作用効果への自然な拡張は、より現代的なShapley interaction index によって得られる。

Φi,j=SNi,jS!(MS2)!2(M1)!ij(S)\Phi_{i,j} = \sum_{S \subseteq N \setminus {i,j}} \frac{|S|!(M-|S|-2)!}{2(M-1)!} \nabla_{ij}(S)

ただし iji \ne j であり、

ij(S)=fx(Si,j)fx(Si)fx(Sj)+fx(S)=fx(Si,j)fx(Sj)[fx(Si)fx(S)]\begin{aligned} \nabla_{ij}(S) &= f_x(S \cup {i,j}) - f_x(S \cup {i}) - f_x(S \cup {j}) + f_x(S)\\ &= f_x(S \cup {i,j}) - f_x(S \cup {j}) - [f_x(S \cup {i}) - f_x(S)] \end{aligned}

式3では、特徴量 ii と特徴量 jj の間のSHAP相互作用値は、それぞれの特徴量に等しく分配される。そのため、

Φi,j=Φj,i\Phi_{i,j} = \Phi_{j,i}

となり、全体の相互作用効果は

Φi,j+Φj,i\Phi_{i,j} + \Phi_{j,i}

で表される。ある予測に対する主効果は、その特徴量のSHAP値から、その特徴量に関するSHAP相互作用値を差し引いたものとして定義できる。

Φi,i=ϕijiΦi,j\Phi_{i,i} = \phi_i - \sum_{j \ne i} \Phi_{i,j}

SHAP相互作用値は直接計算することもできるが、木モデルではAlgorithm 2を利用することで、計算コストを大幅に削減できる。SHAP相互作用値は、特徴量 jj が存在している場合の特徴量 ii のSHAP値と、特徴量 jj が存在していない場合の特徴量 ii のSHAP値との差として解釈できる。

このため、Algorithm 2を2回使うことができる。1回目は特徴量 jj が存在しているものとして固定して無視し、2回目は特徴量 jj が存在しないものとして計算する。各特徴量についてこの処理を繰り返すため、実行時間は O(TMLD2)O(TMLD^2) となる。