이상치 탐지용 KNN

Python으로 배우는 이상치 탐지

Bekhruz (Bex) Tuychiev

Kaggle Master, Data Science Content Creator

KNN의 활용

  • 지도학습:
    • 회귀
    • 분류
  • 비지도학습:
    • 군집화
    • 이상치 탐지
Python으로 배우는 이상치 탐지

KNN의 단순성

이상 점수 계산 기준
  • Isolation Forest:
    • 트리 깊이
    • 서브샘플 크기
    • 기타 여러 요소
  • KNN:
    • 인스턴스 간 거리만 사용
Python으로 배우는 이상치 탐지

Ansur 남성 데이터셋

import pandas as pd

males = pd.read_csv("ansur_male.csv")
males.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4082 entries, 0 to 4081
Data columns (total 95 columns):
 #   Column                          Non-Null Count  Dtype
 0   abdominalextensiondepthsitting  4082 non-null   int64
 1   acromialheight                  4082 non-null   int64
 2   acromionradialelength           4082 non-null   int64
 3   anklecircumference              4082 non-null   int64
 4   axillaheight                    4082 non-null   int64
  ...
Python으로 배우는 이상치 탐지

KNN 실습

from pyod.models.knn import KNN

knn = KNN(contamination=0.01, n_jobs=-1)

knn.fit(males)
Python으로 배우는 이상치 탐지

이상치 확률과 KNN

probs = knn.predict_proba(males)


# Use 55% threshold for filtering is_outlier = probs[:, 1] > 0.55 # Isolate the outliers outliers = males[is_outlier] len(outliers)
13
Python으로 배우는 이상치 탐지

이웃 수 선택

# k=20 when contamination is <=10%
knn = KNN(n_neighbors=20, n_jobs=-1)
knn.fit(males)

probs = knn.predict_proba(males)

is_outlier = probs[:, 1] > .55
outliers = males[is_outlier]

len(outliers)
15

표본 데이터셋(8개 인스턴스)에서 A가 이상치이며 A와 가장 가까운 4개 이웃을 화살표로 연결한 그림.

Python으로 배우는 이상치 탐지

KNN의 특징

표본 데이터셋(8개 인스턴스)에서 A가 이상치이며 A와 가장 가까운 4개 이웃을 화살표로 연결한 그림.

Python으로 배우는 이상치 탐지

KNN의 한계점

  • 데이터셋을 암기함: 메모리 비효율적
  • 예측 단계가 느림
  • 특성 스케일에 민감
Python으로 배우는 이상치 탐지

연습해 봅시다!

Python으로 배우는 이상치 탐지

Preparing Video For Download...