728x90
Anomaly detection이란?
- 데이터에서 예상치 못한 패턴, 예상 범위를 벗어나는 이상점 등을 탐지하는 것
- 이상거래 탐지, 고객이탈, 설비예지 등으로 활용될 수 있음
- 대부분의 경우 정상 데이터와 비정상 데이터가 불균형하게 이루어져 있다는 특징이 있음
- 보통의 머신러닝 태스크 들과 동일하게 지도 / 비지도 / 반지도 학습으로 분류됨
- Supervised
- 정상, 비정상에 대한 라벨링이 되어 있어 두 정보를 모두 활용 가능한 경우 사용
- Unsupervised
- 레이블이 없는 데이터만을 가진 경우 사용
- 분포나 밀도를 기반으로 정상, 비정상 데이터를 구분
- Semi Supervised
- 데이터가 정상 데이터만 있는 경우 사용
- 정상 데이터만을 사용하여 학습을 하고, 학습된 특징과 부합하지 않는 경우 이상으로 탐지
- Supervised
Isolation Forest 란?
- 2008년에 Fei Tony Liu가 개발한 데이터 이상 탐지 알고리즘
- 바이너리 트리를 사용하여 이상치를 탐지
- 가정
- 이상치는 훨씬 더 적은 개체수로 구성이 되어 있을 것이다
- 그리고 일반 값과는 매우 다른 속성값을 가지고 있을 것이다
- 그래서 tree를 이용해서 특정 개체를 고립(isolation)시키는 경우, 이상치는 일반값보다는 더 적은 횟수로 가능할 것
- 특정 값을 고립시키는데 몇 번의 split이 필요한가? 하는 부분을 anomaly score 지표로 사용

- 위의 이미지처럼, 이상치가 아닌 xi의 경우 다른 데이터들과 모여있어 고립 시키는 데 많은 split이 필요하지만
- xo의 경우, 다른 데이터들과 떨어져있는 이상치이기 때문에 split하는 데 xi보다는 적은 횟수가 소요됨
- 어떤 것을 기준으로 split할까?
- 임의의 변수의 임의의 값을 이용해서 정말 랜덤으로 진행
- 이후 내가 고립시키고 싶은 값이 어디에 있는지 확인 후, 해당 값이 없는 쪽은 버림
- 랜덤의 랜덤을 반복하면 어느정도는 경향성을 나타낼 수 있고,
그걸 통해서 잘 작동하는 anomaly score를 산출 가능 - isolation tree를 만들어서 해당 tree를 충분히 많이 만들어서 일반성과 높은 판별력을 보장하려는 의도
- 임의의 변수의 임의의 값을 이용해서 정말 랜덤으로 진행
- 장점
- 대규모 데이터셋에서 잘 작동함 : 샘플링 및 트리구조의 이용으로 대규모 데이터에도 빠른 적용 가능
- 레이블이 필요하지 않음(Unsupervised) : 레이블이 없는 데이터에 직접 적용 가능
- 다양한 데이터 분포에 적용 가능 : 데이터의 분포 가정에 크게 의존하지 않아 다양한 유형의 데이터에 적용 가능
- 단점
- 파라미터 설정이 어려움 : 파라미터에 의존적인 모델 특성 상 실행을 통해 최적의 값을 찾아야 할 수 있음
- 결과 해석의 어려움 : 이상치 식별 후 과정에 대한 해석이 제공되지 않음
- 이상치 종류에 따른 제한 : global outlier 탐지에 이상적인 모델이므로, 데이터의 밀도가 높은 영역 또는 local outlier를 탐지하는데에는 덜 효과적일 수 있음
계산방식

- c(n) : 평균적인 path length
- h(x) : 1개의 트리에 대해 x를 고립시키기 위한 path length
- 계산하면 0에서 1사이의 값으로 나올 수 있게 됨.
- path length가 짧을수록 s(x,n)은 1에 가깝고, 길수록 0에 가까워짐
- 즉, Anomaly Score가 1에 가까울수록 이상치에 가깝고, 0에 가까울수록 정상치에 가깝다는 결론을 내릴 수 있음
파이썬 코드
- sklearn.ensemble 모듈 내에 IsolationForest가 구현이 되어 있어 어렵지 않게 사용이 가능
| 파라미터 | 기본값 | 설명 |
| n_estimators | 100 | 앙상블할 나무의 수, 많을수록 정확도는 높아지겠지만 학습시간이 길어짐 |
| max_samples | auto | 데이터셋에서 추출하는 샘플의 수 또는 비율 |
| contamination | auto | 데이터셋 내의 이상치 비율, 범위는 0 이상 0.5미만 |
| max_features | 1 | 고려하는 특성의 수 또는 비율, 1의 경우 모든 특성을 사용한다는 뜻. |
| bootstrap | FALSE | 개별 의사 결정 나무를 훈련시키는 데 부트스트랩 샘플을 사용 |
| n_jobs | None | 훈련시키는 데 사용되는 CPU 코어의 수, 기본적으로 1개 사용 |
| random_state | None | 결과의 재현 가능성을 위한 시드 설정 |
| verbose | None | 실행 과정 중 로그 출력 여부 및 양 설정 |
| warm_start | FALSE | 이전 훈련 모델을 사용하여 추가 학습 여부 설정 |
- 코드에서 가장 많이 활용한 부분은 contamination으로,
unsupervised task지만 이상치가 거의 발생하지 않는 부분이라 아주 작게 설정함 - 여러 부분에 활용하는 경우 warm_start 파라미터도 활용하면 더 좋을 것 같다는 생각
from sklearn.ensemble import IsolationForest
import numpy as np
# 주어진 데이터
minute = [1, 3, 5, 7, 9, 11, 13, 15, 16, 17, 18, 19, 21, 23]
data = [0.0, 0.1, 4, 0.1, 0.1, 0.0, 0.1, 0.1, 0.78, 0.9, 0.8, 0.1, 0.1]
# 데이터 변환
X = np.array(data).reshape(-1, 1)
# Isolation Forest 모델 생성
isolation_forest = IsolationForest(contamination='auto', random_state=42)
# 모델 학습
isolation_forest.fit(X)
# 이상치 탐지
outliers = isolation_forest.predict(X)
# 이상치 출력
print("Detected outliers:")
for i, outlier in enumerate(outliers):
if outlier == -1:
print(f"Data point at minute {minute[i]} is an outlier.")
참고자료
https://www.lamda.nju.edu.cn/publication/icdm08b.pdf
728x90