机器学习 - 单类分类/新颖性检测/异常评估?

3
我需要一个机器学习算法,满足以下要求:
  • 训练数据是一组特征向量,全部属于同一“正”类(我无法生成负的数据样本)。
  • 测试数据是一些可能属于正类的特征向量,也可能不属于正类。
  • 预测结果应该是连续的值,表示与正样本之间的“距离”(例如,0表示测试样本明显属于正类,1表示它明显为负,但0.3表示它有一定的正性)。
例如: 假设特征向量是二维的。
正训练数据:
  • (0,1)、(0,2)、(0,3)
测试数据:
  • (0,10)应该是一个异常数据,但不是明显的异常;
  • (1,0)应该是一个异常数据,但比(0,10)的“等级”更高;
  • (1,10)应该是一个异常数据,且具有更高的异常“等级”。

这个想法是检查与正例(例如异常检测中的)之间的“距离”。 我实际上正在寻找一个以百分比为单位的异常检测算法(异常的规模是多少)。 - ido4848
你能更具体一些吗?例如,你的数据是关于什么的?你能提供一些样本输入数据以及你期望的结果吗? - miraculixx
@miraculixx 我已经添加了一个例子。 - ido4848
1个回答

2
你描述的问题通常被称为异常值、异常检测或新颖性检测。有许多技术可以应用于这个问题。关于新颖性检测技术的详细分类可以在这里找到。该文章对这些技术进行了全面的分类和简要描述,但作为一个起点,我会列出一些标准的技术:
  • K最近邻算法 - 一种简单的基于距离的方法,假设正常数据样本靠近其他正常数据样本,而新颖样本则远离正常点。Python实现的KNN可以在ScikitLearn中找到。
  • 混合模型(如高斯混合模型)-概率模型,建模数据的生成概率密度函数,例如使用高斯分布的混合物。给定一组正常数据样本,目标是找到一个概率分布的参数,使其最好地描述样本。然后,使用新样本的概率来决定它是否属于分布或是异常值。ScikitLearn实现了高斯混合模型并使用期望最大化算法来学习它们。
  • 单类支持向量机(SVM) - 标准SVM分类器的扩展,尝试找到将正常样本与未知新颖样本分开的边界(在经典方法中,通过最大化正常样本和空间原点之间的边缘来找到边界,投影到所谓的“特征空间”)。ScikitLearn有一个单类SVM的实现,可以轻松使用,并提供一个不错的示例。我附上这个示例的图表,以说明单类SVM找到的边界“围绕”正常数据样本: enter image description here

关于混合模型,当你说“使用新样本的概率来决定它是否属于分布或是异常值”时,这个概率具体指什么?例如,sci-kit GMM的predict_proba方法(http://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture)返回一个概率向量,其总和为1。我希望一个新颖性的方法可以返回一个所有组件概率都非常低的向量,因此不一定总和为1。 - felipeduque
2022年,我发现了一项非常有启发性的综合调查,其中包括传统和深度学习方法,链接在这里 https://arxiv.org/abs/1901.03407v2 。顺便说一句,我并没有从推广中获得任何好处,我只是看到了这篇文章,觉得更新一下会很好 :) - cestpasmoi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接