본문 바로가기
홈 AI 학습 AI 실무 안내서 예측 모델 운영, 드리프트 감지와 재학습 시점
L3 심화 · 15분 읽기

예측 모델 운영, 드리프트 감지와 재학습 시점

2026.10.26 갱신 예측 모델을 만들어 운영 단계에 들어선 분석 담당자
#예측#드리프트#모니터링#재학습
검토 상태: 전문 검토 전 위험도 미분류

업무에 AI를 쓸 때 확인하면 좋은 방법과 점검 항목을 정리한 참고 자료입니다. 실제 업무에 적용할 때는 소속 기관의 기준과 담당자 검토를 함께 확인합니다.

지역별 화재 위험도 예측 모델 구축에서 만든 모델을 예방점검 배치의 참고 자료로 쓰기 시작하면 운영 문제가 남습니다. 재개발로 건물 분포가 바뀌거나 건조한 시기·신고 방식이 달라지면 코드가 그대로여도 예측이 맞지 않게 됩니다. 이때 오류 메시지는 나오지 않고, 위험 지도는 지난달과 같은 모양으로 계속 만들어집니다.

이 안내서는 통계 기법보다 운영 계획을 먼저 다룹니다. 배포한 모델을 다시 확인하는 시점, 재학습·교체·은퇴를 결정하는 사람, 남길 기록을 정하는 일입니다. 계산은 코드를 실행할 수 있는 AI에게 맡길 수 있지만, 비교 기준을 정하고 결과를 검산해 결정하는 일은 사람이 합니다.

소방청의 스마트 화재안전지수 분석사업처럼 공공 기관이 추진하는 위험도 예측 과제도 업무에 쓰려면 같은 운영 기준이 필요합니다. 영상 탐지 모델은 카메라별 오탐률과 확인 결과의 추세를 같은 방식으로 관리할 수 있습니다.

🎯 이 장의 목표
  • 모델을 다시 확인하는 시점, 결정하는 사람, 남길 기록을 운영 계획으로 정할 수 있습니다.
  • 롤링 백테스트로 모델의 평상시 변동 범위를 기록할 수 있습니다.
  • 성능·입력 분포·예정된 변화를 나눠 감시하고, 데이터 수집 사고와 실제 변화를 구분할 수 있습니다.
  • 재학습·유지·은퇴 후보를 같은 검증 기준으로 비교하고 결정 근거를 남길 수 있습니다.

AI에게 맡기는 프롬프트

매달 예측 직후의 입력 점검과 성능 기록을 코드를 실행할 수 있는 AI(파일 분석 기능이나 코딩 에이전트)에게 맡길 때 씁니다. 격자·월 단위로 집계한 입력 자료, 월별 포착률 기록, 모델 카드를 붙입니다. 신고자·주소가 남은 출동 원자료는 외부 AI에 넣지 않고, 집계 전 단계가 필요하면 승인된 내부 환경에서 실행합니다.

TEXT
[목적] 화재 위험도 예측 모델의 이번 달 운영 점검표를 만듭니다. 재학습 여부를 검토하는 담당자가 보는 자료입니다.
[자료] 붙임 파일: 학습 기간 입력 자료와 이번 달 입력 자료(격자·월 단위 집계), 월별 포착률 기록, 모델 카드
[작업]
- 핵심 피처마다 학습 기간 가운데 이번 달과 같은 달의 자료를 기준으로 PSI, 결측률, 표본 수를 계산해 주세요.
- 원천 건수와 결합률(원천 자료가 격자와 연결된 비율)을 지난달과 비교해 주세요.
- 포착률은 화재 집계가 확정된 달만 계산하고, 모델 카드의 기대 범위와 비교해 주세요.
- 계산 코드와 검산 결과(피처마다 표본 수 + 결측 수 = 이번 달 행 수, 결합 전후 행 수)를 함께 보여 주세요.
[완성 기준] 피처별 한 줄 표, 그리고 기준을 넘은 항목마다 먼저 확인할 데이터 원인(결측·단위·코드 개편·표본 수) 목록
[하지 말 것] 재학습, 모델 교체, 예측 결과 공유 중단이나 재개는 실행하거나 확정하지 말고 담당자 검토 항목으로 적어 주세요.
자료에 없는 값은 만들지 말고 [확인 필요]로 남겨 주세요.
확인 기준은 https://119-ai-studio.kr/model-drift-ops.html 안내서를 따릅니다.
작업 전에 빠진 정보가 있으면 먼저 질문해 주세요.

