外れ値検出のためのKNN

Anomaly Detection in Python

Bekhruz (Bex) Tuychiev

Kaggle Master, Data Science Content Creator

KNNの用途

  • 教師あり:
    • 回帰
    • 分類
  • 教師なし:
    • クラスタリング
    • 外れ値検出
Anomaly Detection in Python

KNNのシンプルさ

異常スコアの計算要素
  • Isolation Forest:
    • 木の深さ
    • サブサンプルサイズ
    • その他多数の要素
  • KNN:
    • サンプル間の距離のみ
Anomaly Detection in 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
  ...
Anomaly Detection in Python

KNNの実行

from pyod.models.knn import KNN

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

knn.fit(males)
Anomaly Detection in Python

外れ値確率を用いたKNN

probs = knn.predict_proba(males)


# フィルタのしきい値は55% is_outlier = probs[:, 1] > 0.55 # 外れ値を抽出 outliers = males[is_outlier] len(outliers)
13
Anomaly Detection in Python

近傍数(k)

# k=20 は汚染率 <=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近傍との矢印を示すプロット。

Anomaly Detection in Python

KNNの特徴

8件のデータで、Aが外れ値。Aと最も近い4近傍との矢印を示すプロット。

Anomaly Detection in Python

KNNの欠点

  • データを記憶するためメモリ非効率
  • 予測が遅い
  • 特徴量スケールに敏感
Anomaly Detection in Python

練習しましょう!

Anomaly Detection in Python

Preparing Video For Download...