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

[PYTHON] 모델 재학습(Retraining) 트리거 조건 설정을 위한 3가지 전략과 드리프트 해결 방법

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

Retraining
Retraining

 

머신러닝 모델은 배포되는 순간부터 성능이 저하되기 시작합니다. 이를 방지하기 위한 핵심 프로세스가 바로 모델 재학습(Retraining)입니다. 하지만 무분별한 재학습은 컴퓨팅 자원의 낭비를 초래하고, 반대로 너무 늦은 재학습은 비즈니스 손실을 일으킵니다. 본 가이드에서는 운영 환경에서 모델을 언제 다시 학습시켜야 하는지에 대한 3가지 핵심 트리거 전략과 Python을 활용한 실무 구현법을 상세히 다룹니다.


1. 모델 재학습이 필요한 결정적 이유: 드리프트(Drift)

현실 세계의 데이터 분포는 시간이 흐름에 따라 변합니다. 학습 데이터($D_{train}$)와 운영 데이터($D_{serving}$) 사이의 통계적 불일치가 발생하는 현상을 드리프트라고 합니다. 드리프트가 감지되었을 때 적절한 트리거 조건을 발동시켜 모델을 갱신하는 것이 MLOps의 정수입니다. 트리거 조건은 단순히 '시간'에 의존하는 것을 넘어, 성능 지표와 데이터의 통계적 특성을 결합하여 설정해야 합니다.

2. 재학습 트리거 전략 3가지 비교 및 차이점

운영 환경의 복잡도와 피드백 루프의 속도에 따라 최적의 전략을 선택해야 합니다.

구분 일정 기반 트리거 (Schedule-based) 성능 기반 트리거 (Performance-based) 데이터 기반 트리거 (Data-drift-based)
핵심 개념 정해진 주기(일/주/월)마다 학습 실제 예측 정확도 하락 시 학습 입력 데이터 분포 변화 감지 시 학습
장점 구현이 가장 단순하고 예측 가능함 성능 저하에 가장 직접적으로 대응 정답(Label)이 없어도 선제적 대응 가능
단점 불필요한 리소스 낭비 가능성 Ground Truth 수집에 지연 발생 시 불가 분포 변화가 항상 성능 하락은 아님
해결 과제 최적의 주기 산정 지연된 피드백 루프 설계 통계적 유의수준(p-value) 설정

3. 실무 적용을 위한 7가지 재학습 트리거 구현 예제 (Python)

개발자가 MLOps 파이프라인(Airflow, Kubeflow 등)에 즉시 통합할 수 있는 전문적인 Python 코드 예제입니다.

Example 1: PSI(Population Stability Index)를 이용한 데이터 드리프트 감지

두 데이터셋의 분포 차이를 하나의 수치로 요약하여 트리거를 발동시키는 가장 표준적인 방법입니다.

import numpy as np

