본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] Model Drift 및 Data Drift 탐지 방법과 8가지 핵심 지표를 통한 모니터링 해결 전략

by Papa Martino V 2026. 4. 29.
728x90

Data Drift vs Model Drift
Data Drift vs Model Drift

1. 머신러닝 모니터링의 필요성과 Drift의 정의

머신러닝 모델을 프로덕션 환경에 배포하는 것은 끝이 아니라 새로운 시작입니다. 학습 데이터와 실제 운영 데이터 사이의 괴리가 발생하는 현상을 Drift라고 하며, 이를 방치할 경우 모델의 예측 성능이 급격히 저하되어 비즈니스에 치명적인 손실을 초래할 수 있습니다. 파이썬을 활용한 MLOps(Machine Learning Operations) 환경에서 이러한 변화를 감지하기 위한 대시보드 구축은 필수적입니다. 현대적인 ML 시스템에서 다루는 Drift는 크게 두 가지로 구분됩니다. 첫째는 모델의 예측 결과와 실제 정답 사이의 관계가 변하는 Model Drift(Concept Drift)이며, 둘째는 입력 데이터의 분포 자체가 변하는 Data Drift(Covariate Shift)입니다. 이 글에서는 이를 탐지하기 위한 8가지 핵심 지표(KPI)와 실제 구현 방법, 그리고 아키텍처적 차이를 심층적으로 다룹니다.


2. Data Drift vs Model Drift 핵심 지표 및 차이 비교

모니터링 대시보드를 구성할 때 가장 먼저 선행되어야 할 작업은 무엇을 측정할 것인가를 결정하는 것입니다. 아래 표는 두 종류의 Drift가 가지는 특성과 측정 지표의 차이를 요약한 것입니다.

구분 Data Drift (데이터 드리프트) Model Drift (모델/컨셉 드리프트)
발생 원인 입력 데이터 분포의 변화 (사용자 층 변경 등) 데이터와 타겟 변수 간의 관계 변화
핵심 측정 지표 PSI(Population Stability Index), KL Divergence Accuracy, F1-Score, Precision, Recall
탐지 시점 실시간 데이터 입력 즉시 감지 가능 실제 정답(Ground Truth) 확보 후 가능
주요 통계 기법 K-S Test, Page-Hinkley Test Error Rate Tracking, Drift Detection Method
해결 전략 데이터 정규화, 피처 엔지니어링 재검토 모델 재학습(Retraining), 알고리즘 교체

3. 모니터링 대시보드를 위한 8가지 필수 핵심 KPI

성공적인 MLOps 대시보드에는 다음과 같은 8가지 지표가 포함되어야 합니다. 이는 모델의 건강 상태를 진단하는 청진기 역할을 합니다.

  • PSI (Population Stability Index): 학습 데이터 대비 운영 데이터의 분포 변화를 수치화한 지표로, 0.1 미만이면 안정, 0.25 이상이면 심각한 변화로 간주합니다.
  • KL Divergence (Kullback-Leibler): 두 확률 분포의 차이를 측정하여 데이터의 비정상적 쏠림을 감지합니다.
  • Confusion Matrix 변동성: 특정 클래스에 대한 오답률이 급증하는지 실시간으로 추적합니다.
  • Feature Importance Drift: 특정 피처의 중요도가 갑자기 바뀌면 데이터 소스에 문제가 생겼을 가능성이 높습니다.
  • Input Missing Rate: 입력 피처 중 Null 값의 비율이 증가하는지 확인하여 데이터 파이프라인의 오류를 감지합니다.
  • Prediction Confidence Distribution: 모델이 예측할 때의 확신도(Probability) 분포가 낮아지면 모델 신뢰도가 하락한 것입니다.
  • Response Latency: 모델의 추론 속도를 측정하여 인프라 성능 저하를 방어합니다.
  • Business Metric (Conversion Rate 등): 최종적인 비즈니스 성과 지표가 모델 성능과 동기화되어 움직이는지 확인합니다.

4. 파이썬 실무 적용을 위한 7가지 핵심 구현 예제

실제 프로덕션 환경에서 모델 모니터링을 자동화하기 위해 바로 사용할 수 있는 파이썬 코드 예제입니다. 주로 Evidently, SciPy, Pandas 라이브러리를 활용합니다.

예제 1: Kolmogorov-Smirnov Test를 활용한 수치형 데이터 드리프트 탐지

두 데이터 집합의 분포가 통계적으로 동일한지 p-value를 통해 확인합니다.

from scipy import stats
import numpy as np

def detect_drift_ks(train_data, production_data, feature_name):
    stat, p_value = stats.ks_2samp(train_data[feature_name], production_data[feature_name])
    if p_value < 0.05:
        print(f"Drift Detected in {feature_name}: p-value={p_value:.4f}")
    else:
        print(f"No Drift in {feature_name}")

