基于半监督学习方法的异常值检测

在韩家炜书中提到了使用半监督学习方法的异常值检测。在半监督学习中,一部分样本会被标记为“正常”或"离群点“,另一部分样本没有标号,需要算法去估计。貌似这看上去有些像分类得预测问题。但是半监督学习的思想是每次学习后,把最有可能预测正确的样本,加入到下一次迭代的训练集中去。如此不断扩大学习和标记的范围。问题是如何指定一开始的初始标签?( 当然可以人为指定 )

我们来看这个数据集。绿色部分是被标记“正常”的样本。红色的为“异常”的样本。蓝色的为“未标记”样本点。其实这里我自己采用的初始标记方法很简单,就是算出每个样本的K近邻距离的平方和。然后输入两个参数,分别是正常点的默认数量goodSampleNum和异常点的默认数量badSampleNum

这里我默认选goodSampleNum = 10和badSampleNum = 5。至少对这个数据集是合适的。由于我们前面已经算出了每个样本的K近邻距离的平方和,K这里我们取5。所以goodSampleNum对应的正常点应该是K近邻平方和最小的goodSampleNum个。而异常值则是K近邻平方和最大的badSampleNum。具体的代码如下

def genInitLabels( X, k = 3, goodSampleNum = 10, badSampleNum = 5 ):
    labels = -1 * np.ones( len( X ) )
    dists = calKNNSqDists( X, k )
    indices = np.argsort( dists )

    labels[ indices[ : goodSampleNum  ] ] = 0
    labels[ indices[ -badSampleNum : ] ] = 1  

    return labels, dists.reshape(-1,1)

这里的calKNNSqDists就是用来计算每个样本点的K近邻平方和,这里就不展开了。这里会返回初始的label,如果label是-1则为“未标记”

接着就是使用半监督学习方法。我们这里直接调用sklearn里的半监督方法LabelPropagation。这里我们继续使用前面获取的K近邻距离平方和来做为半监督学习方法的输入, 具体代码如下:

def detectOutliers( X, k = 5, goodSampleNum = 10, badSampleNum = 5 ):
    initLables, dists = genInitLabels( X, k, goodSampleNum, badSampleNum )

    semiModel = LabelPropagation( ‘knn‘ , n_neighbors = k + 1 )
    semiModel.fit( dists, initLables )
    labels = semiModel.predict( dists )

    print "Num of outliers:", np.sum( labels == 1 )
    return labels, initLables

这里的半监督算法我们依然采用knn核,最近邻由于sklearn里的近邻包含自身,所以就用k + 1。方法获取的结果如下,绿色的为异常值:

大部分的异常点还是找得不错。但是还是有两个点,个人觉得不是太好,离群度不够。无论如何,这篇文章提供了个半监督学习方法在异常值检测应用的思路。

时间: 2024-08-25 04:40:08

基于半监督学习方法的异常值检测的相关文章

详解使用EM算法的半监督学习方法应用于朴素贝叶斯文本分类

1.前言 对大量需要分类的文本数据进行标记是一项繁琐.耗时的任务,而真实世界中,如互联网上存在大量的未标注的数据,获取这些是容易和廉价的.在下面的内容中,我们介绍使用半监督学习和EM算法,充分结合大量未标记的样本,以期获得文本分类更高的准确率.本文使用的是多项式朴素贝叶斯作为分类器,通过EM算法进行训练,使用有标记数据以及未标记的数据.研究了多类分类准确率与训练集中未标记数据的比例之间的关系.并探索方法来降低EM过程的计算代价来加速训练.结果显示,半监督EM-NB分类器可以在只给2%标记数据情况

基于聚类的异常值检测方法( 2 )

韩家炜书中在介绍基于聚类的异常值检测中的第二种方法提到: 如果某对象与最近的簇的距离非常远,则该对象为Outlier.这句话其实有两个意思,第一个意思假定某对象在cluster A中,则它必定距离A簇比较近( 一般指的是球型的cluster ).第二个意思假定某对象是未知的点,距离A簇最近.其实在使用中,大部分情况我们可以把这两个场景合二为一.在本文中,我们假定对象已经在cluster A中. 本文基于聚类的异常值检测的算法思路是: 1 ) 用聚类算法做cluster 2 ) 计算cluster

