소개
머신 러닝 알고리즘(랜덤 포레스트, xgboost, 딥 러닝 등)을 활용한 복잡한 예측 모델은 해석하기 쉽지 않죠.
예를 들어, 부도 발생 가능성이 90%인 것과 같은 특정 예측(확률 값)이 주어지면
해당 값을 얻기 위한 각 입력 변수의 영향은 무엇입니까?
최근 이러한 블랙박스 모델을 해석하는(Explainable AI) 기술이 많이 발전하고 있어요.
그중 하나가 바로 Scott M. Lundberg가 개발한 SHAP(SHapley Additive exPlanations)이에요.
판매 점수 모델이라는 것을 한번 생각해 볼까요?
우편번호 "A1"에 거주하는 고객이 "10개 구매"로 점수가 95%이고,
다른 우편번호 "A2" 및 "7개 구매"에 있는 고객의 점수는 60%라고 가정하죠.
우선, 각 변수는 최종 점수에 영향을 끼쳤을 거예요.
구매 횟수가 조금만 변경돼도 점수는 많이 변경되는 반면,
우편 번호를 변경하면 해당 특정 고객에게 약간의 변경만 발생할 수 있어요.
SHAP는 다른 변수와의 상호작용을 고려하여 변수의 영향을 측정하게 돼요.
Shapley value는 모델에 특정 변수가 있는 경우와 없는 경우를 비교하여 변수의 중요도를 계산합니다. 그러나 모델이 변수를 보는 순서는 예측에 영향을 줄 수 있으므로, 변수를 공정하게 비교하기 위해서 가능한 모든 순서로 수행하여 변수가 공정하게 비교됩니다.
데이터에서의 SHAP value
원본 데이터에 200개의 행과 10개의 변수가 있으면, SHAP value 테이블도 동일한 차원(200 x 10)을 갖습니다.
입력 데이터의 원래 값들은 SHAP value로 대체되지만, 모든 열에 대해 동일한 값으로 교체가 되는 건 아니에요.
예를 들어, "10번의 구매" 값이 고객 1의 값 0.3으로 대체될 수 있지만,
고객 2의 경우 0.6(0.3과 다른 값)으로 대체될 수 있어요.
이러한 변경은 해당 고객의 변수가 다른 변수와 상호 작용하는 방식 때문이에요.
변수는 그룹으로 작동하고 전체를 설명합니다.
SHAP value는 다음을 수행하여 얻을 수 있어요.
shap_values <- predict(xgboost_model, input_data, predcontrib = TRUE, approxcontrib = F)
R에서의 예제
xgboost 모델을 생성한 후 대여 자전거 데이터 세트에 대한 shap 요약을 그래프로 표현할 수 있어요.
대상 변수는 특정 날짜의 임대료 수입니다.
(아래 플롯 산출 원천: plot.shap.summary 함수 (from the github repo))
shap 요약 플롯을 어떻게 해석할 수 있을까요?
- y축은 위에서 아래로 중요도 순으로 변수 이름을 나타내고, 그 옆에 있는 값은 평균 SHAP value입니다.
- x축에는 SHAP value가 있습니다. log-odds의 변경 정도를 나타내고. 이 숫자에서 성공 확률을 추출할 수 있습니다.
- 그라데이션 색상은 해당 변수의 원래 값을 나타냅니다. 부울에서는 두 가지 색상을 사용하지만 숫자로는 전체 스펙트럼을 포함할 수 있습니다.
- 각 점은 원본 데이터 세트의 행을 나타냅니다.
bike 데이터 세트로 다시 돌아가면, 대부분의 변수는 부울 형태예요.
습도가 높으면 Target에 대한 높고, 음수인 값과 관련이 있음을 알 수 있죠.
높은 값은 색상으로, 음수는 x 값으로부터 알 수 있어요.
즉, 습도가 높으면 사람들은 자전거를 덜 빌리게 된다는 사실을 알아낼 수 있어요.
Season.FALL이 높으면(또는 true) shap 값이 높아요. 사람들은 가을에 더 많은 자전거를 빌립니다.
이것은 매우 합리적인 결과임을 알 수 있어요.
xgboost 패키지로부터의 Shap summary
xgboost 패키지의 xgb.plot.shap 함수는 아래 플롯을 제공해요.
- y축: SHAP value
- x축: 원본의 데이터 값(참고로, 각 파란색 점은 행입니다.)
temp 변수를 보면 더 낮은 온도가 shap 값의 큰 감소와 관련이 있음을 알 수 있어요.
22-23 부근에서 곡선이 다시 감소하기 시작한다는 점이 흥미롭네요.
완벽한 비선형 관계네요.
mnth.SEP를 취하면 0 주변의 분산이 거의 0인 반면,
값 1은 주로 200 주변의 shap 증가와 관련이 있고,
또한 shap 값을 400 이상으로 올릴 수 있는 특정 날도 있네요.
mnth.SEP는 동일한 값(1)에 대해서도 shap value가 많이 다를 수 있다는 것으로 보여 주는데요.
이는 다른 변수와의 상호 작용이 있다는 좋은 예예요.
SHAP value에 관련 참고 문헌
이 방법론에 대한 자료는 굉장히 많아요.
Christoph Molnar의 온라인 책 Interpretable Machine Learning.
(Model-Agnostic Methods와 Shapley 값의 특정 사례 중 하나를 멋지게 설명합니다.)
고전적인 변수에서 가중치 및 증가와 같은 순위 접근 방식에서 가치 형성: Interpretable Machine Learning with XGBoost by Scott Lundberg
A permutation perspective with examples:
One Feature Attribution Method to (Supposedly) Rule Them All: Shapley Values.
'Machine Learning > Explainable AI' 카테고리의 다른 글
SHAP value에 대한 간단한 소개(with Python) (0) | 2022.01.02 |
---|
댓글