DataWhale-异常检测-Task4
记录DataWhale的异常检测的学习过程,使用的教材可以在此链接中下载。
Task4介绍的是传统的基于密度的异常检测算法,主要介绍的是最常用的Local Outlier Factor(LOF)方法。
LOF算法
LOF等基于密度的算法可以较好地适应数据集中密度不同的集群情况,密度就是点的聚集程度,点与点之间距离越短,则密度越大。LOF算法为每个点定义了一个局部可达密度,然后用这个点与其周围点的局部可达密度的差异来衡量这个点是否异常,其核心是,一个点的异常与否和其周围点是紧密相关的。为了定义局部可达密度这个概念,LOF算法引入了k-距离,k-邻域,可达距离等概念,具体的解析可参考这篇文章,对相关概念写的十分清楚。
PyOD实例
使用PyOD在breast cancer数据集来测试PCA的性能,并于HBOS对比,breast cancerr数据集可以在此链接中下载,具体的代码如下:
from sklearn.model_selection import train_test_split
from pyod.models.lof import LOF
from pyod.models.pca import PCA
from pyod.models.hbos import HBOS
from pyod.utils.data import evaluate_print
import pandas as pd
import numpy as np
if __name__ == "__main__":
data = pd.read_csv('dataverse_files/breast-cancer-unsupervised-ad.csv', header=None)
data_x=data[[i for i in range(30)]].values
data_y=data[30].map(lambda x: 1 if x=='o' else 0).values
X_train, X_test, y_train, y_test = train_test_split(data_x, data_y, test_size=0.3,stratify=data_y)
train_number=X_train.shape[0]
clf1 = PCA(n_components=15)
clf1.fit(X_train)
y_train_scores_clf1 = clf1.decision_scores_
y_test_scores_clf1 = clf1.decision_function(X_test)
clf2 = HBOS(n_bins=(int)(np.sqrt(train_number)))
clf2.fit(X_train)
y_train_scores_clf2 = clf2.decision_scores_
y_test_scores_clf2 = clf2.decision_function(X_test)
clf3 = LOF(n_neighbors=20)#lof中的近邻数
clf3.fit(X_train)
y_train_scores_clf3 = clf3.decision_scores_
y_test_scores_clf3 = clf3.decision_function(X_test)
print("\nOn Training Data:")
evaluate_print('PCA', y_train, y_train_scores_clf1)
evaluate_print('HBOS', y_train, y_train_scores_clf2)
evaluate_print('LOF', y_train, y_train_scores_clf3)
print("\nOn Test Data:")
evaluate_print('PCA', y_test, y_test_scores_clf1)
evaluate_print('HBOS', y_test, y_test_scores_clf2)
evaluate_print('LOF', y_test, y_test_scores_clf3)
>>>
On Training Data:
PCA ROC:0.9753
HBOS ROC:0.9426
LOF ROC:0.9908
On Test Data:
PCA ROC:1.0
HBOS ROC:0.9475
LOF ROC:0.9753
可以看出,在breast cancer数据集上,LOF和PCA效果很接近。