异常检测初识pyod Task2

Task2:基于统计学的方法

Latest revision date:2021.1.15 15:35

摘要:对笔记做了思维导图,研究了正态分布与多元高斯分布。
HBOS分别在API产生的数据和乳腺癌数据集上面进行测试,表现良好。

1.笔记

1.1 概述

在这里插入图片描述

1.直角坐标与极坐标的互化中,为什么 dxdy=rdrdθ? - 予一人的回答 - 知乎
2.标准正态分布的积分
3.多元高斯分布相关知识,写的很好的回答
3sigma法则图示

1.1 箱型图介绍

箱线图是一种基于五位数摘要(“最小”,第一四分位数(Q1),中位数,第三四分位数(Q3)和“最大”)显示数据分布的标准化方法。

  • 中位数(Q2 / 50th百分位数):数据集的中间值;
  • 第一个四分位数(Q1 / 25百分位数):最小数(不是“最小值”)和数据集的中位数之间的中间数;
  • 第三四分位数(Q3 / 75th Percentile):数据集的中位数和最大值之间的中间值(不是“最大值”);
  • 四分位间距(IQR):第25至第75个百分点的距离;
  • 晶须(蓝色显示)
  • 离群值(显示为绿色圆圈)
  • “最大”:Q3 + 1.5 * IQR
  • “最低”:Q1 -1.5 * IQR

  • 箱型图与3 σ \sigma σ法则不是严格对应的,但是可以通过箱型图对3 σ \sigma σ法则大致查看
  • 如何深刻理解箱线图(boxplot) - jinzhao的文章 - 知乎

2.HBOS

2.1 离散型

就是频率分布直方图

2.2 数值型

2.2.1 静态分布直方图

对于每一个维度,想象一张二维的画布。
x固定距离分割,直方图的高度是落入固定区间的数值的个数

2.2.2 动态分布直方图

  1. 先把数值从小到大排序
  2. 等分 N K \frac {N}{K} KN份 ,将连续的数值分到一个箱子里面
    1. N N N是总的数值的个数, k k k是箱子的个数
    2. 注意是等分,所以可以推理出下面3条:
      1. 在数值稀疏的地方,区间的跨度就比较大,在数值密集的地方,区间的跨度就比较小;
      2. 直方图的面积,表示的是直方图内点的个数,因为点的个数是相等的,所以每个直方图的面积是相等的;
      3. 每个直方图的面积是相等的,则区间跨度大的,高度低;区间跨度小的,高度高。
  3. 特殊情况:超过 k k k 个数拥有相同的数值,箱子内点的个数,可能会超过 N K \frac {N}{K} KN,这个假设需要证明,但是理解一种情况,就是相同数值的数的数量超过一个阈值以后,就会把多出平均的数目,分到某个箱子里面
  4. 注:
    1. 推荐使用动态的
    2. k k k的取值一般是, k = N k=\sqrt{N} k=N
    3. 箱子的高度,表示密度的估计,箱子的最大高度为1
    4. H B O S HBOS HBOS值的计算
      H B O S ( p ) = ∑ i = 1 d 1 log ⁡ ( P i ( p ) ) HBOS(p)=\sum_{i=1}^{d}\frac {1}{\log(P_i(p))} HBOS(p)=i=1dlog(Pi(p))1
    5. 如果都是很密集的 P i ( p ) P_i(p) Pi(p)都为1,则分母比较大, H B O S ( p ) HBOS(p) HBOS(p)的数值比较小,不怎么异常;如果有大有小,比如0.3,0.8则0.24,0.8 0.8,则0.64,分母越大,值越小,分母要想越大,箱子就应该越高,就应该数据越密集,就应该越没有异常,符合逻辑。
    6. H B O S HBOS HBOS的结果是数值,不是直方图的展示。

3.练习

evaluate_print评价的指标基于异常的分数决定的标签继而计算查准率,即precision @ rank n;而precision_score评价的指标基于模型推出的标,即precision。

3.1 Data1

  • Data1采用的是generate_data API产生的数据
  • 流程与上篇LOF的流程相同,最后结果显示:ROC的数值很高,但是precisio @ n的效果不是很好,说明对于全局异常比较好的得分,而对于局部异常不是很好(所有的维度都异常很容易检查出来,某个维度异常不容易检查出来)

precision @ rank n

# evaluate and print the results
print("\nOn Training Data:")
evaluate_print(clf_name, y_train1, y_train_scores1)
print("\nOn Test Data:")
evaluate_print(clf_name, y_test1, y_test_scores1)

On Training Data:
HBOS ROC:0.9947, precision @ rank n:0.8

On Test Data:
HBOS ROC:0.9744, precision @ rank n:0.6

precision

print("\nOn Training Data:")
print(precision_score(y_train1,y_train_pred1))
print("\nOn Test Data:")
print(precision_score(y_test1,y_test_pred1))

On Training Data:
0.8

On Test Data:
0.5625

3.2 Data2

Data2采用的是breastcancer 数据,使用data2历经了三个阶段:

  1. 第一阶段:原始数据放入,或者归一化标准化(这样不对,不需要),结果表现很差,大概precision 0.2左右,并且测试集的准确度高于训练集
  2. 第二阶段:
    1. 发现HBOS的参数,进行调整,contamination是异常的比例,n_bins按照 N \sqrt{N} N 的原则进行选取,alpha是防止过拟合的,tol是处理异常值的灵活性,
    2. 发现正例的比例为0.63,超过contamination最大我0.5的限制,于是我把标签0和标签1进行了反转,新的标签采用list存储,最终ROC达到了0.89,precision 0.75,测试集低一些,达到了基本合理的范围
    sum(data.target)/len(data.target)
    

在这里插入图片描述
在这里插入图片描述

  1. 第三阶段:发现论文里面的ROC的数值很高,发现论文是保留了前10个异常值,其余的异常值去掉了,由于contamination认定1是异常,而breast_cancer则把1看做是正常,所以也需要反转一下。结果:
    1. ROC数值很高,但是precision @ n 很低
    2. alpha越小,ROC的数值越高
    3. 目前测试集的ROC值高于训练集,感觉过拟合了,但是pyod的抑制过拟合的方法不太管用。后期可能探索sklearn交叉验证看看行不行。
    4. 当contamination=0.1的时候,ROC的值,大于contamination=0.027(真实数据)有待探究。
      在这里插入图片描述

资料以及链接

HBOS方法的论文
jupyter文档

猜你喜欢

转载自blog.csdn.net/qq_35147871/article/details/112559793