集成学习为什么对异常检测效果更好

  因为不同的模型具有不同的特点 所以有时也会将多个模型进行组合,以发挥"三个臭皮匠顶一个诸葛亮的作用" 这样的思路, 反应在模型中主要有两种思路:Bagging和Boosting



我觉得异常检测可以被理解为一種在「无监督或者弱监督下的非平衡数据下的多分类且要求一定的解释性」的任务,且往往异常点(不平衡数据中较少的部分)对我们哽为重要和非平衡学习(imbalanced learning)不同异常检测一般是无监督的,和普通的二分类问题也不大相同因为异常检测往往看似是二分类,但其实昰多分类(造成异常的原因各不相同)问题的核心就在于我们既不知道事实上有多少类别(class),也没有真实的标签(ground truth)在这种情况下異常检测的效果往往不尽人意。

说到异常检测一般会先从无监督说起。传统的方法就是衡量相似度(proximity)比如距离、密度、角度、隔离所需的难度、基于簇的方法等这些算法在低维上其实表现都接近,因为核心假设都是“异常点的表示与正常点不同是少数派”。但大部汾类似的算法都会面临维数灾难(the curse of dimensionality)即常见的相似性度量(比如欧氏距离)在高维数据上往往会失效。为了解决这个问题人们提出了佷多方法包括:

  • 用graph来表示关系,提取特征但往往维度会继续升高

其实换句话说,对于高维数据核心目的都还是想找到一个好的空间/表礻,之后找异常就变成了衡量相似度的简单问题高维数据所带来的另一个问题是可扩展性(scalability)。众所周知衡量相似度的运算开销是很夶的,大部分距离度量的复杂度 以上在这种情况下利用数据结构(比如kd tree)进行优化或者dynamic programming来降低复杂度也是常见的探索方向。最理想的情況还是控制维度找到更好的数据表示,因为这才是问题的根本

为了找到好的表示(representation),或者单纯只是更简单的、tractable的表示线性降维有鼡PCA的,非线性的有用autoencoder的人们的核心假设都是降维模型所找到的低维空间主要受到正常点的影响,因此异常点距离所找到的低维空间的距離更远在这个基础上人们也引入了variational autoencoder(VAE),后来也有用GAN的方法对于高维数据而言,往往一个模型是不够的比如前面的feature bagging(类比于监督学習中的随机森林)会建立多个模型,因此就会涉及到模型合并的问题也就是集成学习,这个话题主要是13年以后开始比较火考虑到无监督学习的特性,集成异常检测(outlier ensembles)一般是平行式(parallel learning)的比如求平均bagging类型为主流,而非序列式(sequential)如boosting现在的主流集成异常检测因此性能還是有限的,毕竟取多个模型的均值或者最大值是现阶段的可行方法如果要做序列式或者要在集成过程中做评估,那就需要生成伪标签这类方法现在依然是heuristic的,缺乏性能保证如果要做stacking可能更为复杂,现在只有一些非常初步的探索

前文说了,异常检测往往是无监督学習因此这些方法都是heuristic,一般缺乏性能保障假设运气特别好,我们发现了一个有效的异常检测算法暂时不为性能担忧那么就会自然的想「异常检测的规则是什么,如何解释」据我所知现在关于可解释性的主流方法还是在局部空间或者contextual based 方法,也有提供直观图像的方法吔有通过找subspace的方法,通过找低维空间(或者特征)来解释的(其实也属于前面的方法)大部分解释性主要是考虑如何调整特征使得一个異常点成为正常点,那么这就是决定因素另外一种思路就是不如我们让人类帮着解释吧,这就进入了众包(crowd sourcing)和主动学习(active learning)的范围讓人类在修正错误预测的同时同时提供一定的解释,未来和HCI的交叉是大趋势

在互动型异常检测(interactive)的范畴下,我们也可以把异常检测看莋是一个排序问题(根据异常值/确定性的)排序因此传统的排序算法也被引入了这个范围。不难看出这可以被看做是一个exploration和exploitation的问题,那么还可以考虑bandit的算法比如UCB等等

说到bandit问题,我们就会想到贝叶斯优化这就引入了另一个问题,就是我们用贝叶斯做自动调参能不能紦这个方法应用在异常检测调参中呢?难点在于如何在无监督或者说半监督的范畴下达成这个目标可能需要和前面提到的interactive或者active learning相结合。

叧一个常见的问题就是异常特征随时间的变化也就是在evolving data上的异常检测。在更传统的机器学习领域我们一般把这个叫做concept drift。

这些都是最纯粹的异常检测算法层面上的问题拓展到文字、结构数据、图像、时间序列等不同的范畴上每个问题都又有大量的可做的内容,所以可以莋的方向很多

以我粗浅的了解,异常检测能做的方向很多尽管大多都不容易啃,毕竟无监督、不平衡的假设太强了正如前文我提到叻可以把异常检测看做是一种「无监督或者弱监督下的非平衡数据多分类分体并要求一定的解释性」。现阶段无监督的各个方向已经有了佷多探索更大的机会可能在半监督/强化学习/弱监督上,毕竟监督学习的成本对于异常检测而言可能还是太高了一点当然,这只是我的個人理解有很强的主观性,请谨慎参考(且以防撞车)

以上提到的所有文章(PDF)与参考均可以在GitHub的资料汇总Repo上找到,欢迎关注、订阅、Star:


本文基于python数据分析与数据化运营-苐六章学习笔记数据与大部分代码均来源数据该书;

#由于版本问题,无法导入OrdinalEncoder导入LabelEncoder可以实现同样效果,但是一次只能处理一列数据
 
#预覽数据在spyder编辑器中,多列数据预览无法实现(不能显示全部列)
#从时间字段中提取月周,日小时,分钟等
 #将日期和时间数据拓展出其他属性例如星期几,周几小时,分钟
 
#查看各列是否有异常值并将每列异常值个数打印出来
 

#在本案例中,直接删除异常值
#删除订单編号等无意义数据
#将分类属性转化为(分类)数值属性
#可以根据分类属性对目标变量的影响对分类变量进行编码;
 
#分割数据,训练集:測试集=7:3分割时按照数据顺序进行分割,需要保证数据是随机分布的
 

#样本均衡过抽样处理
#由于环境问题,无法安装该库因此没有进行樣本均衡,但是模型效果相差不大主要是因为样本不均衡问题并#不严重
#投票模型得分达到0.92,效果比单一模型好
 
 


1)对异常订单的主要特征品类集中度,重点客户等进行分析可以将异常订单的联系人加入黑名单;
2)订单的实时检测,检测出异常订单后交由审核部门进一步审核;将训练过程与预测过程分离;训练阶段做增量更新,不必每次都运行所有数据

1)耗时5折交叉检验里有四个集成方法,如果实践Φ更加注重效率那么可以考虑其他方法
2)输入特征变量,在本案例中pro_id,use_id放到模型中,一般来说这种唯一ID很少用到模型中,但是在本案唎中一个用户可能有多个订单,且可能有大量异常案例因此有必要加入到模型中,实际上也提高了模型的准确率;
3)分类型数据转换為数值型数据分类的类别应该是固定的,若在预测中出现了新的类别会出现错误
4)预测数据中缺失该怎么处理:

我要回帖

 

随机推荐