基于聚类的异常值检测方法( 1 )

韩家炜的书中提到也可以用基于聚类的方法去做Outlier的识别.的确,outlier这个概念是和cluster这样的场景很相关的.对于工业上的数据来说,一般这个cluster的数量会是1或者2.在找出了cluster后,我们可以发现outlier要么不属于任何的cluster,要么说outlier在这个cluster里显得如此的奇怪. 今天我们用DBSCAN的方法去发现cluster和outleir.DBSCAN的介绍可以见这篇文章: http://www.cnblogs.com/chaosim

基于协同训练的半监督文本分类算法

标签: 半监督学习,文本分类 作者:炼己者 --- 本博客所有内容以学习.研究和分享为主,如需转载,请联系本人,标明作者和出处,并且是非商业用途,谢谢! 如果大家觉得格式看着不舒服,也欢迎大家去看我的简书 半监督学习文本分类系列 用半监督算法做文本分类(sklearn) sklearn半监督学习(sklearn) 基于自训练的半监督文本分类算法 一. 摘要 本文主要讲述基于协同训练的半监督算法做文本分类,用三个差异性比较大的分类器对未标注数据进行标注,它们可以进行交叉验证,大大提升了对未标注数据

【Python数据分析基础】: 异常值检测和处理

在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是对整体样本数据结构的一种表达方式,这种表达方式通常抓住的是整体样本一般性的性质,而那些在这些性质上表现完全与整体样本不一致的点,我们就称其为异常点,通常异常点在预测问题中是不受开发者欢迎的,因为预测问题通产关注的是整体样本的性质,而异常点的生成机制与整体样本完全不一致,如果算法对异常点敏感,那么生成的模型并不能对整体样本有一个较好的表达,从而预测也会不准确.从另一方面来说,异常点在某

半监督学习(五)——半监督支持向量机

半监督支持向量机(S3VMs) 今天我们主要介绍SVM分类器以及它的半监督形式S3VM,到这里我们关于半监督学习基础算法的介绍暂时告一段落了.之后小编还会以论文分享的形式介绍一些比较新的半监督学习算法.让我们开始今天的学习吧~ 引入 支持向量机(SVM)相信大家并不陌生吧?但是如果数据集中有大量无标签数据(如下图b),那么决策边界应该如何去确定呢?仅使用有标签数据学得的决策边界(如下图a)将穿过密集的无标签数据,如果我们假定两个类是完全分开的,那么该决策边界并不是我们想要的,我们希望的决策边界是

异常值检测方法(Z-score,DBSCAN,孤立森林)

 机器学习_深度学习_入门经典(博主永久免费教学视频系列) https://study.163.com/course/courseMain.htm?courseId=1006390023&share=2&shareId=400000000398149 微信扫二维码,免费学习更多python资源 数据预处理的好坏,很大程度上决定了模型分析结果的好坏.(Garbage In Garbage Out!) 其中,异常值(outliers)检测是整个数据预处理过程中,十分重要的一环.方法也是多种多样

车道线检测文献解读系列(一) 基于机器视觉的高速车道标志线检测算法的研究_李晗

作者背景 基于机器视觉的高速车道标志线检测算法的研究_李晗 东北大学车辆工程硕士学位论文 2006年 [GB/T 7714]李晗. 基于机器视觉的高速车道标志线检测算法的研究[D]. 东北大学, 2006. DOI:10.7666/d.y852642.` 论文结构一览 预处理 灰度化 [亮点]模式判别 选择日间模式还是夜间模式: 在每个检测周期开始时,首先判断采用日间模式还是夜间模式工作.摄像机视野中的上半部分为天空背景,天空亮度可以显著区分日间和夜间环境.由于天空的颜色为蓝离,日间天空的蓝色分

常见半监督方法 (SSL) 代码总结

经典以及最新的半监督方法 (SSL) 代码总结 最近因为做实验需要,收集了一些半监督方法的代码,列出了一个清单: 1. NIPS 2015 Semi-Supervised Learning with Ladder Networks https://github.com/CuriousAI/ladder 2. NIPS 2014 Semi-supervised-Learning-with-Deep-Generative-Models https://github.com/wangxiao57915