결과를 받은 뒤 확인할 것은 다음과 같습니다.

  • 비교 기준이 학습 기간 가운데 같은 달 자료인지 코드에서 확인합니다.
  • 결측률과 표본 수가 PSI와 별도 열로 나왔고, 검산 결과가 출력에 실제로 찍혔는지 봅니다.
  • 집계가 확정되지 않은 달의 포착률이 섞이지 않았는지 봅니다.
  • 재학습이나 교체를 결론처럼 적은 문장이 없는지 봅니다.

운영 계획에 먼저 적을 것

모델을 배포하기 전에 다음 네 가지를 문서로 정합니다. 분석 도구와 모델이 바뀌어도 이 결정은 기관이 직접 해야 합니다.

  • 쓰는 곳과 범위: 예측 결과를 어느 업무에 어디까지 참고하는지 적습니다. 예를 들어 예방점검 배치의 참고 자료로만 쓰고 단독 근거로는 쓰지 않는다고 정합니다.
  • 확인 시점과 통과 기준: 아래 표처럼 무엇을 언제 보고 어떤 값이면 통과인지 적습니다.
  • 결정하는 사람: 예측 결과 공유 중단, 재학습, 교체, 은퇴를 누가 승인하는지 적습니다. 모델 담당자 혼자 정하지 않고 결과를 쓰는 업무 담당이 함께 승인합니다.
  • 기록과 받아야 할 자료: 모델 카드와 월별 점검표를 남깁니다. 원천 자료의 변경 안내(행정코드 개편, 기상·건축물대장 API 변경)와 화재 집계 확정 일정을 누가 받아 알릴지도 정합니다.
언제무엇을통과 기준기준을 넘으면
매월 예측 직후원천 건수·결측률·결합률지난달과 비슷한 범위수집·결합 단계를 점검하고, 필요하면 승인을 받아 예측 결과 공유를 멈춤
매월 예측 직후핵심 피처 PSI(같은 달 기준)0.25 미만데이터 원인을 확인하고 다음 달 다시 측정
매월 화재 집계 확정 후상위 K% 포착률모델 카드의 기대 범위 안2기간 연속 벗어나면 재학습 검토
재학습 검토 때신구 모델·베이스라인 비교, 점검 이력 분포같은 기간에서 새 모델이 우세담당자 승인 후 교체하고 모델 카드 이력 갱신

하지 말 것도 함께 적어 둡니다.

  • 경보 하나로 재학습이나 모델 교체를 자동 실행하지 않습니다.
  • 계절을 따라 움직이는 피처를 학습 기간 전체 분포와 비교하지 않습니다.
  • 결과가 확정되지 않은 달의 포착률로 성능을 판단하지 않습니다.

감시할 세 가지 신호

신호무엇을 보나성격
1 성능 하락상위 K% 포착률의 추세확실하지만 늦습니다. 화재 집계가 확정된 뒤에 계산됩니다.
2 입력 드리프트피처 분포의 변화(PSI)와 결측률간접적이지만 빠릅니다. 예측을 돌릴 때 바로 계산됩니다.
3 예정된 변화계절 전환, 원천 자료 개편, 행정구역·격자 변경미리 알 수 있습니다. 달력에 적어 둡니다.

포착률은 실제 화재 가운데 모델이 고른 상위 K% 구역에서 난 화재의 비율입니다. 운영 중 입력 자료나 입력과 결과의 관계가 학습 때와 달라지는 현상을 드리프트라고 합니다. 세 신호는 알려 주는 시점과 확실성이 다르므로 함께 봅니다.

1. 백테스트로 평상시 변동 범위 재기

전편의 시간 분할 검증은 한 번의 시험입니다. 운영 판단에는 기준 시점을 옮겨 가며 같은 검증을 여러 번 반복해 성능이 평소 얼마나 오르내리는지 알아야 합니다. 이 범위가 없으면 운영 중 점수가 떨어졌을 때 평소 변동인지 실제 하락인지 구분할 수 없습니다.

PYTHON
import pandas as pd

# 롤링 백테스트: 기준월을 한 달씩 밀며 '확정된 과거로 학습 → 그 달 검증'을 반복합니다
# '기간' 열은 "YYYY-MM" 문자열이라고 가정합니다
LAG = 1   # 화재 집계가 확정되기까지 걸리는 달 수(기관 기준으로 정함)
scores = []
for cut in pd.period_range("2025-01", "2025-12", freq="M"):
    train = df[df["기간"] < str(cut - LAG)]   # 예측 시점에 확정된 결과까지만
    test  = df[df["기간"] == str(cut)]
    m = fit_model(train)                      # 전편의 모델 학습 그대로
    topk = predict_topk(m, test, k=0.10)      # 위험 상위 10% 구역
    hit = test[test["격자"].isin(topk)]["화재"].sum() / max(test["화재"].sum(), 1)
    scores.append({"기준월": str(cut), "포착률": hit})

