블로그
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 하거나 점수 신뢰도를 낮춰 사용자에게 "데이터 수집 중" 으로 표시 — 절대값이 아니라 추세 가 잡힐 때까지 판정을 미룬다.
알고리즘 상세는 고급 분석 문서 참고. 일주기 패턴 자체에 대한 설명은 정상 패턴 분석 에 있다.