튜토리얼
09. Anomaly Detection

09. Anomaly Detection (이상치 탐지)

Isolation Forest, LOF, One-Class SVM


학습 목표

이 튜토리얼을 완료하면 다음을 할 수 있습니다:

  • 이상탐지의 개념과 다양한 유형(Point, Contextual, Collective)을 이해합니다
  • 통계적 방법(Z-Score, IQR)으로 간단한 이상치를 탐지합니다
  • 머신러닝 방법(Isolation Forest, LOF, One-Class SVM)을 구현하고 비교합니다
  • 실전 데이터(신용카드 사기 탐지 등)에 이상탐지를 적용합니다
  • 상황에 맞는 최적의 알고리즘을 선택합니다

핵심 개념

1. 이상치(Anomaly)란?

정상 데이터와 크게 다른 패턴을 가진 데이터입니다.

유형설명예시
Point Anomaly개별 데이터가 이상갑자기 높은 거래액
Contextual Anomaly특정 맥락에서 이상여름에 난방비 급증
Collective Anomaly그룹으로 이상연속된 비정상 심박

주요 활용 사례

  • 금융: 신용카드 사기 탐지
  • 제조: 불량품 탐지
  • 보안: 네트워크 침입 탐지
  • 의료: 이상 진단
  • IoT: 센서 이상 감지

2. 통계적 방법

Z-Score

각 데이터 포인트가 평균에서 몇 표준편차 떨어져 있는지 계산합니다.

Z=xμσZ = \frac{x - \mu}{\sigma}

from scipy import stats
import numpy as np
 
# 각 특성별 Z-score 계산
z_scores = np.abs(stats.zscore(X))
 
# 임계값 초과시 이상으로 판단 (일반적으로 |Z| > 3)
threshold = 3
anomalies = (z_scores > threshold).any(axis=1)

Z-Score 임계값: 일반적으로 3을 사용하지만, 데이터 특성에 따라 2~4 사이에서 조정할 수 있습니다. 정규분포를 가정하므로 분포가 다른 경우 주의가 필요합니다.

IQR (Interquartile Range)

사분위수 범위를 이용한 이상 탐지로, 이상치에 더 강건합니다.

Q1 = X.quantile(0.25)
Q3 = X.quantile(0.75)
IQR = Q3 - Q1
 
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
anomalies = ((X < lower) | (X > upper)).any(axis=1)

3. Isolation Forest

핵심 아이디어: 이상치는 적은 분할로 고립됨

  1. 랜덤 피처, 랜덤 분할점 선택
  2. 재귀적으로 분할
  3. 고립까지의 경로 길이 측정
  4. 경로가 짧을수록 이상치
from sklearn.ensemble import IsolationForest
 
iso_forest = IsolationForest(
    n_estimators=100,
    contamination=0.1,  # 예상 이상치 비율
    random_state=42
)
labels = iso_forest.fit_predict(X)  # 1: 정상, -1: 이상
scores = iso_forest.decision_function(X)  # 점수 (낮을수록 이상)
⚠️

contamination 파라미터: 예상되는 이상 비율을 설정합니다. 실제 이상 비율과 가깝게 설정해야 좋은 성능을 얻을 수 있습니다. 너무 높게 설정하면 정상 데이터를 이상으로, 너무 낮게 설정하면 이상을 놓칠 수 있습니다.

장점:

  • 고차원에서도 효과적
  • 빠른 학습/예측
  • 메모리 효율적

4. LOF (Local Outlier Factor)

핵심 아이디어: 지역 밀도 비교

  • 주변 이웃과 비교해 밀도가 낮으면 이상
  • 국소적 이상치 탐지에 효과적
  • LOF ≈ 1: 정상 (이웃과 비슷한 밀도)
  • LOF > 1: 이상 (이웃보다 낮은 밀도)
from sklearn.neighbors import LocalOutlierFactor
 
lof = LocalOutlierFactor(
    n_neighbors=20,
    contamination=0.1
)
labels = lof.fit_predict(X)  # 1: 정상, -1: 이상
scores = -lof.negative_outlier_factor_  # 높을수록 이상

n_neighbors 파라미터: 지역 밀도 계산에 사용할 이웃 수입니다. 작은 값은 국소적 이상에 민감하고, 큰 값은 전역적 패턴을 포착합니다. sklearn 기본값은 20이며, 데이터셋 크기와 특성에 따라 조정이 필요합니다.

⚠️

