본문 바로가기
AI, 빅데이터/Anomaly Detection

Anomaly Detection_Iforest

by Foxy현 2023. 4. 14.
728x90
반응형

Iforest(Isolation Forest)는 이상치 탐지 알고리즘 중 하나로, 대량의 데이터 중에서 소수의 이상치를 탐지하기 위해 사용됩니다.

 

Iforest의 핵심 아이디어는 바로 데이터의 특성(feature)을 이용하여 분기하는 것입니다.
일반적인 분류 문제와 달리, Iforest는 이상치를 분류하기 위해 목표하는 것이 아니라, 이상치가 아닌 정상 데이터들이 빠르게 분리될 수 있는 경로를 찾습니다. 이를 위해 Iforest는 데이터를 랜덤하게 선택한 뒤, 랜덤한 feature와 임계값(threshold)을 이용하여 데이터를 두 그룹으로 나눕니다. 이 과정을 재귀적으로 반복하여 이상치인 데이터는 단계가 적게 거친 경로를 통해 분리됩니다.

Iforest의 장점 중 하나는 학습 데이터의 크기에 민감하지 않다는 것입니다. 또한, Iforest는 특정한 환경에서 최적의 성능을 발휘하므로, 데이터 분포가 다른 다양한 상황에서도 유용하게 사용될 수 있습니다.
하지만 Iforest는 데이터가 고차원일수록 성능이 떨어지는 문제가 있습니다. 또한, 데이터의 밀도가 높은 경우에는 이상치 탐지 정확도가 낮아질 수 있습니다.

 

이상치일수록 Root 노드와 가깝고, 정상에 가까울수록 깊이 내려갑니다.

 

아래는 예시 코드입니다.

 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
plt.style.use(['dark_background'])

# 랜덤 시드값 설정
rng = np.random.RandomState(42)

# 2차원 데이터 생성
X_train = 0.2*rng.randn(1000,2)
X_train = np.r_[X_train+3,X_train]
X_train = pd.DataFrame(X_train, columns=['x1','x2'])

X_test = 0.2*rng.randn(1000,2)
X_test = np.r_[X_test+3,X_test]
X_test = pd.DataFrame(X_test, columns=['x1','x2'])

X_outliers = rng.uniform(low=-1, high=5, size=(50,2))
X_outliers = pd.DataFrame(X_outliers, columns=['x1','x2'])

# 데이터셋 시각화
p1 = plt.scatter(X_train.x1, X_train.x2, c='white',s=20*2,edgecolors='k',label='training observations')
p2 = plt.scatter(X_test.x1, X_test.x2, c='green',s=20*2,edgecolors='k',label='new regular obs')
p3 = plt.scatter(X_outliers.x1, X_outliers.x2, c='red',s=20*2,edgecolors='k',label='new abnormal obs')

plt.legend()

 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
plt.style.use(['dark_background'])

# 랜덤 시드값 설정
rng = np.random.RandomState(42)

# 2차원 데이터 생성
X_train = 0.2*rng.randn(1000,2)
X_train = np.r_[X_train+3,X_train]
X_train = pd.DataFrame(X_train, columns=['x1','x2'])

X_test = 0.2*rng.randn(1000,2)
X_test = np.r_[X_test+3,X_test]
X_test = pd.DataFrame(X_test, columns=['x1','x2'])

X_outliers = rng.uniform(low=-1, high=5, size=(50,2))
X_outliers = pd.DataFrame(X_outliers, columns=['x1','x2'])

# Isolation Forest 모델 생성
clf = IsolationForest(max_samples=100, contamination=0.1, random_state=42)
clf.fit(X_train)

# 모델을 이용하여 이상치 탐지
y_pred_train = clf.predict

 

 

 

728x90
반응형