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
각 데이터 포인트가 평균에서 몇 표준편차 떨어져 있는지 계산합니다.
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
핵심 아이디어: 이상치는 적은 분할로 고립됨
- 랜덤 피처, 랜덤 분할점 선택
- 재귀적으로 분할
- 고립까지의 경로 길이 측정
- 경로가 짧을수록 이상치
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
-
도메인 지식 활용
- 어떤 특성이 이상을 나타내는지 파악
- contamination 비율 사전 추정
-
다중 방법 앙상블
- 여러 방법의 결과를 결합 (투표 또는 점수 평균)
- 2개 이상이 이상으로 판단하면 이상으로 분류
-
스케일링
- StandardScaler 또는 RobustScaler 사용
- RobustScaler: 이상치에 강건
-
평가 지표
- Precision/Recall 트레이드오프 고려
- ROC-AUC, PR-AUC 활용
-
임계값 조정
- contamination, nu 파라미터 튜닝
- 비즈니스 요구사항에 맞게 조정
선택 가이드
| 상황 | 권장 알고리즘 |
|---|---|
| 대용량, 고차원 | Isolation Forest |
| 국소 이상치 | LOF |
| 정상 데이터만 있음 | One-Class SVM |
| 단변량, 정규분포 | Z-Score |
| 단변량, 이상치 존재 | IQR |
| 라벨 있음 | 지도학습 분류기 |
면접 질문 맛보기
- Isolation Forest의 원리는?
- LOF와 Global 이상치 탐지의 차이는?
- contamination 파라미터를 어떻게 설정하나요?
더 많은 면접 질문은 Premium Interviews (opens in a new tab)에서 확인하세요.
실습 노트북
노트북 추가 내용: 실습 노트북에서는 합성 데이터 생성 및 시각화, 각 알고리즘의 파라미터 영향 분석, 신용카드 사기 탐지 시뮬레이션 실습, ROC 곡선 및 Confusion Matrix 분석, 그리고 앙상블 이상탐지 연습 문제를 다룹니다.