SHAP(Shapley Additive exPlanations) 총정리
1. SHAP
- SHAP(Shapley Additive exPlanations)
- 머신러닝 모델의 예측 결과를 해석하기 위한 방법론
- 모델과 상관없이 전체 데이터에서의 변수 중요도(Global explainer)와
개별 예측값에 대한 각 변수들의 영향력(Local explainer)을 제공
⇒ Shapley Value라는 개념을 기반으로 하며, 협력적 게임 이론에 근거한 수학적 개념
2. Shapley Value
2.1 계산식
$\phi_{i}=\frac{1}{|N|!}\sum_{S \subset N-\{i\}}|S|!(|N|-|S|-1)!\,[v(S\cup\{i\})-v(S)]$
- $\phi_{i}$: 특정 변수의 Shapley Value
- $i$: 관심 있는 변수 집합
- $S$: 관심 변수가 제외된 변수 부분 집합
- $N$: 전체 변수의 부분 집합
2.2 계산 예시
- 각 플레이어들이 왼쪽 또는 오른쪽 장갑 중 하나만 가지고 있을 때, 협력하여 왼쪽, 오른쪽 짝을 맞추면 보상을 얻음.
- 총 3명의 플레이어
- 플레이어 1,2 : 왼쪽 장갑
- 플레이어 3 : 오른쪽 장갑
- $v(S)= \begin{cases}1 & \text { if } S \in\{\{1,3\},\{2,3\},\{1,2,3\}\} \\ 0 & \text { otherwise }\end{cases}$
⇒ Player1의 계산 방법

