异常检测-Task1

异常检测-Task1

记录DataWhale的异常检测的学习过程,使用的教材可以在此链接中下载。
本次异常检测课程主要是面向初学者,介绍了一些比较成熟的异常检测算法和PyOD这个异常检测库的使用,PyOD的主要完成人是知乎上的微调大佬,微调大佬以前也在知乎上发布过PyOD介绍文章,作为微调大佬多年的老粉,立个flage好好学这门课程。第一章没有讲具体的算法,主要是介绍了异常检测的宏观概念和常用方法。

思维导图

在这里插入图片描述

PyOD例子

以KNN方法为例,介绍一下PyOD的基本使用,本篇文章的例子来自PyOD的官网

from pyod.models.knn import KNN #导入KNN库
from pyod.utils.data import generate_data # generate_data用来生成实验样本。
from pyod.utils.data import evaluate_print #输出算法的结果
from pyod.utils.example import visualize #结果可视化

if __name__ == "__main__":
    #先用generate_data函数生成实验样本

    contamination = 0.1  # 异常样本在所有样本(训练集样本加测试集样本)中的比例
    n_train = 200  # 训练集样本个数
    n_test = 100  # 测试集样本个数


    X_train, y_train, X_test, y_test = \
        generate_data(n_train=n_train,
                      n_test=n_test,
                      n_features=2, #样本的特征维度
                      contamination=contamination,
                      random_state=42)

    # kNN 算法
    clf_name = 'KNN'
    clf = KNN()
    #和sklearn中的一样,使用fit()函数进行训练,这里是无监督模式,没有标签。
    clf.fit(X_train) 
    

	#得到训练集上的预测标签和异常值分数
    y_train_pred = clf.labels_  # clf.lables_返回训练集上的标签,标签是二元值,0代表正常,1代表异常。
    y_train_scores = clf.decision_scores_  # clf.decision_scores_返回的是异常分数,分越高越异常。
	
    # 测试集上的结果
    y_test_pred = clf.predict(X_test)  # 和sklearn一样,使用clf.predict(X_test)用已经训练好的模型在测试集上得到输出。
    y_test_scores = clf.decision_function(X_test)  # 测试集上异常分数

    # 使用内置函数evaluate_print()可以得到结果的基准
    print("\nOn Training Data:")
    evaluate_print(clf_name, y_train, y_train_scores)
    print("\nOn Test Data:")
    evaluate_print(clf_name, y_test, y_test_scores)

    # visualize()可以对结果可视化
    visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,y_test_pred, show_figure=True, save_figure=False)

>>>
>On Training Data:
KNN ROC:0.9992, precision @ rank n:0.95

On Test Data:
KNN ROC:1.0, precision @ rank n:1.0

结果如图:
在这里插入图片描述

我们还可以对例子进行更深层次的分析。
首先,我们看一下generate_data()函数是怎么生成样本的。官网上的介绍如下:“Utility function to generate synthesized data. Normal data is generated by a multivariate Gaussian distribution and outliers are generated by a uniform distribution.” 意思为,使用多元高斯分布模拟生成正常样本,使用均匀分布来生成异常样本。这个函数的主要参数的含义如下:

pyod.utils.data.generate_data(n_train=1000, n_test=500, n_features=2, contamination=0.1)
  • n_train (int, (default=1000)) – 训练集样本个数
  • n_test (int, (default=500)) – 测试集样本个数
  • n_features (int, optional (default=2)) – 特征的维度
  • contamination (float in (0., 0.5), optional (default=0.1)) – 异常样本的比例

然后我们看一下evaluate_print()的用法,从例子中的结果可以看出,evaluate_print()返回的衡量基准有两个:ROCprecision @ rank n。这里是将异常检测作为一个二分类问题,我们知道,常见的二分类问题的评价标准有P-R曲线,ROC曲线等,之所以这里不使用P-R曲线是因为P-R曲线对类别不均衡十分敏感,而异常检测又是严重类别不均衡的,所以不能作为评价标准,而ROC曲线在样本不均衡的情况下依然能保持良好的效果,所以使用ROC曲线作为评价标准。在源码中,precision @ rank n标准使用的是sklearn中的precision_score()函数,其实就是最基本的精确度(precision)。

最后是visualize()函数,官网上介绍为:Utility function for visualizing the results in examples. Internal use only。意思是这个画图函数只是用来例子展示用的,只是内部使用。其实通过源码可以看出,visualize()是作者自己编写了一个画图显示函数,在实际使用中,我们也可以根据分类器的结果自己画图。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值