本文记录的目的是方便自己学习和复习,有误之处请谅解,欢迎指出。
我们日常项目中经常会遇到数据不均衡的情况,这非常普遍,例如某动物分类项目的类别数量占比为300:100:900:500,直接训练模型会导致模型偏向数量多的一类,个人认为模型偏向一侧的原因是:由于数量较多的类别,每次被传递调整的损失就较多,而其他类别可能还没被完全训练好,该类已经完成拟合,如何解决呢?常用的解决方法:增加数据、上采样、下采样以及调整类别权重(Focal Loss)等,可以一定程度解决问题。
但是还有种非常极端不均衡情况,如类别数量比10W:1的二分类,这可以被认为是异常检测范畴,上述解决方法并不能很好的解决此问题。
对于异常检测,之前有写过一篇粗略介绍异常检测的文章。今天再记录另外两种异常检测算法——自编码和SVDD(one class svm).
(1) 自编码
自编码是一个BP神经网络,模型的输入层和输出层的神经元数量一致,中间层可以有多层,一般中间层的节点个数比输出层少,中间层相当于是对数据进行压缩和抽象,到恢复重建,实现无监督方式学习数据的抽象特征。
训练自编码只需要正样本数据,没有负样本数据,或者说模型只关注正样本的规律,利用正样本从输入数据-提取特征-恢复数据的方式训练一个自编码器,编码器相当于单分类的模型,对全量数据进行预测时,然后比较输入层和输出层的相似度就可以判断是否属于异常样本,相似度阈值自行设置。
截取一张模型构建和训练过程的代码图,简单看看应该能比较清楚的理解这个过程
下图是正样本和负样本的相似度图。能明显观察到异常样本的重构误差的分布不同于正常样本,异常样本的重构误差明显更大。那么我们可以设置一个阈值,超过阈值的样本是异常的,而不超过阈值的样本是正常的。