Isolation Forest 시작하기

Python으로 배우는 이상치 탐지

Bekhruz (Bex) Tuychiev

Kaggle Master, Data Science Content Creator

설문 데이터

  • 예시 응답자:
    • 12세
    • 키 160cm
    • 몸무게 190파운드

모자를 쓴 12세 소년의 그림

Python으로 배우는 이상치 탐지

다변량 이상치

다변량 이상치:

  • 두 개 이상의 속성을 가짐
  • 각 속성은 단독으로 이상치가 아닐 수 있음
  • 전체 속성을 함께 볼 때만 이상함
Python으로 배우는 이상치 탐지

결정 트리

숫자 5가 소수인지 판단하는 결정 트리의 루트와 종료 노드

Python으로 배우는 이상치 탐지

결정 트리

숫자 5가 소수인지 판단하는 3단계 완전 성장 트리

Python으로 배우는 이상치 탐지

Isolation Tree

iTree:

  • isolation tree의 약자
  • 결정 트리의 랜덤화 버전
  • 분할(분기)이 무작위로 발생
  • 무작위 분할은 정상/이상치 간 간격에서 더 자주 발생
Python으로 배우는 이상치 탐지

2D 데이터 예시

9개의 점 중 2개가 이상치인 2D 데이터셋 예시

Python으로 배우는 이상치 탐지

iTree 적합

녹색 선이 2D 평면에서 데이터를 둘로 분할

2D 데이터에 맞춘 iTree의 루트 노드

Python으로 배우는 이상치 탐지

iTree 적합

두 수직선이 2D 평면에서 데이터를 네 부분으로 분할

2개의 이상치를 찾는 iTree의 두 노드

Python으로 배우는 이상치 탐지

iTree 적합

6개의 다른 색 선이 2D 평면에서 데이터를 여러 부분으로 분할

2D 데이터셋에 iTree를 계속 적합

Python으로 배우는 이상치 탐지

포인트 분류 기준

이상치로 분류되는 경우:

  • 루트 노드에 가깝거나
  • 더 적은 분할로 도달할 때

2D 데이터셋에 iTree를 계속 적합

Python으로 배우는 이상치 탐지

미국 Airbnb 데이터

import pandas as pd

airbnb_df = pd.read_csv("airbnb.csv")
Python으로 배우는 이상치 탐지

미국 Airbnb 데이터

airbnb_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10000 entries, 0 to 9999
Data columns (total 6 columns):
 #   Column                          Non-Null Count  Dtype  
 0   minimum_nights                  10000 non-null  int64  
 1   number_of_reviews               10000 non-null  int64  
 2   reviews_per_month               10000 non-null  float64
 3   calculated_host_listings_count  10000 non-null  int64  
 4   availability_365                10000 non-null  int64  
 5   price                           10000 non-null  int64  
dtypes: float64(1), int64(5)
Python으로 배우는 이상치 탐지

fit_predict

from pyod.models.iforest import IForest

iforest = IForest() labels = iforest.fit_predict(airbnb_df) print(labels)
array([0, 0, 0, ..., 1, 0, 0])

Python으로 배우는 이상치 탐지

이상치 필터링

outliers = airbnb_df[labels == 1]

print(outliers.shape)
(1000, 6)
Python으로 배우는 이상치 탐지

런스 프라픽티스!

Python으로 배우는 이상치 탐지

Preparing Video For Download...