是否可以训练一类 SVM 使其训练误差为零?

机器算法验证 机器学习 分类 支持向量机 Python scikit-学习
2022-03-30 04:33:47

我正在尝试解决异常检测问题,因此我目前正在探索哪种算法最适合我的选项。

我一直在研究 Python 的 scikit-learn 库中的一类 SVM。它有一个nu您传递给它的参数,该参数大致确定了允许将多少百分比的训练数据误标记为异常。

这可能只是缺乏对一类 SVM 的基本知识的理解,但我想知道为什么我不能将nu参数设置为零。在我的应用程序中,更重要的是确保我不会将某事标记为异常,而不是错过实际的异常。

我只是需要更多数据以便我可以设置一个非常低的值nu吗?

2个回答

正如@Joe 已经提到的,ν

  1. 设置异常值比例的上限(训练样本被认为是类外的),并且,
  2. 用作用作支持向量的训练示例数量的下限。

在数学上,二次规划最小化函数是:

在此处输入图像描述

因此,如果ν太小,问题正在变成一个硬边距算法(第二项是无穷大)。并且该算法将找到唯一的支持超平面,该超平面具有将所有数据与原点分开的特性,并且它与原点的距离在所有此类超平面中是最大的,正如您所说,这是 100% 的训练准确度。您可以尝试设置nu一个较小的值而不是0. 也许包不允许在成本函数中出现 -Inf。

我可以在 SVM 中实现零训练错误吗?

是的,但前提是数据是可分离的。数据集的可分离性可能取决于您使用的核函数(例如,如果您使用的是点积,则 "separable" = "linearly separable"),但某些数据集在任何核函数下都不可分离,例如下面的数据集在R2

positive_examples = [(0,0), (1,1), (2,2)]

negative_examples = [(0,0), (2,1), (3,2)] # (0,0) 属于两个类别

如果它不可分离,我们该怎么办?

“硬边距”SVM 试图用(超)平面(可能在内核函数暗示的一些古怪空间中)完美地分离数据,然后最大化边距(该平面两侧的空间)。最大化边距控制泛化误差。

“软边距”SVM 试图做同样的事情,但它允许少量的错误分类。最小化错误分类和最大化边距之间的权衡由一个称为C. 你提到的参数(ν) 是重新参数化C这比选择和解释更容易C是。

好的,那么解释是什么ν?

引用此 StackOverflow 上关于硬边距与软边距 SVM 的帖子(我建议您阅读):

参数 nu 是边际误差分数的上限,也是支持向量相对于训练样本总数的分数的下限。例如,如果您将其设置为 0.05,则可以保证最多 5% 的训练示例被错误分类(尽管代价很小),并且至少 5% 的训练示例是支持向量。

为什么我要允许错误?

你说“对我来说更重要的是确保我不会将某事标记为异常,而不是错过一个实际的异常。” 这似乎是一个很好的论点,但我们在这里谈论的是训练错误而不是泛化错误。绝对完美地拟合训练数据是灾难过拟合的秘诀。(另外,作为旁注,听起来您可能希望优化精度而不是准确性,或者至少将误报加权为比误报更严重的错误。)

每当我们将复杂的模型拟合到数据时,重要的是我们要了解模型复杂性和泛化误差的权衡。简单模型可以从很少的数据中很好地概括,但它们可能会错过数据中真正的复杂性。复杂模型可以匹配数据中的复杂性,但它们也匹配数据中的噪声(这使得它们的泛化能力很差)。所有机器学习模型都试图建立某种“正则化”,这会惩罚模型复杂性的某种度量(可以用准确性进行权衡,该参数通常通过交叉验证来选择)。