我正在尝试解决异常检测问题,因此我目前正在探索哪种算法最适合我的选项。
我一直在研究 Python 的 scikit-learn 库中的一类 SVM。它有一个nu您传递给它的参数,该参数大致确定了允许将多少百分比的训练数据误标记为异常。
这可能只是缺乏对一类 SVM 的基本知识的理解,但我想知道为什么我不能将nu参数设置为零。在我的应用程序中,更重要的是确保我不会将某事标记为异常,而不是错过实际的异常。
我只是需要更多数据以便我可以设置一个非常低的值nu吗?
我正在尝试解决异常检测问题,因此我目前正在探索哪种算法最适合我的选项。
我一直在研究 Python 的 scikit-learn 库中的一类 SVM。它有一个nu您传递给它的参数,该参数大致确定了允许将多少百分比的训练数据误标记为异常。
这可能只是缺乏对一类 SVM 的基本知识的理解,但我想知道为什么我不能将nu参数设置为零。在我的应用程序中,更重要的是确保我不会将某事标记为异常,而不是错过实际的异常。
我只是需要更多数据以便我可以设置一个非常低的值nu吗?
正如@Joe 已经提到的,:
在数学上,二次规划最小化函数是:

因此,如果太小,问题正在变成一个硬边距算法(第二项是无穷大)。并且该算法将找到唯一的支持超平面,该超平面具有将所有数据与原点分开的特性,并且它与原点的距离在所有此类超平面中是最大的,正如您所说,这是 100% 的训练准确度。您可以尝试设置nu一个较小的值而不是0. 也许包不允许在成本函数中出现 -Inf。
是的,但前提是数据是可分离的。数据集的可分离性可能取决于您使用的核函数(例如,如果您使用的是点积,则 "separable" = "linearly separable"),但某些数据集在任何核函数下都不可分离,例如下面的数据集在:
positive_examples = [(0,0), (1,1), (2,2)]
negative_examples = [(0,0), (2,1), (3,2)] # (0,0) 属于两个类别
“硬边距”SVM 试图用(超)平面(可能在内核函数暗示的一些古怪空间中)完美地分离数据,然后最大化边距(该平面两侧的空间)。最大化边距控制泛化误差。
“软边距”SVM 试图做同样的事情,但它允许少量的错误分类。最小化错误分类和最大化边距之间的权衡由一个称为. 你提到的参数() 是重新参数化这比选择和解释更容易是。
引用此 StackOverflow 上关于硬边距与软边距 SVM 的帖子(我建议您阅读):
参数 nu 是边际误差分数的上限,也是支持向量相对于训练样本总数的分数的下限。例如,如果您将其设置为 0.05,则可以保证最多 5% 的训练示例被错误分类(尽管代价很小),并且至少 5% 的训练示例是支持向量。
你说“对我来说更重要的是确保我不会将某事标记为异常,而不是错过一个实际的异常。” 这似乎是一个很好的论点,但我们在这里谈论的是训练错误而不是泛化错误。绝对完美地拟合训练数据是灾难过拟合的秘诀。(另外,作为旁注,听起来您可能希望优化精度而不是准确性,或者至少将误报加权为比误报更严重的错误。)
每当我们将复杂的模型拟合到数据时,重要的是我们要了解模型复杂性和泛化误差的权衡。简单模型可以从很少的数据中很好地概括,但它们可能会错过数据中真正的复杂性。复杂模型可以匹配数据中的复杂性,但它们也匹配数据中的噪声(这使得它们的泛化能力很差)。所有机器学习模型都试图建立某种“正则化”,这会惩罚模型复杂性的某种度量(可以用准确性进行权衡,该参数通常通过交叉验证来选择)。