Task2:基于统计学的方法
Latest revision date:2021.1.15 15:35
摘要:对笔记做了思维导图,研究了正态分布与多元高斯分布。
HBOS分别在API产生的数据和乳腺癌数据集上面进行测试,表现良好。
1.笔记
1.1 概述
1.直角坐标与极坐标的互化中,为什么 dxdy=rdrdθ? - 予一人的回答 - 知乎
2.标准正态分布的积分
3.多元高斯分布相关知识,写的很好的回答
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 动态分布直方图
- 先把数值从小到大排序
- 等分成
N
K
\frac {N}{K}
KN份 ,将连续的数值分到一个箱子里面
- N N N是总的数值的个数, k k k是箱子的个数
- 注意是等分,所以可以推理出下面3条:
- 在数值稀疏的地方,区间的跨度就比较大,在数值密集的地方,区间的跨度就比较小;
- 直方图的面积,表示的是直方图内点的个数,因为点的个数是相等的,所以每个直方图的面积是相等的;
- 每个直方图的面积是相等的,则区间跨度大的,高度低;区间跨度小的,高度高。
- 特殊情况:超过 k k k 个数拥有相同的数值,箱子内点的个数,可能会超过 N K \frac {N}{K} KN,这个假设需要证明,但是理解一种情况,就是相同数值的数的数量超过一个阈值以后,就会把多出平均的数目,分到某个箱子里面
- 注:
- 推荐使用动态的
- k k k的取值一般是, k = N k=\sqrt{N} k=N
- 箱子的高度,表示密度的估计,箱子的最大高度为1
-
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=1∑dlog(Pi(p))1 - 如果都是很密集的 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,分母越大,值越小,分母要想越大,箱子就应该越高,就应该数据越密集,就应该越没有异常,符合逻辑。
- 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历经了三个阶段:
- 第一阶段:原始数据放入,或者归一化标准化(这样不对,不需要),结果表现很差,大概precision 0.2左右,并且测试集的准确度高于训练集
- 第二阶段:
- 发现HBOS的参数,进行调整,contamination是异常的比例,n_bins按照 N \sqrt{N} N的原则进行选取,alpha是防止过拟合的,tol是处理异常值的灵活性,
- 发现正例的比例为0.63,超过contamination最大我0.5的限制,于是我把标签0和标签1进行了反转,新的标签采用list存储,最终ROC达到了0.89,precision 0.75,测试集低一些,达到了基本合理的范围
sum(data.target)/len(data.target)
- 第三阶段:发现论文里面的ROC的数值很高,发现论文是保留了前10个异常值,其余的异常值去掉了,由于contamination认定1是异常,而breast_cancer则把1看做是正常,所以也需要反转一下。结果:
- ROC数值很高,但是precision @ n 很低
- alpha越小,ROC的数值越高
- 目前测试集的ROC值高于训练集,感觉过拟合了,但是pyod的抑制过拟合的方法不太管用。后期可能探索sklearn交叉验证看看行不行。
- 当contamination=0.1的时候,ROC的值,大于contamination=0.027(真实数据)有待探究。