본문 바로가기
AI Framework/PyTorch

[PyTorch] 12주차: 모델 해석 및 Explainable AI (XAI)

by cogito21_python 2024. 5. 30.
반응형

강의 목표

  • 모델 해석의 중요성 및 필요성 이해
  • Explainable AI (XAI) 기법 학습
  • PyTorch 모델을 해석하기 위한 다양한 도구와 기법 적용

강의 내용

1. 모델 해석의 중요성

  • 모델 해석이란?
    • 모델이 예측을 어떻게 수행했는지 이해하는 과정
    • 블랙박스 모델의 투명성 향상
  • 모델 해석의 필요성
    • 신뢰성 및 투명성 증대
    • 규제 준수
    • 모델 성능 향상에 도움

2. Explainable AI (XAI) 개념

  • XAI란?
    • AI 시스템의 예측 결과를 이해하고 설명할 수 있도록 하는 기법
    • 다양한 이해관계자 (개발자, 사용자, 규제 기관 등)에게 모델의 작동 원리를 설명
  • XAI 주요 기법
    • Feature Importance
    • Partial Dependence Plot (PDP)
    • SHAP (SHapley Additive exPlanations)
    • LIME (Local Interpretable Model-agnostic Explanations)

3. Feature Importance

  • Feature Importance 개념
    • 각 특성이 모델 예측에 미치는 영향도를 측정
  • PyTorch 모델에서의 Feature Importance 계산
    • Scikit-learn의 RandomForestClassifier를 사용한 예시
     
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import numpy as np

# 데이터 로드
data = load_iris()
X, y = data.data, data.target

# 모델 학습
model = RandomForestClassifier()
model.fit(X, y)

# Feature Importance 계산
importances = model.feature_importances_
indices = np.argsort(importances)[::-1]

# Feature Importance 시각화
plt.figure()
plt.title("Feature importances")
plt.bar(range(X.shape[1]), importances[indices], align="center")
plt.xticks(range(X.shape[1]), data.feature_names, rotation=90)
plt.xlim([-1, X.shape[1]])
plt.show()

 

4. Partial Dependence Plot (PDP)

  • PDP 개념
    • 특정 특성의 값 변화에 따른 모델 예측의 변화 시각화
  • PDP 구현
    • Scikit-learn의 partial_dependence를 사용한 예시
     
from sklearn.inspection import plot_partial_dependence

# Partial Dependence Plot
features = [0, 1, 2, 3]
plot_partial_dependence(model, X, features, feature_names=data.feature_names, grid_resolution=10)
plt.show()

 

5. SHAP (SHapley Additive exPlanations)

  • SHAP 개념
    • 게임 이론 기반의 기법으로, 각 특성이 예측에 기여한 정도를 계산
  • SHAP 라이브러리 사용
    • PyTorch 모델을 위한 SHAP 값 계산
     
import shap
import torch
import torch.nn as nn

# 간단한 PyTorch 모델 정의
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(4, 10)
        self.fc2 = nn.Linear(10, 3)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = SimpleNN()
model.eval()

# 데이터 로드 및 변환
X, y = load_iris(return_X_y=True)
X = torch.tensor(X, dtype=torch.float32)

# SHAP 값 계산
explainer = shap.DeepExplainer(model, X)
shap_values = explainer.shap_values(X)

# SHAP 값 시각화
shap.summary_plot(shap_values, X.numpy(), feature_names=data.feature_names)

 

6. LIME (Local Interpretable Model-agnostic Explanations)

  • LIME 개념
    • 개별 예측에 대한 로컬 선형 모델을 생성하여 모델 예측을 설명
  • LIME 라이브러리 사용
    • PyTorch 모델을 위한 LIME 설명 생성
     
from lime import lime_tabular

# 데이터 로드
X, y = load_iris(return_X_y=True)

# 간단한 PyTorch 모델 정의
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(4, 10)
        self.fc2 = nn.Linear(10, 3)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = SimpleNN()
model.eval()

# 예측 함수 정의
def predict_proba(X):
    X = torch.tensor(X, dtype=torch.float32)
    with torch.no_grad():
        outputs = model(X)
    return nn.Softmax(dim=1)(outputs).numpy()

# LIME 설명 생성
explainer = lime_tabular.LimeTabularExplainer(X, feature_names=data.feature_names, class_names=data.target_names, discretize_continuous=True)
i = 0  # 첫 번째 샘플 선택
exp = explainer.explain_instance(X[i], predict_proba, num_features=4)
exp.show_in_notebook(show_all=False)

 

7. 프로젝트 설명 및 진행

  • 프로젝트 개요
    • 모델 해석 및 XAI 기법을 활용한 실전 프로젝트 수행
    • 모델의 예측 결과를 설명하고 해석
  • 데이터셋 선택
    • Kaggle 또는 기타 오픈 데이터셋에서 프로젝트 데이터셋 선택
    • 예시: 타이타닉 생존 예측, 손글씨 숫자 분류 등
  • 프로젝트 단계
    • 데이터 전처리 및 준비
    • 모델 설계 및 구현
    • XAI 기법 적용
    • 모델 예측 결과 해석 및 설명

8. 프로젝트 예시

  • 예시 프로젝트: 타이타닉 생존 예측
    • 데이터셋 로드 및 전처리
    • 모델 학습 및 해석
     
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
import shap

# 데이터 로드
data = pd.read_csv('titanic.csv')

# 데이터 전처리
data = data.drop(['Name', 'Ticket', 'Cabin'], axis=1)
data = pd.get_dummies(data, drop_first=True)
X = data.drop('Survived', axis=1)
y = data['Survived']

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 데이터 스케일링
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 모델 학습
model = LogisticRegression()
model.fit(X_train, y_train)

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

# SHAP 값 시각화
shap.summary_plot(shap_values, X_test, feature_names=X.columns)

 

9. 프로젝트 발표 및 코드 리뷰

  • 프로젝트 발표
    • 각 그룹 또는 개인은 프로젝트 결과 발표
    • 모델 설계, 훈련 과정, 성능 평가 결과 및 모델 해석 결과 공유
  • 코드 리뷰 및 피드백
    • 각 그룹의 코드를 리뷰하고 피드백 제공
    • 개선할 점 및 좋은 점 공유

10. 실습 및 과제

  • 실습 과제
    • 학습된 모델을 해석하기 위한 XAI 기법 적용
    • 모델 해석 결과 분석 및 설명
     
# 실습 과제 예시
import shap
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# 데이터 로드 및 분할
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 모델 학습
model = LogisticRegression()
model.fit(X_train, y_train)

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

# SHAP 값 시각화
shap.summary_plot(shap_values, X_test, feature_names=load_iris().feature_names)

 

  • 과제 제출
    • Jupyter Notebook 파일 및 프로젝트 코드 제출
    • 제출 기한: 다음 강의 시작 전까지

 

반응형