局部异常因子(LOF)

Python 中的异常检测

Bekhruz (Bex) Tuychiev

Data Science Writer

什么是局部异常因子(LOF)?

特点

  • 基于密度的算法
  • 提出于 2000 年
  • 适用于中高维数据
  • 可能比 KNN 和 Isolation Forest 更快
Python 中的异常检测

LOF 如何工作?

  • 使用"局部异常因子(LOF)"分数对点分类
  • LOF 基于局部密度
  • 通过设置 n_neighbors 确定局部范围
  • 密度更低的点被判为异常

LOF 算法可视化

Python 中的异常检测

局部性的意义

  • 关键在于"局部"
  • 仅与邻近点的 LOF 分数比较
Python 中的异常检测

LOF 可视化

LOF 算法可视化

Python 中的异常检测

LOF 可视化

LOF 算法可视化

Python 中的异常检测

LOF 可视化

LOF 算法可视化

Python 中的异常检测

已变换的数据集

import pandas as pd

males_transformed = pd.read_csv("males_transformed.csv")

males_transformed.head()
   abdominalextensiondepthsitting  acromialheight  acromionradialelength  ...
0                        0.365531        0.427976               0.113152   
1                       -0.492137       -0.724973              -0.529301   
2                        0.857097       -0.146048               0.357496   
3                       -0.462610       -1.521525              -1.467860   
4                       -0.026349        2.151957               1.985876
Python 中的异常检测

LOF 实战

from pyod.models.lof import LOF


# 拟合 lof = LOF(n_neighbors=20, metric="manhattan") lof.fit(males_transformed) print(lof.labels_)
array([0, 0, 0, ..., 0, 0, 1])
Python 中的异常检测

LOF 过滤

# 识别异常点
probs = lof.predict_proba(males_transformed)

is_outlier = probs[:, 1] > 0.55
outliers = males_transformed[is_outlier]

len(outliers)
2
Python 中的异常检测

LOF 细节

  • n_neighbors 最重要
  • 调参经验法则:
    • 污染率 <10% 时用 20 个邻居
  • 不允许聚合:
    • method 始终为 largest
Python 中的异常检测

LOF 局限

  • 难以解释
  • LOF 分数综合了:
    • 点间距离
    • 可达距离
    • 其他多种成分
  • 无固定的异常分数阈值
Python 中的异常检测

Passons à la pratique !

Python 中的异常检测

Preparing Video For Download...