본문 바로가기

문돌이 존버/데이터 분석

(Explainable AI) SHAP에 대해 알아보자!

반응형

지난 시간 Shapley Value에 이어 이번엔 SHAP(SHapley Additive exPlanation)에 대해 알아보겠습니다. 그 전에 아래 그림을 보면 Shapley Value가 무엇인지 좀 더 직관적으로 이해할 것입니다.

우리는 보통 왼쪽 그림에 더 익숙해져 있고, 왼쪽에서 나오는 결과값, 즉 예측이든 분류든 얼마나 정확한지에 초점을 맞추고 있습니다. 하지만 모델링을 하면서 반드시 그 원인 인자를 찾고, 얼마나 결과에 영향을 주었는지를 파악해야 할 때가 있죠. 가령 공정 불량률 및 직행률 개선을 위한 프로젝트에선 필수입니다. 도대체 어느 공정에서, 어느 라인에서 문제가 생기는지를 알아야 다시 점검하고 업그레이드할 수 있기 때문입니다.

이렇게 결과를 "설명"하는 것이 중요해지면서 XAI(eXplainable AI)가 점점 관심을 받고 있는 듯 합니다. 그 중에서도 SHAP은 Shapley Value를 근간으로 하는 XAI입니다.[각주:1]

아래 도식은 SHAP의 전체 과정을 나타냅니다. 본래 Black-box 모델이었던 $f$와 이를 바탕으로 한 예측이 있었고, 동일한 input 값을 넣는 것이 아니라 simplified 버전의 input값을 넣으며 Surrogate Model(=대리, 대신의) $g$를 찾는 것입니다. $g(z') = f(h_x(z'))$를 만족하는 $g$ 모델을 말이죠.

SHAP은 Local Explanation을 기반으로 하여, 데이터의 전체적인 영역에 대한 해석(Global Surrogate)이 가능합니다.

SHAP Values

A Unified Approach to Interpreting Model Predictions(2017) 논문에선 SHAP values를 특성 중요도의 "통합된 측정 방식(unified measure)"으로 제안합니다. Shapvely Value의 조건부평균(Conditional Expectation)으로, simplified input을 정의하기 위해 original model인 $f$의 값이 아닌 $f$의 조건부평균을 계산합니다.

$f_x(z') = f(h_x(z')) = E[f(z)|z_S]$

$S\ is\ the\ set\ of\ non-zero\ indexes\ in\ z'$

<수식1>

SHAP values는 어떤 특성의 조건부 조건에서 해당 특성이 모델 예측치의 변화를 가져오는 정도를 가리킨다. $E[f(z)]$는 아무런 특성을 모를 때 예측되는 것으로 base value라고 불리며, SHAP Values는 base value로부터 현재 결과값인 $f(x)$가 어떻게 나오는지를 설명한다.

SHAP Values는 Feature Attribution의 3가지 특징(Local Accuracy, Missingness, Consistency)을 만족하는 유니크한 가산적 특성 중요도 측정(additive feature importance measure) 방식을 제공합니다. 그리고 simplified input을 정의하는 데 조건부평균을 사용하기 때문에 $h_x(z') = z_S$가 됩니다. 여기서 $z_S$는 S집합에 없는 특성들의 결측치 값(missing values)를 가지고 있습니다. 하지만 많은 모델들이 결측치 input 값의 임의적인(arbitrary) 패턴을 잘 핸들링하지 못하는 것처럼, 해당 논문에서도 $f(z_S)$를 $E[f(z) | z_S]$로 근사(approixmate)시킨 것입니다.

하지만 Shapley Value인 $\phi_i$를 직접적으로 계산하는 것은 모든 순열조합에 대해 체크해야 하므로 효과적인 계산이 필요합니다. 따라서 모델 $f$의 특징에 따라 계산법을 달리하여 빠른 계산속도를 보장하는 방법이 생겼습니다.

1. Kernal SHAP: Linear LIME + Shapley Value
2. Tree SHAP: Tree based Model
3. Deep SHAP: DeepLearning based Model

Kernel SHAP

Kernel SHAP 계산과정은 아래처럼 5단계로 구성됩니다.

1. Feature value 연합에서 샘플링하여 표본을 구한다.
$z'_k \in \{0, 1\}^M, k \in \{1, ..., K\}$(1: 연합에 있는 특징, 0: 연합에 없는 특징)
2. $z'_k$를 원래의 특성 값으로 변환하고 모델 $f: f(h_x(z'_k))$를 통해 예측치를 얻어낸다.
3. KernelSHAP를 통해 각 $z'_k$에 대한 가중치를 계산한다.
4. 가중 선형 모델(weighted linear model)에 적합(fit)한다.
5. 선형 모델 계수인 Shapley value를 반환한다.

