
머신러닝 (ML) 모델에서의 설명 가능성 (Explainability)
요약
머신러닝 블랙박스 모델의 예측 근거를 이해하기 위한 SHAP(SHapley Additive exPlanations) 방법론을 소개합니다. 해석 가능한 모델과 설명 가능한 모델의 차이를 정의하고, 게임 이론 기반의 SHAP을 통해 특성 기여도를 정량화하는 과정을 다룹니다.
핵심 포인트
- 해석 가능한 모델과 설명 가능한 모델의 개념적 차이 설명
- SHAP을 활용한 블랙박스 모델의 예측 기여도 분석 방법
- XGBoost, LightGBM 등 복잡한 모델에 대한 설명 가능성 제공
- 실습 가능한 Jupyter Notebook 및 관련 리소스 제공
이 기사는 머신러닝 (ML) 블랙박스 모델의 예측 뒤에 숨겨진 이유를 이해하기 위한 접근 방식으로서 SHAP 설명 가능성 (Explainability) 방법을 소개합니다. 또한 이러한 개념을 직접 경험해 볼 수 있도록 사용 및 수정이 가능한 간단한 Jupyter notebook도 포함되어 있습니다:
https://www.kaggle.com/code/jorgeivnjh/explainability-in-ml-models
https://github.com/JorgeIvanJH/Explainability-in-ML-models
우리는 향후 우리의 지속적 학습 파이프라인 (Continuous Training Pipeline) 구현을 위해 이러한 개념을 활용할 것입니다: https://community.intersystems.com/post/complementing-iris-mlflow-continuous-training-ct-pipeline
이 notebook에서 우리는 블랙박스 모델에 대한 설명 가능성 (Explainability)에 대한 직관을 제공합니다. 블랙박스 모델은 신경망 (Neural networks)이나 그래디언트 부스팅 (Gradient boosting) (예: XGBoost, LightGBM, CatBoost)과 같은 앙상블 방법 (Ensemble methods)처럼 인간이 직접 이해하기에 너무 복잡한 모델을 의미합니다.
시작하기 전에, 해석 가능한 모델 (Interpretable models)과 설명 가능한 모델 (Explainable models)의 차이점을 명확히 하는 것이 중요합니다:
해석 가능한 모델 (Interpretable models)은 모델 자체를 보는 것만으로 입력의 변화가 출력에 어떻게 영향을 미치는지 직접 이해할 수 있는 모델입니다.
이는 각 변수가 예측에 어떻게 영향을 미치는지 나타내는 계수 (Coefficient)와 연관되어 있는 선형 회귀 (Linear regression)의 경우에 해당합니다. 또한 가지 (Branches)를 따라감으로써 예측이 어떻게 이루어지는지 정확히 이해할 수 있는 단일 결정 트리 (Decision tree)의 경우에도 마찬가지입니다.
반면, 많은 트리를 결합한 랜덤 포레스트 (Random forests) 및 그래디언트 부스팅 (Gradient boosting) (예: XGBoost, LightGBM), 또는 수천 개에서 수백만 개의 매개변수 (Parameters)를 가진 신경망 (Neural networks)과 같은 모델은 이러한 유형의 직접적인 해석을 하기에는 너무 복잡합니다. 이러한 경우, 우리는 모델이 예측을 생성하기 위해 입력 특성 (Input features)을 어떻게 사용하는지 이해하기 위해 설명 가능성 (Explainability) 방법에 의존합니다.
이러한 모델에 대한 설명 가능성 (Explainability)을 제공하기 위해, 우리는 일반적으로 학습된 모델을 가져와 입력 특성 (Input features)의 변화가 출력 (Output)에 어떻게 영향을 미치는지 분석합니다. 이를 수행하는 방법은 매우 다양하지만 (예: 부분 의존성 플롯 (Partial dependence plots), ICE 플롯 (ICE plots), LIME), 가장 널리 사용되고 수학적 근거가 탄탄한 방법 중 하나는 SHAP입니다.
SHAP (SHapley Additive exPlanations)은 게임 이론 (Game theory)에 기반하며, 각 특성이 모델의 예측에 얼마나 기여하는지를 정량화하는 샤플리 값 (Shapley values)을 계산합니다. 이러한 기여도는 전역적 (Globally, 데이터셋 전체에 걸쳐) 및 지역적 (Locally, 개별 예측에 대해)으로 모두 분석할 수 있습니다.
이 노트북에서는 SHAP Python 라이브러리를 사용하여 이러한 개념들을 탐구합니다. 먼저 단순하고 해석 가능한 모델 (선형 회귀 (Linear regression))으로 시작하여, 이후 더 복잡한 모델 (LightGBM)로 넘어갑니다. 그 과정에서 모델의 동작을 설명하기 위해 가장 흔히 사용되는 몇 가지 플롯 (Plots)을 소개합니다.
참고: Kaggle에서 이 노트북을 실행하려면 계정으로 로그인해야 하며 인터넷 접속 권한이 있어야 합니다 (Settings - Turn on internet).
import numpy as np
import pandas as pd
import sklearn
...
이번 실습에서는 California Housing 데이터셋을 정답 (Ground truth)으로 활용합니다. 이 데이터셋은 주택 가격과 관련된 다음과 같은 변수들을 포함합니다:
- MedInc (float): 블록 내 중위 소득 (Median income in block)
- HouseAge (float): 블록 내 주택 연령 중위값 (Median house age in block)
- AveRooms (float): 주거지 내 평균 방 개수 (Average rooms in dwelling)
- AveBedrms (float): 주거지 내 평균 침실 개수 (Average bedrooms in dwelling)
- Population (float): 블록 인구 (Block population)
- AveOccup (float): 평균 가구 점유율 (Average house occupancy)
- Latitude (float): 주택 블록 위도 (House block latitude)
- Longitude (float): 주택 블록 경도 (House block longitude)
관심 변수 (Variable of interest) 예측:
- MedHouseVal (float): 주택 가격 중위값 (Median House Value), $100,000 단위로 표시됨 (예: 4.526은 $452,600를 나타냄)
X, y = shap.datasets.california(n_points=1000) # 데이터셋
X, X_valid, y, y_valid = sklearn.model_selection.train_test_split(X, y, test_size=0.1, random_state=42)
선형 회귀 (Linear Regression) (해석 가능한 모델)
선형 회귀 (Linear Regression)는 단순하지만 강력한 모델이며, 특히 해석하기가 매우 쉽습니다. 이는 모델이 학습 (fit)된 후, 각 변수가 해당 변수와 곱해지는 파라미터 (계수 (coefficient))와 연관되어, 해당 변수의 값을 관심 있는 변수의 단위로 변환하기 때문입니다. 이렇게 변환된 모든 변수의 합에 오프셋 (절편 (intercept))을 더하면 최종 예측값이 생성됩니다.
예를 들어, 이미 학습된 주택 가격 예측 모델의 파라미터를 분석함으로써, 각 변수가 데이터셋 내 주택 가격에 어떻게 영향을 미치는지 파악할 수 있습니다:
HousePrice = MedInc * (0.4) + AveBedrms * (5000) + Latitude * (-0.5) + 50000
- 오프셋 (offset)은 모든 변수가 0일 때 주택의 기본 가치가 50,000임을 시사합니다.
- 해당 구역의 중간 소득 (MedInc)은 0.4의 비율로 주택 가격을 높이며 (소득이 1달러 증가할 때마다 예측 주택 가격은 0.4달러 증가), 침실 (bedroom)이 하나씩 추가될 때마다 5,000달러가 추가됩니다.
- 위도 (Latitude)는 음의 계수 (negative coefficient)를 가지며, 이는 북쪽으로 이동할수록 (위도가 높아질수록) 주택 가격이 감소함을 시사합니다. 위도는 북쪽으로 갈수록 증가하므로, 음의 계수는 가격에 하락 효과를 미친다는 것을 의미합니다.
이러한 초기 해석은 유용하지만, 중요한 한계점이 있습니다. 문맥(context) 없이는 파라미터의 규모 (scale)가 오해를 불러일으킬 수 있다는 점입니다. 변수들이 정규화 (normalised)되지 않았다면, 수치적 규모가 큰 변수는 더 작은 계수를 갖는 경향이 있고, 그 반대의 경우도 마찬가지입니다.
예를 들어, 주택의 중간 연령 ("HouseAge")이 년 (years) 대신 초 (seconds) 단위로 측정된다면, 입력 값이 훨씬 크기 때문에 계수는 훨씬 더 작아질 것입니다. 이는 실제로는 측정 단위의 차이일 뿐임에도 불구하고, HouseAge가 다른 변수보다 덜 중요하다는 오해를 줄 수 있습니다. 반대로, AveBedrms와 같은 변수는 단순히 더 작은 수치적 규모에서 작동하기 때문에 더 큰 계수를 가질 수 있습니다.
이제 우리 데이터셋에 적용된 실제 모델을 살펴보겠습니다:
model = sklearn.linear_model.LinearRegression()
model.fit(X, y)
...
Model coefficients (모델 계수):
MedInc = 0.41174
...
우리가 수행한 분석은 잘 작동하지만, 이는 모든 샘플에 걸쳐 각 변수가 출력에 어떻게 영향을 미치는지에 대한 정적이고 전역적인 (global) 이해만을 제공합니다. 이는 변수 간의 상호작용 (interactions)을 포착하지 못하며 주로 선형 모델 (linear models)에 국한됩니다. 만약 우리가 더 복잡한 모델 (예: 신경망 (neural networks) 또는 트리 기반 모델 (tree-based models))을 사용하고 있다면, 이러한 유형의 해석만으로는 학습되고 있는 관계를 이해하기에 충분하지 않을 것입니다.
여기서 SHAP이 등장합니다. SHAP (Shapley values)은 게임 이론 (game theory)에 기반한 방법으로, 모델의 예측에 대한 각 특성 (feature)의 한계 기여도 (marginal contribution)를 이해할 수 있게 해줍니다. 그 뒤에 숨겨진 이론은 생략하겠지만, 직관적으로 SHAP은 각 특성이 모델의 평균 예측값으로부터 예측을 어떻게 변화시키는지 알려줍니다. 이를 더 쉽게 이해하기 위해 선형 회귀 (linear regression)와 비교해 볼 수 있습니다. 선형 회귀에서 절편 (intercept)은 베이스라인 (baseline) 역할을 하며, 각 특성에 계수를 곱한 값은 해당 베이스라인으로부터 예측값을 이동시킵니다. SHAP에서 베이스라인은 데이터셋 전체에 대한 모델의 평균 예측값 (기댓값 (expected value))이며, 각 특성의 Shapley value는 특정 샘플에 대해 이 베이스라인에서 최종 예측값으로 이동하는 데 해당 특성이 얼마나 기여하는지를 나타냅니다.
단일한 전역적 (global) 해석을 제공하는 선형 회귀 계수와 달리, SHAP은 샘플별 설명 (per-sample explanations)을 계산할 수 있게 하여, 각 특성이 데이터셋 전체의 평균뿐만 아니라 개별 예측에 어떻게 기여하는지를 보여줍니다.
아래에서는 비교를 위한 참조 데이터셋 (reference dataset)으로 사용할 데이터의 서브샘플 (subsample)을 추출합니다 (전체 데이터셋을 사용할 수도 있지만, 계산 비용이 많이 들 것입니다). 그런 다음 우리가 학습시킨 선형 회귀 (linear regression) 모델을 위한 설명자 (explainer) 객체를 생성하고, SHAP 값 (각 특성이 각 예측에 기여하는 정도를 나타냄)을 계산한 뒤, 모델이 포착한 관계를 분석하기 위해 특정 샘플 (샘플 #20)을 선택합니다.
참고: 근본적인 SHAP 알고리즘을 이해하려면 다음을 참조하세요: https://christophm.github.io/interpretable-ml-book/shapley.html
X100 = shap.utils.sample(X, 100) # 배경 데이터셋 (background dataset)으로 사용할 서브샘플 (SHAP의 내부 알고리즘을 위해 필요함)
explainer = shap.Explainer(model.predict, X100)
shap_values = explainer(X)
...
ExactExplainer explainer: 901it [00:12, 30.31it/s]
SHAP 값을 계산하면 모델 예측의 이면에 있는 이유를 더 잘 이해하기 위해 다양한 플롯 (plots)을 그릴 수 있습니다.
의존성 플롯 (Dependence plot) (+ ICE 라인)
의존성 플롯 (dependence plot)은 특성 (feature)이 변함에 따라 모델 출력 (output)이 어떻게 변하는지, 그리고 데이터에서 해당 특성의 서로 다른 값들이 얼마나 빈번하게 발생하는지를 이해하는 데 도움을 줍니다. 더 구체적으로, 이는 모델의 예측이 특성의 범위에 따라 어떻게 진화하는지를 보여주는 동시에, 해당 값들이 얼마나 흔한지에 대한 감각을 제공합니다. 이를 통해 우리는 특성의 효과뿐만 아니라, 그 효과가 실제로 얼마나 유의미한지도 확인할 수 있습니다. 결과적으로, 효과는 강력하지만 드물게 발생하는 값은 효과는 약하더라도 빈번하게 발생하는 값보다 전체적으로 덜 중요하게 나타날 수 있습니다.
아래 플롯에서는 의존성 플롯 (dependence plot)과 개별 조건부 기대값 (Individual Conditional Expectation, ICE) 라인을 함께 겹쳐서 보여주며, 각 인스턴스(instance)마다 하나의 라인을 표시하여 특성이 변할 때 해당 인스턴스의 예측이 어떻게 변하는지를 보여줍니다.
- Latitude (위도) 특성의 평균값 (회색 수직 점선), 약 36 부근
- 주택 가격에 대한 모델 예측의 평균값 (회색 수평 점선), 거의 2 ($200,000) 부근
- 굵은 파란색 선은 Latitude를 범위 전체에 걸쳐 변화시킬 때의 평균 모델 예측을 나타냅니다 (이는 부분 의존성 (partial dependence), 즉 전역적 추세 (global trend)입니다)
- 연한 파란색 선들은 Latitude를 변화시킬 때 개별 샘플에 대한 모델 예측을 나타냅니다 (ICE 곡선). 각 선은 하나의 샘플에 대응하며, 나머지 특성들은 고정시킨 채 Latitude만 변경합니다
- 빨간색 수직 세그먼트는 선택된 샘플 (sample_ind)을 표시합니다. 이는 해당 특정 샘플의 예측이 기준값 (기댓값 (expected value))에 비해 어떻게 이동하는지를 보여주며, 해당 인스턴스에 대한 Latitude의 기여도를 강조합니다
기저 모델 (underlying model)이 선형 회귀 (linear regression)이기 때문에 모든 파란색 선은 선형입니다. 우리는 음(-)의 관계를 명확하게 볼 수 있습니다: Latitude가 증가함에 따라 (북쪽으로 이동함에 따라), 모든 샘플에 걸쳐 예측된 주택 가격이 감소합니다.
ICE 선의 퍼짐 정도는 특성이 얼마나 중요한지를 나타내는 것이 아니라, 샘플 전반에 걸쳐 그 효과가 얼마나 일관적인지를 나타냅니다. 선들이 촘촘하게 모여 있다면, 해당 특성은 데이터셋 전체에서 유사한 효과를 가집니다. 선들이 넓게 퍼져 있다면, 해당 특성은 다른 변수들과 상호작용하며 그 효과가 특정 샘플에 따라 달라집니다.
shap.partial_dependence_plot(
"Latitude",
model.predict,
...
산점도 (Scatter Plot)
변수가 모델 출력에 어떻게 영향을 미치는지 시각화하는 또 다른 방법은 산점도 (scatter plot)를 사용하는 것입니다. 이 플롯에서는 x축에 특성 값을, y축에 그에 대응하는 SHAP 값을 배치하여 특성의 변화가 예측에 어떤 영향을 미치는지 보여줍니다.
shap_values를 "color" 인자로 전달하면, SHAP은 선택된 특성의 SHAP 값과 가장 강력하게 상관관계가 있거나(또는 상호작용하는) 특성을 자동으로 선택하여 점의 색상을 지정하는 데 사용합니다.
우리의 예시에서는 위도(Latitude)를 분석하며, SHAP은 경도(Longitude)를 위도와 가장 관련이 깊은 특성으로 식별하고 이를 색상 척도(colour scale)를 통해 보여줍니다. (참고로, 이는 위에서 본 ICE 플롯에서 다른 변수와의 상호작용과 관련된 선들이 넓게 퍼져 있는 현상과 일치합니다.)
이 플롯에서 우리는 다음을 관찰할 수 있습니다:
- 위도가 낮은(더 남쪽에 위치한) 점들은 경도 값이 높은(빨간색) 경향이 있으며, 이는 이들이 더 동쪽에 위치함을 의미합니다.
- 위도가 높은(더 북쪽에 위치한) 점들은 경도 값이 낮은(파란색) 경향이 있으며, 이는 이들이 더 서쪽에 위치함을 의미합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기