用于异常检测的 KNN

Python 中的异常检测

Bekhruz (Bex) Tuychiev

Kaggle Master, Data Science Content Creator

KNN 的应用

  • 监督学习:
    • 回归
    • 分类
  • 无监督学习:
    • 聚类
    • 异常检测
Python 中的异常检测

KNN 的简洁性

异常分数计算依据
  • 隔离森林:
    • 树深度
    • 子样本大小
    • 其他多种组件
  • 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)


# 使用 55% 阈值进行筛选 is_outlier = probs[:, 1] > 0.55 # 提取异常点 outliers = males[is_outlier] len(outliers)
13
Python 中的异常检测

邻居数

# 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 个最近邻的箭头。

Python 中的异常检测

KNN 的特性

一个包含 8 个样本的数据集示意图,A 为异常点,并标出 A 与其 4 个最近邻的箭头。

Python 中的异常检测

KNN 的缺点

  • 记忆全数据集,内存占用高
  • 预测阶段较慢
  • 对特征尺度敏感
Python 中的异常检测

Passons à la pratique !

Python 中的异常检测

Preparing Video For Download...