也许这是一个简单的问题,但我想确保我理解一类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矩阵。感谢您的帮助。
答案 0 :(得分:2)
你在这里做的只不过是一个奇特的范围检查。 如果您不愿意使用X
来查找Y
中的异常值(即使您确实应该这样做),那么只需检查一下分布情况会更简单,更好Y
找到异常值而不是这个即兴的SVM解决方案(例如从Y
中移除上下0.5个百分点)。
实际上,这可能与您 想要做的事情甚至没有关系。使用此设置,您将Y
值拒绝为异常值而不考虑任何上下文(例如X
)。你为什么使用RBF?你是如何为gamma
提出特定值的?内核对于一维数据来说是完全过度的。
其次,您正在训练和测试相同的数据(Y
)。每当这种情况发生时,小猫就会死亡一类SVM尝试构建一个识别训练数据的模型,它不应该用于构建它的相同数据。请想一想小猫。
此外,请注意,单类SVM的nu
参数控制分类器将接受的异常值的数量。这在LIBSVM implementation document(第4页)中进行了解释:事实证明nu
是训练误差的上限和
支持向量分数的下限。换句话说:您的培训选项明确规定最多可以拒绝1%的数据。对于单类SVM,请将 替换为 。
因此,当你说所得到的模型确实会产生与我期望的一致的性能 ......当然,它的确如此。由于您设置了nu=0.01
,因此1%的数据被模型拒绝,因此被标记为异常值。