동전 뒤집기를 예로 설명해보겠습니다. 0과 1이 반복되는 무작위 연합(coalition)을 만들 수 있습니다. 예를 들어, (1, 0, 1, 0)이란 벡터는 첫 번째와 세 번째 특성 연합임을 의미합니다. K개의 표본 연합은 회귀 모형의 데이터셋이 되고, 회귀 모형의 목표는 연합에 대한 예측입니다.

특성값의 연합으로부터 유효한 데이터의 관측치를 얻기 위해선 $h_x : \{0, 1\}^M -> \mathbb{R}^p$ 일때 $h_x(z') = z$인 함수가 필요합니다. 함수 $h_x$는 이진 연합에서 1을 설명하고자 하는 관측치 $x$의 해당 값에 매핑합니다.

정형 데이터(Tabular data)의 경우 0을 데이터에서 샘플링한 또 다른 관측치 값에 매핑합니다. 이는 "특성값이 없음"과 "특성값이 데이터의 랜덤한 특성값으로 대체됨"을 의미하며, 아래 그림을 통해 연합에서 특성값으로의 매핑 과정을 살펴봅시다.

함수 $h_x$는 coalitions를 valid instance에 매핑합니다. 특성이 있는 "1"의 경우, $h_x$는 $x$의 특성값에 매핑됩니다. 특성이 없는 "0"의 경우 $h_x$는 무작위로 샘플링된 데이터 instance 값에 매핑됩니다. 즉 Local Surrogate Model에 대한 설명변수는 0과 1로 이루어진 값이 되며, 반응변수는 이에 대한 예측값이 됩니다.

$X_C$는 특성이 없는 집합이고, $X_S$는 특성이 있는 집합이라고 합시다. Kernel SHAP에서는 $X_C$와 $X_S$를 서로 독립으로 취급하여 한계 분포(marginal distribution)에 대해 통합합니다.(해당 부분은 논문에선 확인하지 못했고, Interpretable Machine Learning을 참고한 것입니다.)

marginal distribution은 주변(확률) 분포라고도 합니다. 통계에서 말하는 결합(확률) 분포(join distribution)와 밀접한 관련이 있는 개념입니다.

한계 분포에서 표본을 뽑는다는 말은 특성이 있는 것과 없는 것 사이의 의존적인 관계를 무시함을 뜻합니다. 이런 관점에서 Kernel SHAP는 permutation을 기반으로 하는 해석 방법과 같은 문제를 겪습니다. 측정치는 일어날 가능성이 적은 instance에 너무 많은 가중치를 부여하게 되고, 이로 인해 최종 결과의 신뢰성이 떨어질 수도 있습니다.

하지만 샘플링은 결국 한계 분포에서 이루어져야 합니다. "0" 즉 특성이 없는 경우가 조건부 분포(conditional distribution)에서 샘플링된다면 이는 더 이상 Shapley value가 아닙니다. 결과값에 기여하지 않은 특성은 Shapley value가 0이어야 한다는 Missingness 를 만족하지 못하기 때문입니다.

LIME와 가장 큰 차이점은 회귀 모델에서의 관측치에 대한 가중치 부여 방식입니다. LIME는 관측치가 원본 데이터에 얼마나 가까운지에 따라 가중치를 매깁니다. 연합 벡터에 0이 많을수록, LIME의 가중치는 작아집니다. 이와 반대로, SHAP은 Shapley value 측정에서 연합 벡터가 얻은 가중치에 따라 샘플링된 관측치에 가중치를 부여합니다. 작은 연합(1이 거의 없는) 또는 큰 연합(1이 많은)이 큰 가중치를 얻게 됩니다.

이를 직관적으로 살펴보면 다음과 같습니다. 각 특성에 대해 고유한 영향력을 구할 수 있다면 매 특성마다 많은 특징을 파악할 수 있습니다.

작은 연합
- 연합이 단일(single) 특성으로 이루어져 있다면, 모델 예측에 끼치는 고유한 영향력을 명확히 알 수 있습니다.
- 연합의 모든 구성이 하나의 특성으로만 구성된 경우라면 해당 특성의 총 영향력(고유 영향력 + 특성 간 상관관계)을 알 수 있습니다. 

큰 연합
- 연합의 절반 이상 특성이 있는 경우 각 특성의 기여도에 대해 얻을 수 있는 정보가 적어집니다. 이런 상황에서도 한 특성이 모델 예측의 변화를 많이 가져올 수도 있습니다.

일정한 규칙을 따르는 가중치 부여를 위해, Lundberg 등은 아래의 SHAP kernel을 제안했습니다.

M: 최대 연합 크기
$|z'|$: 관측치 $z'$에 있는 0이 아닌 특성 수

Lundberg와 Lee는 위 커널을 사용한 회귀 직선이 Shapley values를 추정한다고 했습니다. 연합 데이터에 대해 SHAP kernel과 LIME를 함께 사용하면 LIME은 Shapley values를 추정할 수 있습니다. 

이제 데이터와 타겟값, 가중치를 가지고 아래의 식으로 가중 선형 회귀 모델을 만들 수 있습니다.

$g(z') = \phi_0 + \sum_{j=1}^M \phi_j z'_j$

그리고 해당 모델을 아래의 손실 함수 L로 최적화를 진행합니다.

$L(f, g, \pi_x) = \sum_{z' \in Z} [f(h_x(z')) - g(z')]^2 \pi_x(z')$

Z: 훈련 데이터
$\phi_j$: Shapley value

Tree SHAP

Tree Ensemble Model의 Feature importance는 모델(혹은 트리)마다 산출값이 달라지므로 일정하지 않다는(inconsistent) 한계점이 존재합니다.

Tree Model A와 B의 feature는 fever, cough로 동일하지만 쪼개진(split) 순서가 다릅니다. 위 그래프에서 오른쪽 부분을 보면 이에 따라 계산되는 Gain, Split Count 등의 산출값이 달라집니다. 다시 말해, 같은 데이터로부터 학습된 모델이지만 모델마다 Feature importance가 달라지는 것입니다.

Lundberg는 2018년, 트리 기반 모델(의사결정나무, 랜덤포레스트, 그레이디언트 부스트)을 위해 SHAP의 변형된 버전인 Tree SHAP를 발표했습니다.[각주:2] Tree SHAP는 split 순서와 무관하게 일정한(consistent) Feature importance를 계산할 수 있습니다. 

$E[f(x) | x_s] = x_s$가 속하는 리프 노드(leaf node)의 score 값 x 해당 노드에 속하는 데이터 비중

각 트리마다 조건부 평균 $E[f(x)|x_s]$를 구해, 다 더하여 최종 값을 산출하면 됩니다.

이런 Tree SHAP는 계산이 빠르며 모델에 특화 되어 Kernel SHAP의 대안으로 떠올랐으나, 이해하기 힘든 특성 기여분을 생성할 수도 있다는 한계점이 드러났습니다.

시간복잡도 차이: Tree SHAP -> $O(TL2^M)$
                          Kernel SHAP -> $O(TLD^2)$

Tree SHAP는 Shapley value를 구할 때 한계 평균 대신 조건부 평균을 사용합니다.

$E[f(x) | x_s]$

위에서 잠깐 언급했지만, 조건부 추정을 사용하면 예측에 영향력이 없는 특성도 0이 아닌 Shapley value를 얻을 수 있습니다. 또 반대로 실제 예측에 영향력을 가진 특성도 다른 특성과의 상관관계 때문에 Shapley value 값이 0이 될 가능성이 존재합니다.

다음 시간엔 마지막으로 파이썬에서 사용할 수 있는 SHAP 패키지를 살펴보며 예시를 통해 이해해보겠습니다.

참고
https://velog.io/@tobigs_xai/2%EC%A3%BC%EC%B0%A8-SHAP-SHapley-Additive-exPlanation
https://datanetworkanalysis.github.io/2019/12/24/shap2#fn:1
[DMQA Open Seminar] Model-Agnostic Interpretation Methods - YouTube
5.10 SHAP (SHapley Additive exPlanations) | Interpretable Machine Learning (christophm.github.io)
728x90
반응형