我正在尝试使用Python scikit-learn的单类SVM。
但我不明白在address处有哪些不同的变量X_outliers
,n_error_train
,n_error_test
,n_error_outliers
等。为什么X
是随机选择的,而不是数据集的一部分?
Scikit-learn"文档"对我帮助不大。另外,我在互联网上找到了很少的例子
我是否可以使用One-Class SVM进行离群值检测,如果数据量很少,我不知道训练集中是否存在异常?
单类SVM是无监督异常值检测(here)
单类SVM不是异常检测方法,而是a 新颖性检测方法(here)
这可能吗?
答案 0 :(得分:1)
这个单类SVM是一个分类器,用于确定条目是否与分类器训练过的条目相似或不相似。
该脚本生成三组:
错误是每个集合中错误分类的条目数。那是;当它们相似时(第1组和第2组)被分类为与训练集不同,或者当它们不相似时(第3组)已经将分类器与训练集相似(<3>)。
答案 1 :(得分:1)
这个答案应该是对 scikit-description 的补充,但我同意这有点技术性。我将在这里详细说明一类 SVM 算法 (OCSVM) 的一些方面。 OCSVM 旨在解决无监督异常检测问题。 给定非结构化(未标记)数据,它将找到一个 n 维空间,一个矩阵 W^T,具有 d 列(T 代表转置)。
所有基于 SVM 的方法(和 OCSVM)的目标函数是: $$f(x) = sign(wT x + b)$$,其中符号表示符号(-1 异常 1 名义)偏移偏差项 b。
在分类问题中,矩阵 W 与 2 个类之间的距离(边距)相关,但这在 OCSVM 中有所不同,因为只有 1 个类并且它从原点最大化(OCSVM 的原始论文演示了 this ) .
如您所见,它是一种通用算法,因为 SVM 是一系列模型,可以近似任何非线性边界,例如神经网络。要实现一些复杂的事情,您必须构建自己的内核矩阵。
为此,您需要找到一些方便的数学属性(此时欢迎提出改进答案的建议)。 但在大多数情况下,高斯核是具有一些非常好的数学特性和相关 ML 定理的核,例如 Large of large numbers。
scikit 实现为 SVM 的 LIBSVM 实现提供了一个包装器,并且有 4 个这样的内核。
-nu 参数是一个问题公式参数,它允许在这里告诉模型我的样本有多脏。 更正式地说,它使问题成为异常检测问题,您知道您的数据是混合的(名义和异常),而不是纯粹的问题不同的地方,它被称为 novelty detection。
内核参数:最重要的决定之一。从数学上讲,内核是一个大的数字矩阵,通过乘法,您可以将数据投影到更高的维度。一个很好的说明问题的读物是 here,而创建 OCSVMK 的 Scholkopf 的 paper 更详细。
伽玛 在鲁棒内核的情况下,您基本上使用高斯投影。 免责声明我的解释:基本上用伽玛参数描述正态分布 $N(\mu, \sigma)$ 的方差有多大。
-容差 一类 svm 搜索在训练数据和原点之间更好地分离的边距。容差是指停止标准或满足二次优化的容差应该多小 目标函数。目标函数告诉 SVM 应该用什么参数来描述一个特定的边界 - 名义和异常之间的空间)见图~()。
答案 2 :(得分:0)
许多Sklearn示例通常基于随机生成的数据。如果要查看有关OneClassSVM如何在真实数据集上进行离群值检测的示例,可以阅读我的文章:https://justanoderbit.com/outlier-detection/one-class-svm/