Python 연습장
shap 이론 본문
XAI 는 eXplainable AI 의 약자로, 결과가 짠하고 나오기만 하고 그 과정을 알아내기가 어려운(이걸 Blackbox 라고 표현한다) AI 모델을 해석해주는 알고리즘이라고 한다.
내가 현재까지 이해한 걸로는 feature importance 의 complex 하고 심화된 버전이라고 생각되고 아직까지는 feature importance / coefficient 가 더 직관적이고 단순해서 이해하기 쉽다.
XAI 알고리즘 중에서 가장 유명한 건 Shap 이다.
SHAP 은 SHapley Additive exPlanation 의 약자로 Game Theory 에 기초한다.
Game Theory 는 영화 뷰티풀 마인드에 나온 유명한 아저씨인 존 내쉬가 이 이론을 바탕으로 Nash Equilibrium 을 탄생시킨 걸로도 잘 알려져있다. 존 내쉬 이전, 천재 중의 천재라고 불리는 폰 노이만 아저씨가 발견한 내용이다.
(굳이 이런 설명을 덧붙이는 이유는 그냥 알아볼 때보다 유명한 사람들 이름이 보이니까 신기해서 더 잘 기억에 나기 때문이다. 속닥속닥)
Game Theory 를 간략하게 요약하면, 상호의존적인 의사결정에 대한 내용이다.
예시로는 그 유명한 죄수의 딜레마가 있다.
각각 다른 공간에 죄수 A와 B를 가둬놓고 회유한다.
A야, 말 안하면 감옥 1년인데 지금 자백하면 다 용서해주고 B만 10년 보낼게.
대신 B가 자백하면 너는 감옥 10년행이야. 둘다 자백하면 각각 5년씩.
A deny | A confess | |
B deny | 둘 다 1년 | A:석방 B:10년 |
B confess | A:10년 B:석방 |
둘 다 5년 |
이 때 최선의 선택은 둘다 침묵하고 자백하지 않는 것이지만 B와의 소통이 단절된 A는 고민한다.
만약 내가 말 안한다고 했을 때, B가 날 배신하면 10년이고, 배신하지 않으면 1년이네.
내가 말 한다고 했을 때, B가 날 배신하면 5년이고, 배신하지 않으면 석방이군.
동일 확률 가정하에 기대값으로만 봐도 말 한다고 봤을 때가 이득이 훨씬 크잖아? 자백해야지.
B도 같은 생각으로 자백하고 결론은 둘 다 5년 수감된다.
최선의 선택인 둘 다 침묵이 있는데도 둘 다 자백을 하게 되는 것, 이것이 죄수의 딜레마다.
shap 의 관점에서 예시를 들어보자.
(김성범 교수님 유튜브 강의를 참고했다. 이것보다 쉽게 설명한 강의가 없다. 교수님 감사합니다.)
A,B,C,D 학생이 시험을 봤는데 100점이다.
그 다음 시험은 B,C,D 학생만 시험을 봤고 점수는 20점,
그 다음 시험은 A,C,D 학생 : 80점, A,B,C : 99점, A,B,D : 70점
여기서 main feature 는 참가 여부에 따라 점수가 80점이나 달라지는 A 이다.
이번엔 2명이서만 시험을 본다.
A와 B만 시험을 봤는데 90점이 나오고, A와 C만 시험을 보면 50점이다.
A의 영향력이 80인줄 알았는데 C만 보면 스트레스받는건지 80이 안나온다.
이 시험에 대한 A의 진짜 영향력은 얼마라고 할 수 있을까?
아래 예시로 그걸 구하는 방법을 알아보자.
[ Reference Table ]
Case | X1 | X2 | X3 | Pred |
1 | X | X | X | 28 |
2 | O | X | X | 32 |
3 | X | O | X | 31 |
4 | X | X | O | 30 |
5 | O | O | X | 32 |
6 | O | X | O | 33 |
7 | X | O | O | 32 |
8 | O | O | O | 35 |
변수 3가지 X1, X2, X3 가 있고 변수 포함여부에 따라 예측값을 정리한 테이블이다.
여기서 X1의 shapley value 를 알아보자.
X1 단독의 기여도를 보기 위해서 X2, X3 의 존재 여부가 같고 X1 의 포함여부만 다른 Case를 비교하여 Pred 값의 차를 알아본다.
[X1 (under X2 x X3 x) ] : Case2 - Case1 = 32 - 28 = 4
Case | X1 | X2 | X3 | Pred |
1 | X | X | X | 28 |
2 | O | X | X | 32 |
[X1 (under X2 o, X3 x) ] : Case5 - Case3 = 32 - 32 = 1
Case | X1 | X2 | X3 | Pred |
3 | X | O | X | 31 |
5 | O | O | X | 32 |
[X1 (under X2 x, X3 o) ] : Case6 - Case4 = 33 - 30 = 3
Case | X1 | X2 | X3 | Pred |
4 | X | X | O | 30 |
6 | O | X | O | 33 |
[X1 (under X2 o, X3 o) ] : Case8 - Case7 = 35 - 32 = 3
Case | X1 | X2 | X3 | Pred |
7 | X | O | O | 32 |
8 | O | O | O | 35 |
여기서 prediction 값의 차이를 그냥 사용하는 게 아니라 변수가 사용될 확률을 곱해준다.
첫번째로 살펴봤던 Case2 에서는 X1만 사용되었는데,
이렇게 변수가 1개만 사용되는 경우는 총 Case2,3,4 총 3가지 케이스다.
따라서 1/3 의 가중치를 곱해준다.
[X1 (under X2 x X3 x) ] : Case2 - Case1 = 4
Case | X1 | X2 | X3 | Pred |
1 | X | X | X | 28 |
2 | O | X | X | 32 |
3 | X | O | X | 31 |
4 | X | X | O | 30 |
4 * 1/3
변수가 2개 사용되는 경우는 X1,X2 X1,X3 X2,X3 이렇게 3가지다.
여기서 X1,X2 가 사용된 Case5와 Case3을 비교해보자.
Case | X1 | X2 | X3 | Pred |
2 | O | X | X | 32 |
3 | X | O | X | 31 |
5 | O | O | X | 32 |
비교 케이스로 X1만 있는 Case2, X2만 있는 Case3 까지
각각의 묶음(X1,X2 X1,X3 X2,X3) 에 대하여 2가지 경우가 더 생긴다. -> 총 6가지 경우고, 가중치는 1/6 이 된다.
아래는 변수가 2가지일 때의 비교값 이므로 둘다 1/6의 가중치를 곱해준다.
[X1 (under X2 o, X3 x) ] : Case5 - Case3 = 1
Case | X1 | X2 | X3 | Pred |
3 | X | O | X | 31 |
5 | O | O | X | 32 |
[X1 (under X2 x, X3 o) ] : Case6 - Case4 = 3
Case | X1 | X2 | X3 | Pred |
4 | X | X | O | 30 |
6 | O | X | O | 33 |
(1+3) * 1/6
변수 3개를 사용하는 경우는 심플하다.
Case 8과 같이 1가지 케이스이고, 거기서 2가지 변수가 있는 3가지 경우(X1,X2 X1,X3 X2,X3)까지 고려하면 가중치는 1/3이다.
[X1 (under X2 o, X3 o) ] : Case6 - Case4 = 3
Case | X1 | X2 | X3 | Pred |
7 | X | O | O | 32 |
8 | O | O | O | 35 |
3* 1/3
이제까지 계산한 변수 개수에 따른 경우들의 shapley value 를 합산하면,
4 * 1/3 + (1+3) * 1/6 + 3* 1/3 = 3
즉, X1 의 Shapley value 는 3이다.
같은 방식으로 X2 의 shapely value 를 구하면 2 이고, X3 의 shapely value 도 2로, X1 의 기여도가 가장 높다고 할 수 있다.
여기서 재밌는 점은 모든 shapely value의 합은 max pred(case8, 35) - min pred(case1, 28) = 7 이라는 것이다.
위에서 설명한 예시는 변수의 유무 기준으로만 단순하게 나타낸 것인데 모든 데이터가 one hot encoding 되었을 때에만 저런 케이스가 적용될 것 같다.
실제로 주로 사용하는 데이터는 연속형 숫자 데이터 혹은 ordinal 값이 feature로 사용되기 때문에 실제 shapley value 는 어떻게 계산하는지 궁금했다. (그리고 많은 shap graph 들을 보면 feature 별로 shapley value 값이 1개가 아니라 여러 range 에 걸쳐 분포해있다)
만약 X1 이 a,b,c 이라는 데이터를 가지고 있고, X2 가 d,e,f 의 값을 가지고 있다고 하자. (a~f 는 numeric 가정)
X1의 a value 에 대해서 기여도를 계산하려면 아래와 같은 수식을 참고하면 된다.
f(X1 =a, X2 = mean(d,e,f)) - f(X1 = mean(a,b,c), X2= mean(d,e,f))
여기서 개별 data 수가 늘어나고, 변수가 늘어나는 만큼 value 값은 더 많아 지고 복잡해진다.
실제로 shap value 를 파이썬에서 계산해보면 X shape 그대로 나온다. 즉 각 변수별 데이터 별로(column별로 row별로 개별데이터값 하나하나) 계산한다는 의미고, 그렇기 때문에 계산량이 많아 데이터셋이 큰 경우는 메모리를 많이 잡아먹어서 계산을 못하는 경우도 있다.
하나의 feature 에 해당하는 shap value 가 data 개수만큼 있기 때문에 shap의 bar plot에서는 mean(⎜shap values⎜) 로 수치를 단순화해서 나타내준다.
이 때 드는 의문이 있었다.
내가 많이 사용해본건 아니지만 y 값이 0,1 로 구성된 binary classication 에서 shap dependence plot 을 그려보면 -1이 넘거나 1이 넘는 shapley value 들이 있었다. y max 값이 1인데 이게 어떻게 가능한 거지?
역시 구글링 해보니 나랑 똑같은 질문을 slundberg 에 물어본 사람이 있었고, xgb 에서 prediction 하는 값이 logit 값이기 때문이라고 했다. (xgb 이외에 다른 알고리즘에 대해서는 shap 적용을 안해봐서 다른 알고리즘은 y값을 뭘로 뱉어내는지 모르겠다.)
모든 분류 알고리즘의 기본인 logistic regression의 기본 개념인 logit 을 알아보자.
odds = p/(1-p) ※ p는 확률로 0~1 사이의 값을 가진다
logit = log(odds) = log p/(1-p)
odds 는 0~1 사이의 값을 가지며 logit 은 -inf, inf 의 값을 가지게 되니 logit 변환한 값이라면 당연히 기존 y range 를 초과하는 값이 나올 수 있다.
그럼 xgb 는 왜 logit 으로 출력할까? 이거는 다음에 알아보도록하고 shap 은 여기서 이론을 마친다.
다음에 shap을 다룰 때에는 코드로 실습해보겠다.
'코딩' 카테고리의 다른 글
CPU 코어 수 확인 파이썬 코드 (0) | 2022.08.09 |
---|---|
다시 jupyter 로... (0) | 2022.06.16 |
clustering - kmeans (0) | 2022.03.21 |
pycaret 개요 & classification (0) | 2022.03.20 |
shap 의 colormap 으로 colorbar 그리기 (0) | 2022.03.14 |