본문 바로가기
C.W.K.
Stream
Lesson 04 of 05 · published

Drift Monitoring

~28 min · drift, monitoring, production

Level 0Scout
0 XP0/48 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

배포 순간부터 자료는 움직여

모델은 과거의 특정 자료 분포에서 배운 결과물이야. 마케팅, 가격, 계절, 제품 화면, 수집 코드가 바뀌면 입력과 사용자 행동도 달라져. 서비스가 오류 없이 응답해도 예측 품질은 조용히 나빠질 수 있어. 그래서 변화 감시는 선택 기능이 아니라 모델 운영 계약의 일부야.

입력 이동

입력 이동은 특성 분포가 기준 기간과 달라지는 현상이야. 새 캠페인이 사용자 구성을 바꾸거나 단위 변경이 금액 열을 열 배로 만들 수 있어. 수치 열에는 분위수, 결측률, Kolmogorov-Smirnov 통계나 PSI를, 범주 열에는 값 비율과 처음 보는 범주 비율을 비교해. 중요한 열뿐 아니라 입력 스키마와 행 수 자체도 봐야 해.

출력 이동

입력 열 하나하나는 안정돼 보여도 특성 조합이 달라져 예측 확률 분포나 양성 판정률이 움직일 수 있어. 점수의 평균, 분위수, 문턱 이상 비율, 상위 K개 점수를 시간에 따라 봐. 출력 이동은 경보 신호이지 성능 저하의 증명은 아니야. 실제 양성 비율이 바뀌었거나 문턱 정책이 달라진 결과일 수도 있어.

개념 이동

개념 이동은 같은 입력과 목표 사이 관계가 달라지는 현상이야. 사기범이 탐지 규칙에 적응하거나 가격 정책이 수요 반응을 바꾸는 경우지. 입력 분포가 거의 같아도 모델 오류가 늘 수 있어. 실제 정답이 도착한 운영 자료에서 PR-AUC, 보정, 비용, 범주별 오류를 이동 창으로 계산해야 직접 확인할 수 있어.

기준 창을 버전으로 고정해

‘학습 자료’라는 모호한 기준 대신 어느 날짜와 모델 버전의 어떤 행을 참조하는지 저장해. 계절이 강한 서비스는 지난주보다 전년 같은 주와 비교해야 정상 계절 변화를 오경보로 부르지 않아. 새 모델을 배포하면 기준 창을 언제 바꿀지도 규칙으로 정하고 이전 모델과 비교 가능하게 남겨.

경보 문턱은 행동과 연결해

PSI 0.10 같은 관습 숫자를 이유 없이 복사하지 마. 경보가 울렸을 때 누가 원천 자료, 제품 변경, 모델 지표를 확인하고 어떤 조건에서 제공을 중단할지 정해야 해. 경고, 심각 두 수준과 최소 지속 시간을 두면 한 시간의 잡음 때문에 재학습하는 일을 줄일 수 있어.

재학습은 자동 치료가 아니야

입력 이동이 자료 버그라면 새 자료로 재학습할수록 버그를 배워. 정답 정책이 바뀌었다면 과거와 새 정답을 그냥 섞어도 안 돼. 원인을 확인하고 새 자료의 품질과 범위를 검증한 뒤 같은 시험 관문을 통과해야 해. 주간 같은 정기 일정은 후보를 만들 수 있지만 자동 승격은 별도 위험이야.

새 모델은 그림자와 단계 배포로 확인해

후보 모델을 실제 요청에 그림자 실행해 출력 분포, 응답 시간, 오류를 기존 모델과 비교하고 사용자 행동에는 아직 쓰지 마. 검증되면 일부 트래픽에 점진 배포하고 사업 지표와 안전 지표를 본 뒤 확대해. 기준을 벗어나면 이전 모델이나 규칙으로 돌아갈 수 있도록 결과물과 문턱을 함께 보존해.

Code

두 기간을 비교하는 PSI·python
import numpy as np

def psi(reference, current, bins=10):
    edges = np.quantile(reference, np.linspace(0, 1, bins + 1))
    edges[0], edges[-1] = -np.inf, np.inf
    p_ref, _ = np.histogram(reference, bins=edges)
    p_cur, _ = np.histogram(current, bins=edges)
    p_ref = np.clip(p_ref / p_ref.sum(), 1e-6, None)
    p_cur = np.clip(p_cur / p_cur.sum(), 1e-6, None)
    return ((p_cur - p_ref) * np.log(p_cur / p_ref)).sum()

for col in numeric_cols:
    score = psi(reference[col], current[col])
    if score > 0.20:  # >0.10 = caution, >0.25 = serious
        print(f"⚠️  PSI {col} = {score:.3f}")
예측 확률 변화로 출력 이동 감시하기·python
from scipy.stats import ks_2samp

stat, pval = ks_2samp(reference_probs, current_probs)
if pval < 0.01:
    alert("output distribution drifted", stat=stat, pval=pval)

External links

Exercise

모델의 주요 특성 다섯 개를 골라 기준 학습 창과 최근 2주 운영 자료 사이 PSI, 결측률, 처음 보는 범주 비율을 계산해. PSI가 0.10을 넘는 특성마다 원인 가설과 확인할 원천을 한 문장으로 적어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.