LOF 제한사항: fit_predict만 가능하며, 학습 후 새로운 데이터에 대한 예측이 어렵습니다. 새 데이터 예측이 필요하면 novelty=True 옵션을 사용하세요.


5. One-Class SVM

정상 데이터만으로 경계 학습하는 방법입니다. 커널 트릭으로 비선형 경계를 학습할 수 있습니다.

from sklearn.svm import OneClassSVM
 
ocsvm = OneClassSVM(
    kernel='rbf',
    nu=0.1,  # 이상치 비율 상한
    gamma='scale'
)
ocsvm.fit(X_train_normal)  # 정상 데이터만
labels = ocsvm.predict(X_test)  # 1: 정상, -1: 이상

6. 알고리즘 비교

알고리즘장점단점적합한 상황
Z-Score빠름, 해석 용이정규분포 가정단변량, 정규분포
IQR이상치에 강건단순함단변량, 이상치 존재
Isolation Forest빠름, 고차원파라미터 민감대용량, 고차원
LOF국소 이상 탐지느림, 밀도 가정클러스터 경계 이상
One-Class SVM복잡한 경계느림, 스케일링 필요정상 데이터만 있음

코드 요약

from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor
from sklearn.preprocessing import StandardScaler
 
# 스케일링 (필수!)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
 
# Isolation Forest
iso = IsolationForest(contamination=0.1, random_state=42)
iso_labels = iso.fit_predict(X_scaled)
 
# LOF
lof = LocalOutlierFactor(n_neighbors=20, contamination=0.1)
lof_labels = lof.fit_predict(X_scaled)
 
# 이상치 확인
print(f"Isolation Forest 이상치: {(iso_labels == -1).sum()}")
print(f"LOF 이상치: {(lof_labels == -1).sum()}")
⚠️

스케일링 필수: 특히 One-Class SVM과 LOF는 거리 기반이므로 반드시 스케일링이 필요합니다. 이상치가 있는 경우 RobustScaler를 사용하면 더 강건합니다.


평가 방법

레이블이 있는 경우:

from sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score
 
# -1 → 1로 변환 (이상=1)
y_pred = (labels == -1).astype(int)
 
print(f"Precision: {precision_score(y_true, y_pred):.4f}")
print(f"Recall: {recall_score(y_true, y_pred):.4f}")
print(f"F1: {f1_score(y_true, y_pred):.4f}")
 
# 점수 기반 평가 (Isolation Forest)
scores = -iso_forest.decision_function(X)  # 높을수록 이상
print(f"ROC-AUC: {roc_auc_score(y_true, scores):.4f}")

Precision vs Recall 트레이드오프: 사기 탐지처럼 이상을 놓치면 안 되는 경우 Recall을 중시하고, 오탐이 비용이 큰 경우 Precision을 중시합니다. 비즈니스 요구사항에 맞게 임계값을 조정하세요.


Best Practices

  1. 도메인 지식 활용

    • 어떤 특성이 이상을 나타내는지 파악
    • contamination 비율 사전 추정
  2. 다중 방법 앙상블

    • 여러 방법의 결과를 결합 (투표 또는 점수 평균)
    • 2개 이상이 이상으로 판단하면 이상으로 분류
  3. 스케일링

    • StandardScaler 또는 RobustScaler 사용
    • RobustScaler: 이상치에 강건
  4. 평가 지표

    • Precision/Recall 트레이드오프 고려
    • ROC-AUC, PR-AUC 활용
  5. 임계값 조정

    • contamination, nu 파라미터 튜닝
    • 비즈니스 요구사항에 맞게 조정

선택 가이드

상황권장 알고리즘
대용량, 고차원Isolation Forest
국소 이상치LOF
정상 데이터만 있음One-Class SVM
단변량, 정규분포Z-Score
단변량, 이상치 존재IQR
라벨 있음지도학습 분류기

면접 질문 맛보기

  1. Isolation Forest의 원리는?
  2. LOF와 Global 이상치 탐지의 차이는?
  3. contamination 파라미터를 어떻게 설정하나요?

더 많은 면접 질문은 Premium Interviews (opens in a new tab)에서 확인하세요.


실습 노트북

노트북 추가 내용: 실습 노트북에서는 합성 데이터 생성 및 시각화, 각 알고리즘의 파라미터 영향 분석, 신용카드 사기 탐지 시뮬레이션 실습, ROC 곡선 및 Confusion Matrix 분석, 그리고 앙상블 이상탐지 연습 문제를 다룹니다.


이전: 08. Dimensionality Reduction | 다음: 10. Imbalanced Data