같은 방법으로 플레이어 2,3의 shapley value를 계산하면
- X1의 Shapley value 구하기
|
X1 사용
|
X2 사용
|
X3 사용
|
예측 값
|
case1
|
X
|
X
|
X
|
28
|
case2
|
O
|
X
|
X
|
32
|
case3
|
X
|
O
|
X
|
31
|
case4
|
X
|
X
|
O
|
30
|
case5
|
O
|
O
|
X
|
32
|
case6
|
O
|
X
|
O
|
33
|
case7
|
X
|
O
|
O
|
32
|
case8
|
O
|
O
|
O
|
35
|
1. 변수 1개만 사용하는 경우
- case2 - case1 = 4
- 가중치 : 변수 1개만 사용하는 경우 3가지 중 X1 제거하는 경우 1가지 = 1/3
2. 변수 2개 사용하는 경우
- case5 - case3 = 1
- case6 - case4 = 3
- 가중치 : (X1,X2) (X1,X3) (X2,X3) 에서 X1 한 변수 제외 = 1/6
3. 변수 3개 사용하는 경우
- case8 - case7 = 3
- 가중치 : 세 변수 중 X1 제외하는 경우 = 1/3
2.3 shapley value의 공정한 분배 성질
- Efficiency : 게임에 참여한 플레이어에게 상금을 남김없이 나눠야 한다.
- Dummy player : 기여도가 0인 플레이어에게는 상금을 주지 않아야 한다.
- Symmetry : 기여도가 같다면 상금도 같아야 한다.
- Strong Monotonicity : 더 큰 기여를 하면 더 큰 상금을 받아야 한다.
- Additivity : 게임 A,B에 기여하여 얻은 플레이어 1의 상금
= 게임 A에 기여하여 얻은 플레이어 1의 상금 + 게임 B에 기여하여 얻은 플레이어 1의 상금
※ SHAP에서 Shapley Value를 사용한 이유는 다음의 특성을 만족하기 때문
|
⇒ 변수 중요도로써 합리적인 성질을 갖고 있어 인간이 생각하는 것과 유사한 해석을 제공
⇒ 다른 변수 중요도 방법의 단점(inconsistency, 변수간 상호작용 고려하지 않음 등)을 해결할 수 있는 방법
3. SHAP 종류
- Shapley Value를 직접적으로 계산하는 것은 모든 순열 조합에 대해 체크해야 하기 때문에 너무 많은 계산량
- 모델 $f$ 특징에 따라서 계산법을 달리하여 빠른 계산속도를 얻은 것이 SHAP
3.1 KernelSHAP
- LIME + shapley value
- Truly Model-Agnostic
- 계산량 많아 속도 느림
- Approximate calculation
3.2 TreeSHAP
- For Tree models
- 속도 빠름
- Exact calculation : 근사값이 아니기 때문에 consistency 완벽
3.3 DeepSHAP
- For Deep Learning models
- 각 class를 예측해내는데 있어서 어느 부분이 큰 기여를 했는지 볼 수 있음
이외에도 LinearSHAP, ExactSHAP, GradientSHAP 등이 있음.
4. SHAP의 장단점
4.1 장점
- 모델의 종류와 상관없이 사용이 가능한 방법.
- consistency한 결과를 내뱉음.
- Local & Global한 설명이 가능함.
- 변수 간 상호작용을 고려해서 계산됨.
- 음의 영향력 계산이 가능함.
- 유용한 시각화 기능
- 유니크한 값이 많은 연속형 변수 중요도가 범주형 변수보다 과도하게 높은 경향을 보이는
다른 변수 중요도 측정 방법(PI, MDI)의 문제를 상당 부분 해결 가능.
4.2 단점
- 계산량이 너무 많음.
- outlier에 영향 받음.
- KernalSHAP, TreeSHAP의 경우에는 Missingness 만족하지 않고, 다중공선성 문제의 영향을 받음.
5. 적용 예시 및 해석
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
# Boston 주택 가격 데이터셋 다운로드
url = "https://raw.githubusercontent.com/selva86/datasets/master/BostonHousing.csv"
boston = pd.read_csv(url)
# 데이터셋 분리
X = boston.drop(columns=['medv'])
y = boston['medv']
## 모형 학습
reg = RandomForestRegressor(n_estimators=50, max_depth=5, random_state=0).fit(X, y)
- 보스턴 집 값 데이터
- 랜덤포레스트 회귀 모형 학습
## Bar Plot
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus'] = False
tree_explainer = shap.TreeExplainer(reg) ## TreeExplainer 객체 생성
shap_values = tree_explainer.shap_values(X) ## SHAP Value
fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')
ax = fig.add_subplot()
shap.summary_plot(shap_values, X,
feature_names=X.columns, ## 변수명 표시
plot_type='bar', ## 막대 그래프
color='k', ## 막대 컬러
show=False ## 기존 X축 라벨 표시 안함
)
ax.set_xlabel('SHAP Value')
ax.set_title('SHAP Bar Plot', fontsize=20)
plt.show()
- 개별 변수의 SHAP Value의 절대값 평균을 취한 것 : 글로벌한 예측 영향 정도
- 막대 길이가 길수록 글로벌한 예측 영향력이 크고 이는 예측에 있어서 중요한 변수라고 생각할 수 있음
- 다만, 영향의 방향성 정보는 제공하지 못함.
## Dot Plot
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus'] = False
tree_explainer = shap.TreeExplainer(reg) ## TreeExplainer 객체 생성
shap_values = tree_explainer.shap_values(X) ## SHAP Value
fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')
ax = fig.add_subplot()
shap.summary_plot(shap_values, X,
feature_names=X.columns, ## 변수명 표시
cmap='bwr', ## 컬러맵
show=False, ## 기존 X축 라벨 표시 안함
)
ax.set_xlabel('SHAP Value')
ax.set_title('SHAP Dot Plot', fontsize=20)
plt.show()
- LSTAT 변수
- SHAP Value가 음수인 곳에 빨간색 점 많음
- SHAP Value가 양수인 곳에 파란색 점 많음
⇒ LSTAT 값이 낮을 때, 예측값을 증가시켰다 = 예측값에 음의 상관성으로 영향을 미쳤다.
- LM 변수 : 양의 상관성으로 영향을 미쳤다.
## Bar Plot
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus'] = False
tree_explainer = shap.TreeExplainer(reg) ## TreeExplainer 객체 생성
shap_values = tree_explainer.shap_values(X) ## SHAP Value
fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')
ax = fig.add_subplot()
shap.dependence_plot(6, shap_values, X,
feature_names=X.columns, ## 변수명 표시
ax = ax, ## 현재 좌표축
cmap = 'bwr' ## 컬러맵
)
ax.set_title('SHAP Dependence Plot', fontsize=20)
plt.show()
- 변수간 의존성 파악
- AGE 변수의 plot을 그린 것이며, 가장 교호작용 효과가 큰 LSTAT과의 교호 작용 확인 가능
- 80세 이상에서 LSTAT 값이 대체로 큼(빨간색 점)
- 80세 미만에서 LSTAT 값이 대체로 작음 (파란색 점)
⇒ AGE 변수가 예측에 영향을 미치는 방향이 LSTAT 수준에 따라서 바뀌고 있다 = 교호작용 있음.
# TreeExplainer 객체 생성
tree_explainer = shap.TreeExplainer(reg)
# SHAP interaction values 계산
shap_interaction_values = tree_explainer.shap_interaction_values(X)
# 상호작용 값 요약 플롯 생성
shap.summary_plot(shap_interaction_values, X)
- feature 사이의 interaction 파악 가능
- main effect는 대각선
- interaction effect는 대각선 외
- 분리하여 상호작용 효과를 시각화하면 추가적인 인사이트를 얻을 수 있음

(참고) interaction value 공식
$\phi_{i,j}=\sum_{S\subseteq\backslash\{i,j\}}\frac{|S|!(M-|S|-2)!}{2(M-1)!}\delta_{ij}(S)$
when $i\neq{}j$ and:
$\delta_{ij}(S)=\hat{f}_x(S\cup\{i,j\})-\hat{f}_x(S\cup\{i\})-\hat{f}_x(S\cup\{j\})+\hat{f}_x(S)$