异常检测TASK1

更新说明:

  1. 2021.1.24 18:17 对pyod api使用流程,思维导图进行了更新

摘要:本博客对于Datawhale TASK1涉及到的知识点进行了思维导图的整理,而后对pyod使用绘制了思维导图,最后使用了两个数据集进行练习,一个是使用API产生的数据,一个是UCI上面的癫痫的数据集。本博客主要探究了evaluate_print这个API发现它并不能计算precision(查准率)这个计算的是前n项查准率,转而采用sklearn的precision_score API,探究的过程主要采用Spyder编辑器的查看定义的功能。evaluate_print侧重的是异常分数,而precision_score 侧重的是模型推出来的标签。

1.笔记

异常检测的方法

2.pyod api使用流程

2.1 新版本简图

在这里插入图片描述

2.2 新版本全图

在这里插入图片描述

2.2 旧版本全图

在这里插入图片描述

3.练习

3.1 pyod库的安装

由于我使用的是anaconda,所以打开anaconda prompt(anaconda)程序,输入:pip install pyod -i http://pypi.douban.com/simple/ 就安装成功了

3.2 toy example

说明:我选择examples里面的LOF的例子做的,(Gitee确实很好用)LOF Gitee 链接

我把这个toy example熟悉的过程中,有了不少的感悟,总结如下:

  1. 首先,赵越在知乎上面的,数据的来源没有写清楚,是不完善的,并没有写清楚训练集是什么样的,这给我带来了一些困惑,我了解到这个例子不完整
    在这里插入图片描述
  2. 我在画出训练集的数据的时候,错误的采用了
plt.plot(X_train)

导致画出来的图是这样的

在这里插入图片描述
正确的应该是

plt.scatter(X_train[:,0],X_train[:,1])

是下面的散点图
在这里插入图片描述

3.precision指的是查准率,对应的还有查全率,与常采用的精度和错误率是不同的(虽然之前看过西瓜书,还是还是没能认出来,😄)(本来当成精度,以为代码有问题,就把代码复制到Spyder里面查看源码,在代码上面右击,点击go to definition 即可,我目前不会jupyter查看源码的方法)

在这里插入图片描述
4. 我发现evaluate_print()做出来的查准率和查全率与本次toy example 我手动算的不一样(通过图可以看出来,而且test里面precision是1 就很奇怪),于是我查看了evaluate_print()的源码,发现这个函数,采用的y_pred不是模型预测的,下图2可以看到y_pred被重新赋值了。
y_pred的产生:

  • .根据训练集里面的异常值占比,来确定判定异常的阈值;
  • 根据阈值,将y_scores分类,分为0和1,并把这个新的标签赋值给y_pred

所以evaluate_print()函数与下面的图3是没有关系的。
在这里插入图片描述
在这里插入图片描述
可视化的结果
探索前n项查准率
我们把异常得分90分位数找出来,找出大于它的数有哪些,我们设置的异常值是最后20个,通过结果发现有一个54号顶替了原来的190号,所以前n项查准率为,19/(19+1)=0.95,验证正确

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

6.如何计算查准率呢?这样计算出来的结果与结果展示的那张图是对应的。

  • from sklearn.metrics import precision_score
  • precision_score(y_train,y_train_pred)

3.3 癫痫数据集

数据来源:来自UCI公开数据集

3.3.1 说明

Wu Qiuyi Wu
数学学院,
罗彻斯特理工学院,
电子邮件:qw9477’@'rit.edu

欧内斯特·福科厄
数学学院,
罗彻斯特理工学院,
电子邮件:epfeqa’@'rit.edu
电话:585 739 6893

数据集信息:

请在“ [Web链接] ”中 找到原始数据

属性信息:

参考文献的原始数据集包含5个不同的文件夹,每个文件夹包含100个文件,每个文件代表一个主题/人。每个文件记录了23.6秒的大脑活动。相应的时间序列被采样到4097个数据点中。每个数据点是在不同时间点的EEG记录的值。因此,我们共有500个人,每个人有4097个数据点,持续23.5秒。

我们将4097个数据点分为23个数据块,并将其洗牌,每个数据块包含178个数据点,持续1秒钟,每个数据点是在不同时间点的EEG记录值。因此,现在我们有23 x 500 = 11500条信息(行),每个信息包含1秒(列)的178个数据点,最后一列表示标签y {1,2,3,4,5}。

响应变量在列179中为y,说明变量X1,X2,…,X178

y包含178维输入向量的类别。具体来说,在{1,2,3,4,5}中的y:

5-睁开眼睛,表示他们正在记录大脑的EEG信号时,病人睁开眼睛

4-睁开眼睛,意味着他们在记录EEG信号时患者闭上眼睛

3-是的,他们确定了大脑中肿瘤的位置,并记录了健康大脑区域的脑电图活动

2-他们记录了肿瘤所在区域的脑电图

1-记录了癫痫发作活动

属于第2、3、4和5类的所有受试者都是没有癫痫发作的受试者。仅1级受试者患有癫痫发作。我们创建此版本数据的动机是通过创建.csv版本来简化对数据的访问。尽管有5个班级,大多数作者都进行了二分类,即相对于其他班级为1级(癫痫发作)。

3.3.2 归一化

本次只区分正常和有疾病的(对某些类别进行了合并)
归一化与训练集、测试集的划分
在这里插入图片描述
在这里插入图片描述

3.3.3 训练结果

训练过程与toy example相同
训练结果准确率与模型评估都较好。
由于是高维数据,无法可视化。
在这里插入图片描述
在这里插入图片描述

4.代码附件

  1. 代码.ipython格式
  2. 数据文件hebing.7z(癫痫数据集)

Gitee 链接

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值