1

也许这是一个简单的问题,但我想确保我理解一类 SVM 的 LibSVM 实现的概念基础,以及我所做的是否是允许的。

在这种情况下,我使用一类 SVM 进行异常值检测和删除。这在更大的时间序列预测模型的上下文中用作数据预处理步骤。也就是说,我有一个 Y 向量(这是我们试图预测的数量并且是连续的,而不是类标签)和一个 X 矩阵(用于预测的连续特征)。由于我想在预处理步骤的早期检测数据中的异常值,因此我尚未标准化或滞后 X 矩阵以用于预测,或者就此而言去趋势/去除噪声/或以其他方式处理 Y 向量(已经缩放在 [-1,1] 内)。我的主要问题是这样建模一类 SVM 是否正确(使用 libSVM):

svmod = svmtrain(ones(size(Y,1),1),Y,'-s 2 -t 2 -g 0.00001 -n 0.01');
[od,~,~] = svmpredict(ones(size(Y,1),1),Y,svmod);

由此产生的模型确实产生了与我预期的结果有些相符的性能(99% 左右的预测准确度,这意味着 1% 的观察结果是异常值)。但我之所以问,是因为在关于一类 SVM 的其他问题中,人们似乎在我使用 Y 的地方使用他们的 X 矩阵。感谢您的帮助。

4

1 回答 1

2

你在这里所做的只不过是一个花哨的范围检查。如果您不愿意使用X在其中查找异常值Y(即使您确实应该),那么仅检查分布Y以查找异常值而不是这种即兴的 SVM 解决方案会更简单和更好(例如删除上和下0.5-百分位数Y)。

实际上,这可能甚至与您真正想要做的事情都不接近。使用此设置,您将拒绝Y值作为异常值而不考虑任何上下文(例如X)。你为什么使用 RBF 以及你是如何得出这个特定值的gamma?对于一维数据,内核完全是矫枉过正。

其次,您正在对相同的数据进行训练和测试(Y)。每次发生这种情况都会有一只小猫死亡。一类 SVM 试图构建一个识别训练数据的模型,它不应该用于构建它的相同数据。请想想小猫。


此外,请注意,nu一类 SVM 的参数控制分类器将接受的异常值的数量。这在LIBSVM 实施文档(第 4 页)中进行了解释:证明nu是训练错误分数的上限和支持向量分数的下限。换句话说:您的训练选项明确指出,最多可以拒绝 1% 的数据。对于一类 SVM,将can替换为should

因此,当您说生成的模型确实产生的性能与我的预期有些一致时……当然,根据定义,它确实如此。由于您已设置nu=0.01,因此模型拒绝了 1% 的数据,因此将其标记为异常值。

于 2013-07-31T22:22:38.407 回答