이번 포스팅에서는 SHAP Value 에 대해서 알아보겠습니다.
“공정한 게임에서는 모든 사람이 승리에 기여한 공로를 인정받아야 한다”는 말을 들어보셨을 겁니다. SHAP Value 는 바로 그 생각에 기반을 두고 있습니다. 게임 이론에서 유래한 SHAP(SHapley Additive exPlanations)는 머신 러닝 분야에서 널리 사용되고 있습니다.
SHAP Value 를 사용하면 머신 러닝 알고리즘의 결과값을 예측하는 데 사용된 피처에 대한 “공정한(fair)” 기여도를 할당하여 머신 러닝 모델의 설명력을 분석할 수 있습니다.
따라서 머신 러닝을 사용하여 고객 이탈을 예측하거나 건강 상태를 진단하는 경우 SHAP Value 는 해당 예측을 주도하는 피쳐가 정확히 무엇인지 알려줍니다.
SHAP Value 중요성
머신 러닝 모델은 블랙박스와 같습니다. 정확한 결과를 제공하지만, 결과에 대해 합리적으로 설명하지 못한다는 단점이 있습니다. 이러한 단점을 해결하기 위한 하나의 수단이 SHAP Value입니다.
오늘날의 AI 중심 세계에서 투명성과 설명 가능성은 더 이상 있으면 좋은 것이 아니라 반드시 있어야 합니다. 특히, 딥 러닝과 그래디언트 부스팅과 같은 앙상블 방법을 통해 모델이 더욱 복잡해짐에 따라, 결과에 대한 신뢰를 구축하려면 설명 가능한 모델이 필요합니다.
여러분이 의료 산업에 종사하고 있고 모델이 환자의 질병에 대한 높은 위험을 예측한다고 상상해 보세요. 환자는 당연히 그 이유를 알고 싶어 하지 않을까요?
SHAP Value는 피쳐 기여에 대한 통찰력을 제공함으로써 모델을 더 투명하고, 신뢰할 수 있게 만듭니다.
SHAP Value 활용 사례
의료 분야에서 SHAP Value 는 환자가 질병에 걸릴 위험이 있는 이유를 설명하여 의사가 더 정보에 입각한 결정을 내리는 데 도움이 될 수 있습니다.
금융 분야에서 SHAP Value 는 신용 점수에 영향을 미치거나 사기 탐지 모델을 트리거하는 요인을 알려줄 수 있습니다.
법률 기술에서도 SHAP Value 는 자동화된 의사 결정의 뉘앙스를 설명하는 데 도움이 될 수 있으며, 이는 GDPR과 같은 새로운 규정으로 인해 점점 더 중요해지고 있습니다.
어느 분야에서든 예측 모델을 사용하는 데 있어, SHAP Value는 알고리즘 내부에서 무슨 일이 일어나고 있는지 이해하기 쉽게 해주는 유용한 도구입니다.
SHAP Value : 개념에 대한 심층 분석
게임 이론에서의 Shapley Value
재밌는 비유를 하나 들어보겠습니다. 퍼즐을 풀려고 하는 팀의 일원이 있습니다. 팀원의 퍼즐 풀이에 대한 기여도는 다릅니다. 누군가는 중요한 조각을 제공하고, 또 어떤 사람은 작은 퍼즐 조각을 제공합니다.
하지만 결국에는 모든 사람이 퍼즐 완성에 기여한 것에 대한 평가는 공정해야 하지 않을까요?
이것이 게임 이론에서 나온 Shapley Value의 기본 아이디어입니다. Shapley Value는 각 플레이어(또는 우리의 경우 머신 러닝 모델의 피쳐들)에게 개별 기여도에 따라 총 보상(또는 예측 결과)의 공정한 몫을 제공합니다.
이를 통해 단일 피쳐가 마땅히 받아야 할 것보다 더 많은 크레딧을 받지 않고, 어떤 피쳐도 소외되지 않습니다.
Shapley Values에서 SHAP로
SHAP은 공정한 기여라는 아이디어를 머신 러닝에 적용합니다. 머신 러닝 모델은 종종 피처 간의 복잡한 상호 작용을 수반합니다. SHAP는 본질적으로 Shapley Value에서 아이디어를 빌려와 선형, 트리 기반 또는 신경망 등 모든 모델에서 예측을 설명하는 데 적용하는 통합 프레임워크입니다.
모든 피처에 특정 예측에 얼마나 기여했는지에 대한 점수표를 제공하는 것과 같습니다.
실제로 SHAP은 LIME(Local Interpretable Model-agnostic Explanations) 및 DeepLIFT와 같은 여러 해석 방법을 통합하여 일관된 방식으로 모델 결과값을 설명하는 데 강력합니다.
Additive Feature Attribution Methods
SHAP는 단순히 해석을 위한 또 다른 도구가 아닙니다. 견고한 수학적 원리에 기반을 두고 있습니다. SHAP을 돋보이게 하는 것은 가산적 특성 귀속 방법(Additive Feature Attribution Methods)을 사용한다는 것입니다.
즉, 결과값을 각 피쳐의 기여도 합계로 분해합니다. 피쳐의 기여도를 모두 합하면 모델의 출력과 정확히 일치합니다.
간단한 분석은 다음과 같습니다. 머신 러닝 모델이 주택 가격을 500,000달러로 예측했다고 가정해 보죠. SHAP은 그 중 200,000달러는 주택의 위치에서, 100,000달러는 크기에서, 50,000달러는 나이에서 나온다고 알려줍니다.
그리고 이러한 기여도를 모두 합하면 최종 예측에 정확히 일치한다는 것입니다. 이러한 수학적 일관성은 SHAP 값을 다른 해석 가능성 방법과 비교했을 때 매우 신뢰할 수 있게 만드는 것입니다.
다른 해석 가능한 방법론에서는 기여도의 합산이 항상 모델의 예측과 완벽하게 일치하지 않을 수 있습니다.
SHAP 작동 방식
Feature Importance
SHAP는 어떤 피쳐가 중요한지에 대해 정확하게 설명합니다. 각 피쳐가 예측에 얼마나 기여했는지 정확히 보여줍니다.
고객의 이탈 가능성을 예측하는 모델이 있다고 가정해 보겠습니다. SHAP은 “고객이 월 이용료가 높았다는 사실이 이탈 예측에 30%의 가능성을 더했지만, 장기 계약은 15%를 줄였습니다.”와 같은 내용을 알려줍니다.
이 수준의 세부성은 예측이 무엇인지가 아니라 특정 예측이 이루어진 이유를 알 수 있기 때문에 매우 유용합니다.
글로벌 해석성 vs 로컬 해석성
모델을 글로벌하게 이해하는 것과 지역적으로 해석하는 것의 차이점은 무엇일까요? SHAP은 두 가지 측면 모두를 지원합니다.
- 글로벌 해석 가능성
- 모델의 동작을 전체적으로 이해하는 것입니다. 모든 예측에서 일반적으로 가장 중요한 피쳐를 알 수있습니다. SHAP은 모델을 조감도로 볼 수 있도록 도와줍니다. 예를 들면, 대출 승인 모델에서 SHAP은 모든 예측에서 “소득”이 가장 영향력 있는 요소이고, 그 다음이 “신용 점수”라고 알려줄 수 있는 것입니다.
- 지역적 해석 가능성
- 반면, 지역적 해석 가능성은 확대에 관한 것입니다. 이는 모델이 왜 이 특정 예측을 했는가라는 질문에 답합니다. 예를 들어, 모델이 특정 고객의 대출 승인 불가 판정을 내렸다면, SHAP은 해당 고객에 대한 각 피쳐의 정확한 기여도를 분석하여 해당 고객에서 예측이 이루어진 이유를 설명해 줍니다.
이 두 가지 기능이 SHAP의 차별화 요소입니다. 모델에 대한 전반적인 설명과 단일 예측에 대한 설명 모두 가능합니다.
계산 예시
주택 가격을 예측하는 의사결정 트리와 같은 간단한 모델을 살펴보겠습니다. 모델에 의해 특정 주택이 50만 달러에 팔릴 것이라고 예측했다고 가정해 보겠습니다.
SHAP에서 이를 분석한 내용은 다음과 같습니다.
- 집이 부유한 동네에 있다는 사실은 예측에 +$200,000을 더합니다.
- 집의 크기는 또 다른 +$100,000을 더합니다.
- 그러나 집의 설립연도는 주택가격을 -$50,000 낮춥니다.
- …
각 피쳐의 기여도 합산은 모델의 최종 예측인 $500,000과 정확히 일치합니다. 이것이 우리가 지역적 정확도라고 부르는 것이며, SHAP의 특징 중 하나입니다.
시각화
시각적으로 표현하는 방법은 없을까요? SHAP에는 이러한 설명을 매우 명확하게 만들어 줄 강력한 플롯 차트가 있습니다.
- 요약 플롯(Summary Plot): 전체 데이터 세트에서 각 피쳐의 중요도를 보여줍니다. 히트맵으로 모델을 구동하는 요소에 대한 빠른 스냅샷을 제공합니다.
- 폭포 플롯(Waterfall Plot): 단일 예측에 대한 각 피쳐의 기여도를 분석합니다. 마치 폭포를 보는 것과 같으며, 각 단계에서 최종 결정이 어떻게 내려졌는지 설명합니다.
- 힘 플롯(Force Plot): SHAP Value가 예측을 어떻게 높이거나 낮추는지 보여주는 동적 시각 자료로, 각 피쳐의 영향을 직관적으로 느낄 수 있습니다.
환자가 심장병에 걸릴 위험이 있는지 예측하는 모델이 있다고 가정해 보겠습니다. 힘 플롯은 환자의 높은 콜레스테롤 수치가 예측을 “고위험”으로 밀어붙이는 반면, 활동적인 라이프스타일은 예측을 “저위험”으로 끌어당기는 것을 보여줄 수 있습니다. 이는 피쳐 간의 줄다리기이며, 누가 이기고 있는지 확인할 수 있습니다.
SHAP Value 종류
SHAP는 모든 머신 러닝 알고리즘에 맞는 도구가 아닙니다. 적용하는 알고리즘 모델에 따라 SHAP는 다양하며, 각각은 특정 유형의 머신 러닝 모델에 맞게 조정됩니다.
Kernel SHAP
Kernel SHAP은 SHAP의 가장 유연한 버전입니다. 블랙박스 신경망, 랜덤 포레스트 또는 단순 선형 회귀 등 어떤 모델과도 작동할 수 있습니다.
Kernel SHAP은 샘플링 기술을 사용하여 모델을 “블랙박스”로 취급하여 SHAP 값을 추정합니다. 모델의 내부 구조에 대해 아무것도 알 필요가 없으므로 다른 방법으로는 설명하기에 모델이 너무 복잡한 알고리즘에 적합합니다.
하지만 트레이드오프가 있습니다. Kernel SHAP는 피쳐 기여도를 추정하기 위해 많은 수의 조합을 샘플링해야 하기 때문에 계산 비용이 많이 들 수 있습니다. 방대한 데이터 세트나 매우 복잡한 모델이 있는 경우 느릴 수 있습니다.
Tree SHAP
XGBoost나 LightGBM과 같은 트리 기반 모델에 적합합니다. 모델을 블랙박스로 취급하는 Kernel SHAP과 달리 Tree SHAP은 의사결정 트리의 구조를 활용하여 SHAP 값을 효율적으로 계산합니다.
Tree SHAP은 체크해야 할 조합의 수를 줄이기 위한 트릭을 사용하기 때문에 트리 기반 모델에서 매우 빠릅니다. 따라서 의사결정 트리로 작업하는 경우 Tree SHAP을 바로 선택합니다.
고객의 대출 승인 불가 가능성을 예측하는 모델이 있다고 가정해 보겠습니다. Tree SHAP을 사용하면 전체 데이터 세트의 모든 피쳐에 대한 SHAP Value를 Kernel SHAP에 걸리는 시간의 일부로 계산할 수 있습니다. 속도 면에서 큰 이점이 있습니다.
Deep SHAP
신경망과 같은 딥 러닝 모델은 강력하지만 해석이 매우 어렵습니다. 바로 여기서 Deep SHAP이 등장합니다. SHAP의 아이디어와 DeepLIFT(딥 모델을 위한 또 다른 해석 방법)를 결합하여 딥 러닝 모델을 위해 특별히 설계되었습니다.
Deep SHAP은 신경망의 여러 계층이 최종 출력에 어떻게 기여하는지 이해하는 데 도움이 됩니다. 특히 피쳐 간에 복잡한 비선형 관계가 있는 모델을 다룰 때 유용합니다.
예를 들어, 신경망을 사용하여 누군가가 당뇨병에 걸릴 가능성을 예측하는 경우 Deep SHAP은 각 피쳐(예: 나이, 혈당 수치 또는 BMI)가 예측에 어떤 영향을 미치는지 분석할 수 있습니다.
Gradient SHAP
모델이 그래디언트 부스팅 방법이나 딥 러닝 모델처럼 그래디언트에 크게 의존하는 경우 Gradient SHAP을 사용합니다. SHAP을 예상 그래디언트와 결합하여 더욱 정교한 설명을 제공합니다.
복잡한 딥 러닝 모델을 사용하여 이미지를 분류한다고 가정해 보겠습니다. 그래디언트 SHAP은 픽셀 값(그래디언트)의 미세한 변화가 예측 결과에 어떤 영향을 미치는지 이해하는 데 도움이 됩니다.
모델의 구조만 넘어서서 입력의 미세한 변화가 예측에 미치는 영향을 깊이 파고들고 싶을 때 특히 유용합니다.
SHAP의 주요 이점
일관성
SHAP 맥락에서 일관성은 무엇을 의미할까요? 특정 피쳐를 기반으로 예측을 하는 모델이 있습니다. 이제 그 피쳐 중 하나를 더 해석하기 쉽게 만들거나 표현 방식을 변경하기로 결정했다고 가정해 보겠습니다. SHAP를 사용하면 예측에 대한 해당 피처의 기여도가 그에 따라 조정됩니다.
다시 말해, 피쳐의 명확성이나 관련성을 강화하면 SHAP은 해당 변경 사항을 반영하여 그 중요성을 보장해 줍니다. 즉, 오해의 소지가 있는 해석에 대해 걱정할 필요가 없습니다.
SHAP는 모든 피쳐가 실제 영향에 따라 적절하게 인정되는 일관된 프레임워크를 유지합니다. 이는 신뢰를 구축하는 데 매우 중요하며, 특히 이해 관계자나 규제 기관에 통찰력을 전달할 때 더욱 그렇습니다.
지역 정확도(Local Accuracy)
SHAP의 특징 중 하나인 지역적 정확도에 대해 이야기해 보겠습니다. SHAP은 모델 출력이 각 피쳐에 대한 개별 SHAP 값의 합이 되도록 합니다. 이는 우리가 “충실한 설명”이라고 부르는 것으로 자연스럽 이어집니다.
금융기관의 대출 승인 여부를 예측하는 모델이 있다고 가정해 보겠습니다. SHAP을 사용하면 모델의 결과값이 80점이 나왔다면 소득, 신용 점수, 기존 부채와 같은 모든 피쳐의 기여도 합계가 80점이 됩니다.
이처럼 각 피쳐에는 특정 SHAP Value가 있으며 이를 합산하면 80점이 됩니다. 이 수학적 속성은 예측을 얻는 데 그치지 않고 예측이 어떻게 이루어졌는지에 대한 투명한 분석을 얻는다는 것을 보장합니다.
모델에 구애받지 않음(Model-Agnostic)
SHAP는 다양한 유형의 머신 러닝 모델에서 작동하기 때문에 매우 다재다능합니다. 선형 회귀, 의사결정 트리 또는 복잡한 신경망을 사용하든 SHAP는 모델과 원활하게 통합되어 설명을 제공할 수 있습니다.
이는 특히 여러 작업에 여러 모델을 사용하는 환경에서 게임 체인저입니다. 각 모델에 대한 새로운 해석 방법을 배우는 대신, 전반적으로 SHAP의 일관된 접근 방식을 사용할 수 있습니다.
이를 통해 시간을 절약하고 워크플로를 개선하여 가장 중요한 것, 즉 모델의 예측에 따라 정보에 입각한 의사 결정에 집중할 수 있습니다.
시각화의 힘
SHAP의 뛰어난 기능 중 하나는 시각화입니다. SHAP은 모델 동작과 피쳐 중요도를 더 쉽게 이해할 수 있도록 다양한 플롯을 제공합니다.
다른 해석 방법과의 비교
SHAP vs LIME
SHAP을 다른 해석 가능한 방법론과 비교하는 핵심을 살펴보겠습니다. 모델 예측을 설명하는 것을 목표로 하는 LIME(Local Interpretable Model-agnostic Explanations)에 대해 들어보셨을 것입니다.
SHAP을 LIME보다 선호하는 데에는 몇 가지 이유가 있습니다.
첫째, SHAP는 더 안정적입니다. 사용된 샘플링 프로세스와 관계없이 일관된 설명을 생성합니다.
LIME의 경우 샘플이 추출되는 방식에 따라 결과가 상당히 달라질 수 있으며, 이는 혼란과 오해로 이어질 수 있습니다.
게다가 SHAP는 샘플링 분산을 완전히 제거합니다. LIME의 접근 방식에서 나타나는 무작위성 없이 피쳐 기여에 대한 포괄적인 관점을 제공합니다. 신뢰성과 명확성을 찾고 있다면 SHAP이 최선의 선택입니다.
SHAP vs Feature Permutation
피처 순열 방법(Feature Permutation)에 대해 이야기해 보겠습니다. 이러한 방법은 피쳐의 값을 무작위로 섞었을 때 모델의 성능이 어떻게 변하는지 측정하여 피처 중요도를 평가합니다. 간단한 접근 방식이기는 하지만 몇 가지 단점이 있습니다.
피처 순열의 문제점은, 피처가 상관관계가 있는 경우, 오해의 소지가 있는 결과를 제공할 수 있다는 것입니다. 반면, SHAP는 상호 작용에 관계없이 각 피쳐에 대한 정확한 기여도를 제공하여 보다 미묘한 관점을 제공합니다.
즉, SHAP를 사용하면 피쳐가 어떻게 함께 작동하는지에 대한 보다 정확한 그림을 얻을 수 있어 더 깊은 통찰력을 얻을 수 있습니다.
SHAP vs Partial Dependence Plots (PDPs)
마지막으로 SHAP를 부분 의존도 플롯(Partial Dependence Plots, PDP)과 비교해 보겠습니다. PDP는 데이터 세트 전체에서 피쳐가 예측에 어떤 영향을 미치는지에 대한 전반적인 관점을 제공하지만, 지역적 맥락을 놓치기도 합니다. PDP는 효과를 평균화하고 때로는 피쳐 간의 중요한 상호 작용을 가릴 수 있습니다.
반면, SHAP는 지역적 설명을 제공하여 피처가 개별 예측에 어떤 영향을 미치는지에 대한 통찰력을 제공합니다. 이는 특히 의료 또는 금융과 같은 고위험 환경에서 특정 사례를 이해해야 할 때 필수적입니다. SHAP를 사용하면 광범위한 개요를 얻는 것이 아니라 중요한 정확한 통찰력을 얻게 됩니다.
실제 구현
SHAP 라이브러리 및 도구
SHAP를 활용 시 어디서부터 시작해야 할지 궁금할 수 있습니다. 다행히도 이 과정을 쉽게 만들어주는 훌륭한 라이브러리와 도구가 몇 가지 있습니다.
- Python의 SHAP 라이브러리: SHAP 값에 전념하는 가장 포괄적인 라이브러리입니다. 다양한 모델에서 SHAP 값을 계산하는 함수를 제공하며 풍부한 시각화 도구 세트와 함께 제공됩니다.
- XGBoost의 기본 제공 SHAP: 머신 러닝 모델에 XGBoost를 사용 중이라면, SHAP에 대한 기본 제공 지원이 있어 큰 어려움 없이 SHAP 값을 쉽게 추출할 수 있습니다.
- LightGBM: XGBoost와 유사하게 LightGBM도 SHAP 값에 대한 기본 지원을 제공하여 그래디언트 부스팅 모델에서 SHAP 설명을 활용할 수 있습니다.
이러한 도구를 사용하면 SHAP을 기존 워크플로에 쉽게 통합할 수 있으므로 복잡한 구현에 얽매이지 않고 통찰력을 얻는 데 집중할 수 있습니다.
단계별 튜토리얼
이제 Python에서 SHAP을 구현하는 방법에 대한 간단한 튜토리얼을 살펴보겠습니다.
1단계: 먼저 SHAP 라이브러리를 설치해야 합니다. pip를 사용하여 쉽게 할 수 있습니다.
pip install shap
2단계: Iris 데이터 세트를 사용하여 간단한 예제를 설정해 보겠습니다. 결정 트리 분류기를 훈련한 다음 SHAP 값을 생성하는 방법을 보여드리겠습니다.
import shap
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
# 데이터 세트 로드
iris = load_iris()
X = pd.DataFrame(iris.data, columns=iris.feature_names)
y = iris.target
# 모델 훈련
model = DecisionTreeClassifier()
model.fit(X, y)
# SHAP 설명자 초기화
explainer = shap.TreeExplainer(model)
# SHAP Value 계산
shap_values = explainer.shap_values(X)
# SHAP Value 시각화
shap.summary_plot(shap_values, X)
이 코드는 Iris 데이터세트를 기반으로 의사결정 트리 분류기를 훈련하고, SHAP 값을 계산하고, 요약 플롯을 만들어 피쳐 중요도를 시각화합니다.
효율적인 SHAP 사용을 위한 팁
SHAP 경험을 더욱 원활하게 만들기 위한 몇 가지 모범 사례를 살펴보겠습니다.
- 대규모 데이터 세트에 대한 근사 방법 사용: 방대한 데이터 세트로 작업하는 경우 SHAP 값을 계산하는 것은 계산 집약적일 수 있습니다. 속도를 높이려면 shap.sample 함수와 같은 근사 방법을 사용하는 것을 고려해 볼 필요가 있습니다. 이를 통해 데이터 하위 세트를 샘플링하여 SHAP 값을 더 빠르게 계산할 수 있습니다.
- 일괄 처리: 대규모 데이터 세트를 처리할 때는 일괄 처리로 데이터를 처리하는 것을 고려할 수 있습니다. 메모리 사용량과 계산 부하를 보다 효과적으로 관리할 수 있습니다.
- 효과적인 시각화: SHAP의 시각화 기능은 강력합니다. 요약 플롯, 강제 플롯, 폭포 플롯을 활용하여 결과를 명확하고 간결하게 표현합니다. 이를 통해 이해에 도움이 될 뿐만 아니라 결과를 다른 사람에게 전달하기도 더 쉬워집니다.
이러한 팁을 구현하면 SHAP 계산의 효율성을 높일 뿐만 아니라 결과의 명확성도 향상됩니다.
결론
SHAP Value에 대한 탐색을 마무리하면서, SHAP Vauerk 머신 러닝 모델의 예측을 이해하고 해석하기 위한 강력한 프레임워크를 제공한다는 것이 분명해졌습니다.
일관성과 지역적 정확성을 보장하는 것부터 모델에 독립적인 통찰력을 제공하는 것까지, SHAP는 복잡한 알고리즘의 계층을 벗겨내고 예측의 배후에 있는 진실을 밝혀낼 수 있도록 지원합니다.
SHAP의 강력한 라이브러리와 도구를 활용하면 프로젝트에 해석 가능한 머신 러닝을 쉽게 구현할 수 있습니다. 투명성을 목표로 하는 데이터 과학자이든 모델 결정을 이해하려는 이해 관계자이든, SHAP 값은 게임체인저입니다.
모델의 힘은 예측에만 있는 것이 아니라 이러한 통찰력을 효과적으로 해석하고 전달하는 능력에 있습니다. SHAP로 무장하면 이제 머신 러닝 모델을 기반으로 데이터에 입각한 결정을 내릴 준비가 더 잘 갖춰졌다고 할 수 있습니다.