# 사용 예시
# detect_drift_ks(df_train, df_prod, 'age')
        

예제 2: PSI(Population Stability Index) 계산 함수 구현

현업에서 가장 많이 사용되는 지표인 PSI를 수동으로 계산하는 파이썬 로직입니다.

import pandas as pd

def calculate_psi(expected, actual, buckets=10):
    def get_counts(arr, bins):
        return pd.cut(arr, bins=bins).value_counts().sort_index()

    bins = np.histogram_bin_edges(expected, bins=buckets)
    expected_percents = get_counts(expected, bins) / len(expected)
    actual_percents = get_counts(actual, bins) / len(actual)
    
    # 0으로 나누기 방지
    expected_percents = expected_percents.replace(0, 0.0001)
    actual_percents = actual_percents.replace(0, 0.0001)

    psi = np.sum((actual_percents - expected_percents) * np.log(actual_percents / expected_percents))
    return psi
        

예제 3: Evidently AI 라이브러리를 이용한 통합 드리프트 대포트 생성

from evidently.report import Report
from evidently.metric_preset import DataDriftPreset

def generate_drift_report(reference, current):
    report = Report(metrics=[DataDriftPreset()])
    report.run(reference_data=reference, current_data=current)
    report.save_html("drift_report.html")

# 실무 적용: 스케줄러를 통해 매일 실행 후 대시보드 업데이트
        

예제 4: 예측 확신도(Confidence) 저하 모니터링

import matplotlib.pyplot as plt

def monitor_confidence(probs_list):
    avg_confidence = np.mean(np.max(probs_list, axis=1))
    if avg_confidence < 0.7:
        trigger_alert("Model confidence is below threshold!")
    return avg_confidence
        

예제 5: Concept Drift 감지를 위한 Page-Hinkley Test 구현

def page_hinkley_test(data, delta=0.005, lambda_=50):
    m_n = 0
    sum_res = 0
    mean_val = data[0]
    for i, x in enumerate(data):
        mean_val = mean_val + (x - mean_val) / (i + 1)
        sum_res += (x - mean_val - delta)
        m_n = min(m_n, sum_res)
        if sum_res - m_n > lambda_:
            return i, True # 드리프트 발생 시점 반환
    return None, False
        

예제 6: 피처 중요도(Feature Importance) 변화 추적

import xgboost as xgb

def check_feature_importance_drift(model, current_batch):
    # 현재 데이터로 임시 학습 후 중요도 비교
    temp_model = xgb.XGBClassifier().fit(current_batch['X'], current_batch['y'])
    original_importance = model.feature_importances_
    current_importance = temp_model.feature_importances_
    
    diff = np.linalg.norm(original_importance - current_importance)
    return diff
        

예제 7: 누락값(Missing Value) 급증 자동 알림 시스템

def check_null_drift(df, threshold=0.05):
    null_report = df.isnull().mean()
    for feature, rate in null_report.items():
        if rate > threshold:
            print(f"ALERT: {feature} has high missing rate: {rate:.2%}")
        

5. 해결 전략: Drift 감지 후의 액션 플랜

지표를 확인한 후에는 다음과 같은 해결 단계가 필요합니다.

  1. 원인 분석: 단순한 데이터 파이프라인의 오류인지(데이터 드리프트), 아니면 세상의 트렌드가 변한 것인지(컨셉 드리프트) 파악합니다.
  2. 데이터 샘플링: 드리프트가 발생한 시점 이후의 데이터를 집중적으로 수집하여 라벨링(Labeling)을 수행합니다.
  3. 재학습(Retraining): 최신 데이터를 포함하여 모델을 다시 학습시키고, 챔피언-챌린저 테스트(A/B Testing)를 거쳐 교체합니다.
  4. 피처 엔지니어링: 드리프트에 민감한 피처를 제거하거나 더 강건한(Robust) 피처로 교체합니다.

6. 결론 및 요약

머신러닝 모델의 성능 유지는 모니터링 대시보드 구축에서 시작됩니다. PSI와 KL Divergence를 통해 데이터의 변화를 선제적으로 감지하고, Accuracy와 Confidence 지표를 통해 모델의 유효성을 실시간으로 검증해야 합니다. 이 글에서 제시한 파이썬 기반의 구현 방법론은 실무 MLOps 구축에 있어 강력한 기준점이 될 것입니다.

 

출처 및 참고문헌:

  • Gama, J., et al. "A survey on concept drift adaptation." ACM computing surveys (CSUR).
  • Evidently AI Documentation: ML Monitoring and Drift Detection Concepts (2024).
  • Sculley, D., et al. "Hidden technical debt in machine learning systems." NIPS.
  • AWS Architecture Center: Monitoring Machine Learning Models for Drift.
728x90