본문 바로가기
머신러닝/EDA

[EDA] Isolation Forest

by 공부랑 독서 기록 2024. 12. 25.

 Isolation Forest는 이상치를 탐지하는 비지도 학습 알고리즘으로, 트리 구조를 기반으로 이상치 탐지에서 뛰어난 효과를 보인다.

 

작동 원리

이상치들은 전체 데이터에서 소수이며, 일반적인 데이터 포인트와는 다른 값을 가진다는 점을 기반으로 데이터들을 분리(Isolation)하며 작동한다.

 

1. 랜덤 분할

 임의의 피쳐와 임의의 분할값을 선택하여 분할한다. 키와 몸무게라는 피쳐들이 있으면 랜덤으로 키를 고르고, 키 데이터 범위 중 임의의 값인 170cm를 골라 데이터들을 분할한다. 이 과정을 여러 번 반복한다.

2. 깊이 계산

 분리되기까지의 경로 깊이를 측정한다. 이상치는 다른 데이터들로부터 떨어져 있기 때문에 분리 깊이가 짧은 데이터를 이상치로 간주한다.

3. 이상치 점수 계산

 데이터 포인트의 이상치 점수를 계산하여 이상치 여부를 확인한다. 점수 계산 공식은 다음과 같다.

 $ s(x, n) = 2^{-\frac{E(h(x))}{c(n)}} $
  •  $h(x)$ : 특정 데이터 포인트의 깊이
  • $E(h(x))$ : 모든 Isolation Tree에서 해당 데이터 포인트의 평균 깊이
  • $c(x)$ : Isolation Tree의 평균 길이

 score는 데이터 포인트가 평균과 같다면 0.5 이하의 값이 나오고, 이상치라면 1에 가깝게 나타난다.

 

적용할만한 상황

 데이터셋의 크기가 방대하고, 이상치의 비율이 낮을 때 효율적이다. 또한 고차원의 데이터에서도 유용하게 쓰일 수 있다.

 

예제 코드

 다음은 Isolation Forest 기법의 예제 코드이다.

from sklearn.ensemble import IsolationForest

# Isolation Forest 설정
iforest = IsolationForest(n_estimators=100, max_samples='auto', contamination=0.1, random_state=42)
iforest.fit(train)

scores = iforest.decision_function(train)
outliers = iforest.predict(train)

# 시각화
plt.scatter(train['feature1'], train['feature2'], c=outliers, cmap='coolwarm', edgecolor='k', s=20)
plt.colorbar(label="Outlier Score")
plt.title("Isolation Forest Outlier Detection")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()


# 이상치 탐지
predictions = iforest.predict(train)  # -1: 이상치, 1: 정상 데이터

# 이상치 제거
train_x = train[predictions == 1]

print(f"원래 데이터 크기: {train.shape}")
print(f"이상치 제거 후 데이터 크기: {train_x.shape}")

predict의 결과로 정상 데이터는 1, 이상치는 -1로 나온다.

  • n_estimators : 생성할 트리의 개수를 의미한다. 값이 클수록 정확도는 높아지지만 계산 비용이 증가한다.
  • max_samples : 샘플링하게 될 데이터 포인트의 수를 의미한다. 
  • max_features : 각 트리에서 사용할 특성의 최대 개수를 의미한다. 기본값은 1이며 모든 피쳐를 고려함을 의미한다. 
  • contamination : 이상치로 간주할 데이터의 비율을 의미한다. 기본값은 'auto'이고, 0~0.5의 값을 입력할 수 있다. 0.1이면 전체 데이터 중에서 10%를 이상치로 간주함을 의미한다.

장단점과 특징

 시간 복잡도는 $O(nlog(n))$으로 큰 데이터셋에서 효율적이다. 고차원의 데이터셋에서도 잘 작동한다. 비지도 학습이기 때문에 라벨 없는 데이터 피쳐에도 적용이 가능하며 깊이를 이용하여 직관적으로 이해할 수 있다. 그러나 적절히 스케일링이 되지 않으면 정확도가 저하될 수 있고, 파라미터에 민감하다.

 

'머신러닝 > EDA' 카테고리의 다른 글

[SNS] sns.scatterplot(), 산점도  (5) 2024.12.28
[EDA] DBSCAN 기법  (4) 2024.12.24
[EDA] Z-score  (6) 2024.12.24
[EDA] IQR(Interquartile Range, 사분범위)  (3) 2024.12.23
[EDA] K-최근접 이웃(K-Nearest Neighbors, KNN)  (1) 2024.12.23