bt = pd.DataFrame(scores)
print(bt["포착률"].mean(), bt["포착률"].std())   # 예: 평균 0.61 ± 0.08 (가상 수치)

AI가 만든 백테스트 코드에서는 학습 구간의 끝을 먼저 봅니다. 예측 시점에 집계가 확정되지 않은 달을 학습에 넣으면 운영에서는 얻을 수 없는 결과로 점수가 계산됩니다. LAG는 기관의 집계 확정 일정에 맞추고, scikit-learn의 TimeSeriesSplit을 쓴 코드라면 gap이 월수가 아니라 제외할 행 수라는 점을 확인합니다.

격자×월 자료는 같은 달의 행을 함께 나누고, 학습 마지막 달과 예측 달 사이에 집계 확정 지연이 들어갔는지 봅니다. 이렇게 얻은 범위가 모델 카드의 기대 범위가 되고, 이 범위 아래로 내려가는 것이 신호 1입니다.

2. 입력 분포 감시

입력 피처의 분포는 예측을 돌리는 시점에 바로 비교할 수 있어서, 성능이 떨어지기 전에 원인을 찾아볼 수 있습니다. 흔히 쓰는 지표 하나가 PSI(Population Stability Index)입니다. 두 분포를 같은 구간으로 나눠 구간별 비율 차이를 합산한 값입니다.

PYTHON
import numpy as np

def psi(train_col, live_col, bins=10):
    """기준 분포 대비 현재 분포의 이동량. 구간은 기준 분포의 분위수로 나눕니다.
    결측은 세지 않으므로 결측률은 따로 봅니다.
    이진·범주 피처는 구간이 겹치므로 범주별 비율로 따로 계산합니다."""
    edges = np.quantile(train_col.dropna(), np.linspace(0, 1, bins + 1))
    edges[0], edges[-1] = -np.inf, np.inf
    p = np.histogram(train_col.dropna(), bins=edges)[0] / max(train_col.notna().sum(), 1)
    q = np.histogram(live_col.dropna(),  bins=edges)[0] / max(live_col.notna().sum(), 1)
    p, q = np.clip(p, 1e-4, None), np.clip(q, 1e-4, None)   # 0 나눗셈 방지
    return float(np.sum((q - p) * np.log(q / p)))

# 비교 기준은 학습 기간 가운데 이번 달과 같은 달의 자료입니다
ref = train_df[train_df["월"] == live_df["월"].iloc[0]]
for col in ["건조지수", "건물나이", "최근출동"]:            # 전편의 핵심 피처
    print(col, round(psi(ref[col], live_df[col]), 3),
          "결측률", round(live_df[col].isna().mean(), 3),
          "표본", int(live_df[col].notna().sum()))

건조지수처럼 계절을 따라 움직이는 피처를 학습 기간 전체 분포와 비교하면, 실제 변화가 없어도 PSI가 매달 크게 나옵니다. 그래서 비교 기준을 학습 기간 가운데 같은 달 자료로 잡습니다. 결측률과 표본 수는 PSI에 드러나지 않으므로 따로 출력합니다.

PSI해석대응
< 0.1안정없음
0.1 ~ 0.25주의: 분포가 움직이는 중원인 확인, 다음 달 다시 측정
> 0.25경보: 학습 때와 분포가 크게 다름데이터 원인을 확인한 뒤 재학습 검토(신호 2)

0.1과 0.25는 기관 자료로 정한 값이 아닌 예시 경계값이므로, 평상시 PSI 범위도 백테스트 기간에서 함께 기록해 둡니다. PSI는 표본이 적을수록 크게 흔들립니다. 그 달 표본이 학습 기간 같은 달 표본보다 크게 적으면 PSI를 판단에 쓰지 않고, 다음 달 자료와 합쳐 다시 계산합니다. 관할 재개발로 신축 건물이 많이 들어와 건물나이 분포가 낮은 쪽으로 쏠린 경우처럼 실제 변화로 확인되면 재학습을 검토합니다.

