블로그

Isolation Forest 를 일주기 데이터에 맞춰 변형하기

발행: 2026-03-15 · 태그: algorithm, anomaly-detection, isolation-forest

표준 알고리즘이 잡지 못하는 일주기

Isolation Forest 는 데이터가 시간 독립적이라는 가정을 깔고 동작한다. 그런데 한국 블로그 트래픽에는 강한 일주기 (diurnal) 가 있다 — 새벽엔 거의 0, 점심엔 피크.

표준 알고리즘을 그대로 쓰면 새벽 sample 이 시간대 무관하게 "낮은 값" 으로 분류돼 이상치 판정된다. 사람의 자연스러운 새벽 트래픽이 정상 패턴인데도 오탐 (false positive) 이 잦았다.

변형 — 시간대별 robust z-score 버킷팅

해법은 단순하다. 시간대별로 데이터를 분리 한 뒤 각 bucket 안에서 robust z-score 를 계산. 의사코드:

시간대별 이상치 판정 (의사코드)
for hour in 0..23:
  bucket = samples_at(hour)
  m = median(bucket)
  mad = median(|bucket - m|)        // robust scale estimate
  for x in bucket:
    z = (x - m) / (1.4826 * mad)
    if |z| > threshold: anomaly(x)

핵심 아이디어: 새벽 3시 sample 은 새벽 3시끼리만 비교. "새벽인데 평균 값" 자체는 이상치로 잡히지 않고, "새벽인데 평균보다 5배 높은" sample 만 이상치로 잡힌다 — 이게 봇이 발화하는 시간대.

트레이드오프 — 어디가 좋아지고 어디가 나빠졌나

같은 검증 표본 위에서 두 방식의 분류 지표를 비교:

분류 지표 변화 (표준 → 시간대별 변형)
참 양성
약 -4%p미미한 손실
오탐
약 -3/4사용자 신뢰 win
정밀도
약 +1/4분기점

새 트레이드오프 — bucket size 가 작은 시간대

시간대 bucket 이 작아지면 (예: 새벽 시간대) median/MAD 통계가 불안정 해진다. 표본이 부족할 땐 시간대를 borrowing 하거나 점수 신뢰도를 낮춰 사용자에게 "데이터 수집 중" 으로 표시 — 절대값이 아니라 추세 가 잡힐 때까지 판정을 미룬다.

알고리즘 상세는 고급 분석 문서 참고. 일주기 패턴 자체에 대한 설명은 정상 패턴 분석 에 있다.

관련 글