在libsvm matlab中标记一个类进行交叉验证

时间:2013-05-14 18:33:17

标签: matlab label libsvm outliers cross-validation

我想在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类数据以及对异常值使用什么。有人知道怎么做吗?。

提前致谢。 -Jessica

1 个答案:

答案 0 :(得分: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将尝试找到包含异常值的超球面,这正是您不想要的。因此,您需要一个没有异常值的训练数据集,一个用于选择参数的异常值的验证数据集,以及一个最终的测试数据集,以查看您的模型是否一般化。