모델 해석성
Model Interpretability
AI 모델의 결정 과정을 이해 가능하게 하는 특성.
Model Interpretability
AI 모델의 결정 과정을 이해 가능하게 하는 특성.
모델 해석성(Model Interpretability)은 AI 시스템이 어떻게 특정 결론에 도달했는지 인간이 이해할 수 있도록 설명하는 능력입니다. 신뢰할 수 있는 AI 시스템 구축, 규제 준수, 모델 디버깅에 필수적인 요소로, Explainable AI(XAI)의 핵심 개념입니다.
해석 가능성은 두 가지 차원으로 구분됩니다: 1) 본질적(Intrinsic) 해석성 - 선형 회귀, 결정 트리처럼 구조 자체가 해석 가능한 모델, 2) 사후적(Post-hoc) 해석성 - 복잡한 블랙박스 모델을 별도 기법으로 설명하는 방법. 딥러닝의 높은 성능과 해석성 사이에는 일반적으로 트레이드오프가 존재합니다.
주요 해석 기법으로는 SHAP(Shapley Additive Explanations), LIME(Local Interpretable Model-agnostic Explanations), Grad-CAM(이미지), Attention Visualization(NLP) 등이 있습니다. SHAP은 게임 이론 기반으로 각 피처의 기여도를 공정하게 분배하며, LIME은 로컬에서 단순한 대리 모델로 설명을 생성합니다.
금융, 의료, 법률 등 고위험 도메인에서는 GDPR의 "설명을 받을 권리", 한국의 신용정보법 등 규제가 해석 가능성을 요구합니다. 단순히 기술적 설명뿐 아니라, 비전문가도 이해할 수 있는 사용자 친화적 설명 생성이 점점 중요해지고 있습니다.
SHAP과 LIME을 활용한 모델 해석 예제입니다:
import shap
import lime
import lime.lime_tabular
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
# 데이터 및 모델 준비
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
data.data, data.target, test_size=0.2, random_state=42
)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# 1. SHAP 분석
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
# 전역적 피처 중요도 (평균 절대 SHAP 값)
feature_importance = np.abs(shap_values[1]).mean(axis=0)
top_features = sorted(zip(data.feature_names, feature_importance),
key=lambda x: x[1], reverse=True)[:5]
print("=== SHAP 전역 피처 중요도 (Top 5) ===")
for name, importance in top_features:
print(f" {name}: {importance:.4f}")
# 개별 예측 설명
sample_idx = 0
print(f"\n=== 샘플 {sample_idx} 개별 설명 ===")
print(f"예측: {'악성' if model.predict([X_test[sample_idx]])[0] == 0 else '양성'}")
sample_shap = shap_values[1][sample_idx]
top_contributors = sorted(zip(data.feature_names, sample_shap),
key=lambda x: abs(x[1]), reverse=True)[:3]
for name, value in top_contributors:
direction = "증가" if value > 0 else "감소"
print(f" {name}: 양성 확률 {direction} ({value:+.4f})")
# 2. LIME 분석
lime_explainer = lime.lime_tabular.LimeTabularExplainer(
X_train,
feature_names=data.feature_names,
class_names=['악성', '양성'],
mode='classification'
)
# 개별 예측에 대한 LIME 설명
lime_exp = lime_explainer.explain_instance(
X_test[sample_idx],
model.predict_proba,
num_features=5
)
print(f"\n=== LIME 로컬 설명 (샘플 {sample_idx}) ===")
for feature, weight in lime_exp.as_list():
print(f" {feature}: {weight:+.4f}")
# 3. 피처 중요도 비교 (SHAP vs 기본 중요도)
print("\n=== 피처 중요도 비교 ===")
print(f"{'피처':<30} {'RF 중요도':<12} {'SHAP 중요도':<12}")
print("-" * 54)
for i in np.argsort(model.feature_importances_)[-5:][::-1]:
print(f"{data.feature_names[i]:<30} "
f"{model.feature_importances_[i]:.4f} "
f"{feature_importance[i]:.4f}")| 해석 기법 | 계산 비용 | 적용 모델 | 해석 범위 |
|---|---|---|---|
| Feature Importance | 낮음 | 트리 기반 | 전역 |
| SHAP (TreeExplainer) | 중간 | 트리 기반 | 전역 + 로컬 |
| SHAP (KernelExplainer) | 높음 | 모든 모델 | 전역 + 로컬 |
| LIME | 중간 | 모든 모델 | 로컬 |
| Grad-CAM | 낮음 | CNN | 로컬 (시각화) |
"이 거절 건에 대해 SHAP 값으로 주요 거절 사유 Top 3를 고객에게 안내할 수 있습니다."
AI 결정에 대한 설명 기능을 기획할 때 사용합니다.
"모델 해석성 리포트를 금융위에 제출해야 해서, SHAP summary plot과 피처 중요도 분석 넣었습니다."
규제 기관 대응 시 문서화된 해석 결과를 제공할 때 씁니다.
"Grad-CAM으로 확인해보니까 모델이 이상한 곳을 보고 있어요. 데이터 편향이 있는 것 같습니다."
해석 도구를 활용해 모델 문제를 디버깅할 때 사용하는 표현입니다.
1. 해석 결과의 과신: SHAP/LIME은 근사치이며 완벽한 설명이 아닙니다. 특히 피처 간 상관관계가 높은 경우 해석이 불안정할 수 있습니다.
2. 전역 vs 로컬 혼동: 전역 피처 중요도가 높아도 개별 예측에서는 다른 피처가 결정적일 수 있습니다. 사용 목적에 맞는 해석 수준을 선택하세요.
3. 비전문가용 설명 부재: SHAP 값 자체는 일반 사용자가 이해하기 어렵습니다. "소득이 평균보다 낮아 거절"처럼 자연어로 변환하세요.
4. 해석성과 정확도 트레이드오프 무시: 무조건 해석 가능한 모델을 사용하면 성능이 떨어질 수 있습니다. 도메인 요구사항에 맞게 균형을 잡으세요.