본문 바로가기

통계학/데이터분석

Force Plot(SHAP 설명)

반응형

SHAP 결과를 해석하는 방법과 대표적인 시각화인 Force Plot 예시를 알려줄게.
이건 XGBoost나 LightGBM, RandomForest 같은 모델에 SHAP을 적용했을 때 예측이 어떻게 나왔는지를 설명해주는 대표적인 도구야.


📌 SHAP Force Plot 이란?

개별 데이터 포인트(샘플)에 대해 "왜 이 예측값이 나왔는지" 시각적으로 설명해줌.

  • 기준선 (base value):
    → 전체 데이터에서 평균적인 예측값 (예: 전체 평균 확률 0.5)
  • 화살표(밴드):
    → 각 피처가 예측값을 얼마나 끌어올렸는지(+) or 낮췄는지(-) 를 보여줌
  • 왼쪽은 마이너스 영향(파란색), 오른쪽은 플러스 영향(빨간색)
    → 시각적으로 직관적!

🖼️ Force Plot 예시

import shap
import xgboost as xgb
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

# 데이터 로딩
X, y = load_breast_cancer(return_X_y=True, as_frame=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

# 모델 학습
model = xgb.XGBClassifier(tree_method="hist").fit(X_train, y_train)

# SHAP 값 계산
explainer = shap.Explainer(model, X_train)
shap_values = explainer(X_test)

# Force Plot (첫 번째 샘플에 대해)
shap.plots.force(shap_values[0])

이 코드를 실행하면 Jupyter/코랩 상에서 인터랙티브한 force plot이 나타나!


🔍 해석 방법 (예시 그림 기준)

SHAP Force Plot

base value: 0.62
expected output (예측값): 0.87

피처 영향:
 - 'mean radius': +0.15
 - 'texture error': -0.05

이건 다음을 의미해:

  • 전체 평균 예측값은 0.62 (base value)
  • 이 샘플은 예측값이 0.87로 올라감
  • 'mean radius'가 예측값을 +0.15만큼 증가시켰고
  • 'texture error'는 -0.05만큼 감소시켰음

→ 즉, 이 샘플이 양성(positive) 예측으로 강하게 분류된 이유는 특정 피처가 예측을 강하게 밀어올렸기 때문이야.


⚠️ 주의할 점

  • Force Plot은 한 샘플에 대한 예측 이유를 설명할 때 사용
  • 전체 데이터에 대한 분석은 summary_plot이나 dependence_plot이 더 적합
  • 코랩이나 주피터에서만 시각화 잘됨 (CLI/터미널에서는 제대로 안 보일 수 있음)

🎁 Tip: 전체 샘플에 대한 인터랙티브 Force Plot

shap.plots.force(shap_values[:100])  # 100개 샘플을 연속적으로 보여줌

 

 

반응형