💡 팁
PSI가 크게 나오면 먼저 데이터 쪽 사고를 의심합니다. 기상 자료의 단위 변경, 건축물대장 항목 개편, 결측 급증처럼 수집·정제 단계의 문제가 입력 변화처럼 보일 수 있습니다. 원천 자료가 바뀌었는지는 공공 데이터 카드(관측·레이더·위성 기상자료, 건축물대장 속성 조회)의 공식 문서 링크에서 확인합니다. 수집 과정이 깨진 것이면 재학습하지 않고 수집·결합 단계를 고칩니다.

3. 재학습 조건

"분기마다 재학습"처럼 주기로만 정하면 변화가 없는 분기에는 불필요한 작업이 되고 변화가 큰 달에는 늦으므로, 재학습을 검토할 조건을 정해 둡니다.

  • 조건 ① 성능: 상위 K% 포착률이 기대 범위 하한 아래로 2기간 연속
  • 조건 ② 입력: 데이터 원인을 확인한 뒤에도 핵심 피처의 같은 달 기준 PSI > 0.25
  • 조건 ③ 예정된 변화: 난방기 진입·해제(계절 전환), 원천 자료 개편, 행정구역·격자 변경

재학습할 때는 전편의 절차(시간 분할 검증, 베이스라인 비교)를 다시 밟고, 이전 모델과 같은 검증 기간에서 나란히 비교해 나을 때만 교체합니다. 교체할 때는 학습 데이터 기간·코드 버전·검증 점수를 기록하고 담당자가 승인합니다.

모델 카드

담당자가 바뀌어도 모델을 설명할 수 있도록 카드 한 장을 모델과 함께 보관합니다. 실험·모델·평가 기록을 한곳에서 관리하려면 MLflow 같은 도구에 카드 내용을 함께 남길 수 있습니다.

TEXT
[모델 카드] 화재 위험도 v3 (2026-07 재학습, 가상 예시)
- 목적: 격자별 월간 화재 위험 우선순위 (상위 10% 예방점검 배치 참고, 단독 근거로 쓰지 않음)
- 학습 데이터: 2022-01 ~ 2026-05 (출동·기상·건축물대장, 격자 500m)
- 기대 성능: 상위 10% 포착률 0.61 ± 0.08 (롤링 백테스트 12회)
- 알려진 한계: 신축 밀집 지역 과소평가 경향, 점검 이력 피드백 편향
- 재학습 조건: 포착률 < 0.53 2개월 연속 / 같은 달 기준 핵심 피처 PSI > 0.25 / 계절 전환
- 결정: 모델 담당 부서가 검토, 예방 업무 담당이 승인
- 이력: v1 2025-03, v2 2025-11, v3 2026-07
▸ 소방 활용 포인트
순찰·예방점검 배치에 참고하는 위험 지도를 언제까지 쓸 수 있는지 기록으로 관리합니다. 포착률 기대 범위와 월별 입력 점검표는 모델을 계속 쓸지 판단하는 근거가 되고, 모델 카드는 담당자가 바뀌어도 같은 기준을 이어 쓰게 합니다.

설계 판단

경보가 났을 때의 선택지는 재학습만이 아닙니다. 원인이 데이터 장애면 먼저 수집·결합 단계를 고치고, 그 뒤에 아래 세 가지 가운데 하나를 고릅니다.

선택지맞는 상황트레이드오프사람이 확인할 것
기존 모델 유지성능이 기대 범위에 있고 입력 변화의 원인이 설명될 때불필요한 교체를 피하지만 늦게 나타나는 하락을 계속 감시최신 표본과 예외 구역
조건부 재학습수집 오류를 제거한 뒤에도 입력·성능 변화가 반복될 때새 데이터에 맞추며 과거 조건의 성능을 잃을 수 있음신구 모델의 같은 기간 비교
은퇴 후 베이스라인 사용데이터가 희소하거나 새 모델이 반복 검증에서 이점을 보이지 못할 때자동화 범위는 줄지만 설명 가능한 기준으로 돌아감남아 있는 업무 필요와 사람 검토 여력

운영 시나리오

아래 두 사례는 실제 성능·기관 수치가 아닌 가상 운영 연습입니다. 경보가 났을 때 원인을 확인하는 순서를 보여 줍니다.