def calculate_psi(expected, actual, buckets=10):
    def get_probs(data, bins):
        counts, _ = np.histogram(data, bins=bins)
        return counts / len(data)

    breakpoints = np.percentile(expected, np.arange(0, 100, 100 // buckets))
    expected_probs = get_probs(expected, breakpoints)
    actual_probs = get_probs(actual, breakpoints)

    # 0으로 나누기 방지
    actual_probs = np.where(actual_probs == 0, 0.0001, actual_probs)
    expected_probs = np.where(expected_probs == 0, 0.0001, expected_probs)

    psi_value = np.sum((actual_probs - expected_probs) * np.log(actual_probs / expected_probs))
    return psi_value

# 트리거 조건: PSI > 0.2 (심각한 분포 변화)
if calculate_psi(train_data, serving_data) > 0.2:
    trigger_retraining_pipeline()
        

Example 2: Page-Hinkley Test를 활용한 성능 하락 실시간 탐지

시계열 예측 성능에서 평균치의 급격한 변화를 감지하여 재학습 신호를 보냅니다.

def page_hinkley_trigger(errors, threshold=50, alpha=1 - 0.0001):
    sum_errors = 0
    mean_error = np.mean(errors)
    values = []
    
    for error in errors:
        sum_errors = alpha * sum_errors + (error - mean_error)
        values.append(sum_errors)
        
    if np.max(values) - np.min(values) > threshold:
        return True # 트리거 발동
    return False
        

Example 3: Kolmogorov-Smirnov (K-S) Test 기반 특징량 검증

특정 중요 피처의 통계적 분포가 달라졌는지 p-value를 통해 정밀하게 검사합니다.

from scipy.stats import ks_2samp

def check_feature_drift(train_feat, serving_feat, alpha=0.05):
    stat, p_value = ks_2samp(train_feat, serving_feat)
    if p_value < alpha:
        print(f"Drift detected in feature! p-value: {p_value}")
        return True
    return False
        

Example 4: 윈도우 기반 이동 평균 정확도(Moving Average Accuracy) 모니터링

최근 N개의 예측 결과에 대한 정확도가 임계값 미만으로 떨어질 때 해결책을 제시합니다.

import pandas as pd

def check_accuracy_threshold(performance_history, window=1000, threshold=0.85):
    # performance_history: [1, 0, 1, 1, ...] (1: 정답, 0: 오답)
    recent_accuracy = pd.Series(performance_history).rolling(window=window).mean().iloc[-1]
    
    if recent_accuracy < threshold:
        return "TRIGGER_RETRAIN"
    return "STABLE"
        

Example 5: 데이터 양적 변화(Data Volume) 트리거 설정

새로 수집된 정답 레이블 데이터가 기존 학습 데이터의 20%를 초과할 때 재학습을 트리거합니다.

def check_data_volume_trigger(new_data_path, train_data_count):
    new_data_count = len(pd.read_csv(new_data_path))
    if (new_data_count / train_data_count) >= 0.2:
        return True
    return False
        

Example 6: 비지도 학습(Clustering)을 이용한 이상치 비율 트리거

운영 데이터 중 기존 군집에 속하지 않는 이상치(Outlier) 비율이 급증할 때를 대비합니다.

from sklearn.ensemble import IsolationForest

def outlier_ratio_trigger(train_data, serving_data, threshold=0.1):
    clf = IsolationForest().fit(train_data)
    outliers = clf.predict(serving_data)
    outlier_ratio = np.sum(outliers == -1) / len(serving_data)
    
    return outlier_ratio > threshold
        

Example 7: Airflow DAG에서의 트리거 센서(Sensor) 연동

조건이 충족될 때까지 대기하다가 재학습 파이프라인을 실행하는 논리적 구조입니다.

# 개념 예시: PythonOperator 내에서 조건 검사 후 가변적 실행
def drift_check_and_trigger(**context):
    drift_detected = perform_drift_analysis()
    if drift_detected:
        return 'run_retraining_job'
    else:
        return 'skip_retraining'
        

4. 결론: 자동화된 재학습 파이프라인의 완성

효율적인 모델 재학습 트리거 전략은 '비용''신뢰도' 사이의 균형을 잡는 것입니다. 초기에는 일정 기반 트리거로 시작하되, 시스템이 안정화됨에 따라 PSIK-S Test를 결합한 데이터 기반 트리거로 고도화하는 것을 권장합니다. 단순히 재학습을 시키는 것에서 멈추지 않고, 재학습된 모델의 성능이 기존 모델(Champion)보다 우수한지 검증하는 AB Test 단계까지 자동화해야 진정한 MLOps를 완성할 수 있습니다.

내용 출처 및 참고 문헌

  • Google Cloud Architecture Center: "MLOps: Continuous delivery and automation pipelines in machine learning"
  • N. Polyzotis et al., "Data Validation for Machine Learning," SysML 2019.
  • Evidently AI: "How to break down Data Drift"
  • Microsoft Azure Machine Learning: "Retrain models with Azure Machine Learning"
728x90