
딥러닝 설명 가능성 (Deep Learning Explainability): 신용 리스크 점수 산정 사례 연구
요약
딥러닝 모델의 복잡성 증가에 따른 설명 가능성(XAI)의 중요성을 다룹니다. 신용 리스크 점수 산정 사례를 통해 복잡한 모델의 예측 결과를 해석하고 보정하는 엔드 투 엔드 파이프라인을 탐구합니다.
핵심 포인트
- 모델 복잡도 증가에 따른 설명 가능성(Explainability)의 필요성 증대
- 로지스틱 회귀 대비 딥러닝 모델의 해석 난이도 차이 분석
- 신용 리스크 예측을 위한 XAI 프레임워크 및 사례 연구
- 리스크 점수 보정 및 엔드 투 엔드 파이프라인 구축 방법
콘텐츠
-
서론 (Introduction)
-
데이터 요약 및 모델 학습 (Data Brief and Model Training)
-
XAI 프레임워크 및 사례 (XAI Frameworks and Examples)
-
리스크 점수 보정 (Risk Score Calibration)
-
엔드 투 엔드 파이프라인 (End-to-End Pipeline)
서론 (Introduction)
예측 모델은 기본적인 통계적 방법론으로부터 먼 길을 걸어왔습니다. 분류 (Classification)를 위해 로지스틱 회귀 (Logistic Regression)가 종종 베이스라인 모델로 사용되는 반면, SVM (Support Vector Machine), 트리 기반 모델 (Tree-based models)에서 딥러닝 (Deep Learning) 모델에 이르기까지 점점 더 복잡한 모델들이 최종 모델로서 프로덕션 환경에서 사용되고 있습니다.
이러한 구축 과정의 복잡성 증가는 설명 가능성 (Explainability)의 복잡성 증가와 상관관계가 있습니다.
로지스틱 회귀 (Logistic Regression) 아키텍처
위 아키텍처는 로지스틱 회귀가 각 특성 (Feature)이 입력 데이터의 예측된 클래스 (Class)에 어떻게 영향을 미치는지 이해하는 데 거의 노력이 필요하지 않음을 보여줍니다. 딥러닝 (Deep Learning) 모델의 경우, 아키텍처는 훨씬 더 복잡합니다. 따라서 우리가 구축한 모델을 이해하는 데 필요한 설명을 도출하기 위해서는 더 복잡한 프레임워크가 필요합니다.
다음 섹션에서는 딥러닝 (Deep Learning) 모델의 설명을 가능하게 하는 몇 가지 프레임워크, 신용 리스크 예측 유스케이스 (Use case), 그리고 예측된 확률 (Predicted probabilities)에 대한 제안된 제시 방법을 탐구할 것입니다.
데이터 요약 및 모델 학습 (Data Brief and Model Training)
사용된 데이터는 익명화된 사용자들의 다중 신용 이력 기록 데이터(raw_data)에 대한 Kaggle 데이터셋을 피처 엔지니어링 (Feature Engineering)한 버전입니다. 피처 (Features)는 각 사용자의 신용 행동 가치와 딥러닝 (Deep Learning) 모델을 위한 데이터 준비 상태를 기반으로 생성되었습니다. 제가 피처 엔지니어링과 전체 모델 학습을 구현한 노트북은 여기에서 확인하실 수 있습니다.
- 데이터 피처 (Data Features) :
data = pd.read_csv('data/data_dl.csv')
features = data.columns[:-1]
# 각 레코드가 사용자의 현재 신용 정보와 역사적 맥락을 위한 이전 2개월간의 일부 피처를 나타내는 44개의 피처
...
-
출력/타겟 레이블 (Output/Target Label): 기록된 시점의 각 사용자의 신용 상태를 해석하는 레이블입니다. [Good, Standard, Poor]
-
의도된 출력 (Intended Output): 각 타겟 레이블에 대한 리스크 점수 대역 (Risk score bands) 및 개별 리스크 점수를 가진 사용자의 신용도에 대한 보다 유동적인 분류
모델 (Model)
XAI 프레임워크 (XAI frameworks)의 구현 예제를 위해 다음과 같은 다층 퍼셉트론 (Multi-Layer Perceptron, MLP) 모델을 사용할 것입니다.
- 모델 클래스 정의 (Defining the Model Class)
# 제 전체 프로젝트에서는 여러 모델이 학습되었지만, 이 글의 목적을 위해 MLP - 딥러닝 (Deep Learning) 모델에 집중할 것입니다.
class MLPClassifier(nn.Module):
...
- 모델 학습 (Training the model)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
mlp_clf = MLPClassifier(cat_dims=cat_dims, num_cols=num_cols)
...
# XAI 구현을 위한 데이터 준비
import shap
...
AI 설명 가능성 (XAI) 프레임워크 및 예제
SHAP 프레임워크
SHAP (SHapley Additive exPlanations)은 게임 이론 (Game Theory)에 기반하여 피처별 예측 기여도 할당을 수행하는 설명 가능한 AI (Explainable AI, XAI) 프레임워크입니다. 이 프레임워크에는 딥러닝 (Deep Learning) 모델을 위해 의도적으로 구축된 클래스들이 포함되어 있습니다.
# explainer를 인스턴스화하고 결과를 반환
import shap
...
-
Deep Explainer
-
Deep Explainer
이 클래스는 DeepLIFT 알고리즘을 기반으로 하며, 모델의 각 특성(feature)에 대한 노드별 기여도(attribution)를 Shapley 값으로 근사합니다. 이 방식은 신경망(neural network)의 레이어 구조에 대한 접근 권한이 필요하며, 각 특성에 의한 예측 기여도의 실제 값에 근접한 근사치를 반환합니다. 이러한 구조적 특성 때문에 정규화(normalization) 및 임베딩(embedding) 레이어와 같이 지원되지 않는 레이어 유형과는 호환되지 않습니다.
#data는 데이터셋의 텐서(tensor) 형태입니다
explainer = shap.DeepExplainer(model, data)
...
- Gradient Explainer
이 클래스는 Integrated Gradients 방법의 확장인 기대 기울기(expected gradients) 로직을 기반으로 합니다. 이는 중립적인 베이스라인(neutral baseline)을 사용하여 각 입력에 대해 출력의 기울기(slope)가 얼마나 변하는지를 평가합니다. _Deep Explainer_와 달리 신경망의 특정 레이어를 처리할 필요가 없으므로 지원되지 않는 레이어 유형에도 사용할 수 있습니다. 하지만 레이어의 활성화(activation)가 포화(saturate)될 경우 오해의 소지가 있을 수 있으므로, 심층 신경망(deep neural network) 모델에는 Deep Explainer를 사용하는 것이 더 권장됩니다.
#explainer를 인스턴스화하고 결과를 반환
explainer = shap.DeepExplainer(model, data)
...
우리의 MLP 모델은 정규화 레이어(normalization layer), BatchNorm1d 및 범주형 특성의 임베딩(Embedding)을 포함하고 있으므로 Gradient explainer가 가장 적합합니다. DeepExplainer를 성공적으로 사용하려면 MLP 모델에서 Embedding 및 BatchNorm1d 레이어를 제거해야 합니다. SHAP Documentation
LIME Framework
Locally Interpretable Model-agnostic Explanations (LIME)은 특정 입력에 대한 특성 기여도 (feature contributions) 설명을 목표로 하는 XAI 프레임워크입니다. 이 프레임워크는 각 인스턴스마다 일부 특성을 제외한 채 다양한 특성 조합을 샘플링함으로써 이를 수행합니다. 원래 입력에 더 가까운 섭동 샘플 (disturbed samples)에는 더 높은 가중치가 부여되어, 설명이 전역적 패턴 (global patterns)보다는 지역적 동작 (local behaviour)을 반영하도록 보장합니다. 그런 다음 이러한 샘플들에 대해 가중 회귀 (weighted regression) 또는 단순 트리 모델 (simple tree model)을 적합시켜, 계수 (coefficients)를 특성 기여도 (feature attribution)로 읽어냅니다. 이 프레임워크는 모든 유형의 모델 복잡성에 적용 가능하므로 모델 불가지론적 (model-agnostic)입니다.
# LIME 구현
from lime import lime_tabular
...
리스크 점수 보정 (Risk Score Calibration)
- 예측 확률 보정 (Predicted Probability Calibration)
머신러닝 (Machine Learning) 모델에 의해 예측된 확률은 종종 적절하게 스케일링 (scaled)되지 않으므로, 해당 항목/사용자가 할당된 클래스에 속할 가능성으로 해석될 수 없습니다. 결과로 나온 클래스 확률은 대부분의 리스크 점수 파이프라인 (risk scoring pipelines)에서 후속 단계나 분석에 사용되기 때문에, 이 확률들을 보정 (calibration)하는 것이 필수적입니다.
흔히 사용되는 보정 방법은 다음과 같습니다:
-
등조 회귀 (Isotonic Regression),
-
시그모이드 / 플랫 보정 (Sigmoid / Platt Calibration)
-
온도 스케일링 (Temperature Scaling):
우리는 이번 사례 연구를 위해 온도 스케일링 (temperature scaling)을 구현할 것입니다. 상세한 설명에 관심이 있다면, 작동 원리를 읽어보시기 바랍니다._
temp_scaler = TemperatureScaler()
"""
...
- 확률을 사람이 읽을 수 있는 리스크 점수로 보정하기 (Calibrating Probabilities to Human Readable Risk Score)
레이블(labels)은 리스크 분류를 위해 자주 사용되지만, 단순히 최대 예측 확률 클래스(maximum predicted probability class)가 같다는 이유만으로 서로 다른 특성을 가진 다양한 신용 사용자들을 하나의 그룹으로 묶어버리는 문제가 있습니다. 리스크 점수 척도(risk score gauge)를 설정하면 비즈니스 측면과 사용자 측면(해당하는 경우) 모두에서 개별 신용 상태, 시간에 따른 개선 사항, 그리고 신용에 부정적인 영향을 미치는 조치들에 대한 맥락을 파악할 수 있습니다.
이를 구현하기 위해 사용되는 표준 관례는 PDO (Points to Double Odds) 방식입니다.
구현 (Implementation)
PDO = 50 # 로그 변환(log transform)이 기본 점수(base score)로부터 이동하는 정도에 따라 매개변수를 설정합니다. 값의 리스트를 반복하며 구현에 가장 적합한 값을 찾을 수 있습니다.
BASE_SCORE = 600
...
이 방식을 보정된 확률(calibrated probabilities)에 적용하여, 입력값 X의 결과로서 처리된 각 사용자의 리스크 점수를 보여주는 데이터프레임(dataframe)을 반환합니다.
엔드 투 엔드 파이프라인 구축 (Build End-to-End Pipeline)
모델은 애플리케이션이나 소프트웨어 서비스에 구현될 수 있도록 프로덕션 준비 상태(production ready state)로 존재해야 합니다. 이 목표를 달성하기 위해서는 다음 중 하나를 수행해야 합니다.
- 전처리(preprocessing)부터 점수 보정(score calibration)까지의 각 변환 과정을 포함하는 파이프라인(Pipeline) 클래스를 정의합니다.
"""
1. .py 파일을 생성하고 기본적인 파이프라인 클래스(Pipeline Class)를 정의합니다.
...
- 개별 데이터를 변환하는 엔드포인트(endpoints)를 가진 API를 구축합니다.
어떤 경우에는 파이프라인을 배포하기 위해 전체 API를 구현해야 할 수도 있습니다. 이 구현 방식은 이전 옵션과 일부 중복됩니다.
# 디렉토리 (Directory)
artefacts/
"""
...
결론 (Conclusion)
기사 서두에서 우리는 딥러닝 모델 (deep learning models), 설명 가능성 프레임워크 (explainability frameworks), 그리고 점수 보정 (score calibrations)을 사용하여 전체 신용 점수 산정 파이프라인을 구축하는 것을 목표로 삼았습니다.
우리는 딥러닝 모델의 복잡한 구조로 인한 설명 가능성 (explainability)의 필요성을 논의하였고, 딥러닝 모델과 관련된 세 가지 XAI 프레임워크 (shap.DeepExplainer, shap.GradientExplainer, LIME) 및 이들의 다양한 사용 사례를 살펴보았습니다. 이어서 출력 확률을 사람이 읽을 수 있는 점수로 변환하고, 점수 건전성 (score health)에 기여하는 주요 요인들에 대한 통찰을 제공하는 구현 방식에 대해 탐구했습니다.
만약 이 글이 유사한 엔드 투 엔드 (end-to-end) 프로젝트를 구현하는 데 흥미를 유발했거나, 현재 업무에 이 중 하나를 적용하고 싶다면, 저의 Github repo에서 전체 프로젝트를 확인해 보세요.
참고 문헌
Explaining Deep Learning Models for Credit Scoring with SHAP - Lars Ole Hjelkrem 및 Petter Eilif de Lange 작성
Mastering Explainable AI - Siddhartha Pramanik 작성
Implementing PDO - Youtube 튜토리얼
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기