1

我想在 MATLAB 中使用 LibSVM 使用一类分类。

我想训练数据并使用交叉验证,但我不知道如何标记异常值。

例如,如果我有这些数据:

trainData =  [1,1,1; 1,1,2; 1,1,1.5; 1,1.5,1; 20,2,3; 2,20,2; 2,20,5; 20,2,2];
labelTrainData = [-1 -1 -1 -1 0 0 0 0];  

(前四个是1类的例子,其他四个是异常值的例子,只是为了交叉验证)

我使用以下方法训练模型:

model = svmtrain(labelTrainData, trainData , '-s 2 -t 0 -d 3 -g 2.0 -r 2.0 -n 0.5 -m 40.0 -c 0.0 -e 0.0010 -p 0.1 -v 2' );

我不确定使用哪个值来标记 1 类数据以及对异常值使用什么值。有人知道该怎么做吗?

提前致谢。-杰西卡

4

1 回答 1

0

根据http://www.joint-research.org/wp-content/uploads/2011/07/lukashevich2009Using-One-class-SVM-Outliers-Detection.pdf “由于一类中缺少类标签SVM,不可能使用交叉验证来优化内核参数”。但是,根据LIBSVM FAQ,这并不完全正确:

问:如何为一类 SVM 选择参数,因为训练数据只有一类?您已经预先指定了真阳性率,然后搜索实现类似交叉验证准确性的参数。

此外,libsvm 源的 README 对输入数据进行了说明:“对于分类,标签是指示类标签的整数……对于一类 SVM,它不被使用,因此可以是任何数字。”

我认为您的异常值不应包含在训练数据中 - libsvm 将忽略训练标签。您要做的是找到一个包含良好数据但不包含异常值的超球面。如果您在数据中使用异常值进行训练,LIBSVM 将尝试找到一个包含异常值的超球面,这正是您不想要的。因此,您将需要一个没有异常值的训练数据集、一个用于选择参数的带有异常值的验证数据集,以及一个最终测试数据集,以查看您的模型是否泛化。

于 2013-05-17T01:45:40.703 回答