가상 시나리오 1: 행정코드 결합률이 급격히 떨어진 경우

  • 탐지: 성능을 평가할 시점은 아직 아닌데 입력 열의 결측과 결합 실패 기록이 함께 늘었습니다.
  • 원인 가설: 위험 분포가 바뀐 것이 아니라, 원천 행정코드 개편이 대응표에 반영되지 않아 특정 구역 자료가 빠졌다고 봅니다.
  • 대응: 담당자 승인을 받아 예측 결과 공유를 멈추고 원천 건수·고유 키·결합률을 대조합니다. 법정동·행정구역 코드 조회에서 개편된 코드를 확인해 대응표를 고친 뒤 같은 입력을 다시 처리합니다.
  • 재발 확인: 재처리 전후의 결합률과 예측 분포를 비교하고, 코드 개편 사례를 수집 점검용 시험 자료에 추가합니다.

가상 시나리오 2: 입력 분포는 비슷한데 실제 포착률이 낮아진 경우

  • 탐지: 핵심 피처의 분포 신호는 평상 범위였지만, 늦게 확정된 결과로 계산한 포착률이 기대 범위 밖에 머물렀습니다.
  • 원인 가설: 점검·신고 과정이 바뀌어 피처와 결과 사이의 관계가 달라졌거나, 결과 확정 지연이 비교 구간에 섞였다고 봅니다.
  • 대응: 즉시 재학습하지 않고 시기·구역·데이터 확정 상태로 하락 항목을 나눕니다. 기존 모델의 활용 범위를 줄이고 재학습 후보와 은퇴 후보를 함께 만듭니다.
  • 재발 확인: 확정된 같은 기간 여러 개로 기존·재학습·베이스라인을 비교하고, 하락 구간이 반복되지 않음을 확인한 후 담당자가 교체를 승인합니다.

한계와 리스크

리스크발생 조건영향완화·사람 승인
간접 지표에 의한 오경보계절 변동이나 적은 표본으로 PSI가 커졌지만 업무 성능은 유지됨불필요한 재학습과 운영 부담같은 달 기준·표본 수·수집 장애·실제 성능을 함께 보고 담당자가 재학습 검토 승인
재학습으로 과거 성능 손실최근 데이터에만 맞춘 후보를 바로 교체함과거 계절·예외 구역에서 품질 하락신구 모델을 같은 여러 기간에서 비교하고 업무 담당자 승인
피드백 편향의 고착모델 순위로 배치한 기록을 다시 학습함자주 본 구역은 더 위험하게, 사각지대는 더 안전하게 보임정기 점검 범위와 점검 선택 이력을 별도 검토하고 자원 배분은 사람 승인
⚠️ 흔한 실수
드리프트 지표는 간접 신호입니다. PSI가 낮아도 입력과 결과의 관계는 바뀔 수 있습니다. 전편의 피드백 루프 편향은 재학습을 반복할수록 굳어질 수 있으므로 재학습 때마다 점검 이력 분포를 함께 봅니다. 모델을 은퇴할 때는 대체 기준(베이스라인·사람 검토)을 먼저 정해 둡니다.

자주 묻는 질문

Q. PSI가 기준을 넘으면 바로 재학습해야 하나요?

아닙니다. 결측·단위·항목 구조 변경·결합 실패와 표본 수를 먼저 확인하고, 계절 피처라면 같은 달 기준으로 비교했는지도 봅니다. 수집 장애면 모델을 다시 학습하지 않고 수집·결합 단계를 고칩니다.

Q. 입력 드리프트가 없으면 모델은 안전한가요?

그렇지 않습니다. 입력 분포가 비슷해도 입력과 결과의 관계가 바뀌면 성능은 낮아집니다. 늦게 확정되는 성능 지표와 예외 표본을 계속 보아야 합니다.

Q. 모델을 은퇴하는 것은 실패인가요?

아닙니다. 신호가 약하거나 데이터 사각지대를 설명하기 어려울 때 설명 가능한 베이스라인과 사람 검토로 돌아가는 것도 운영 판단입니다. 은퇴하기 전에 대체 기준과 그 기준을 쓸 업무 담당을 정해 둡니다.

핵심 정리

  • 배포 전에 쓰는 범위, 확인 시점과 통과 기준, 결정하는 사람, 남길 기록을 운영 계획에 적습니다.
  • 성능·입력 분포·예정된 변화는 속도와 의미가 다른 신호이므로 나눠 보고, 계절 피처는 같은 달끼리 비교합니다.
  • 경보 뒤에는 결측·단위·코드 개편·표본 수 같은 데이터 원인을 먼저 확인합니다.
  • 재학습·교체·은퇴는 같은 기간·지표·베이스라인으로 비교한 뒤 담당자가 승인하고 모델 카드에 기록합니다.

다음 단계