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

Posted

技术标签:

【中文标题】在 libsvm matlab 中标记一个类以进行交叉验证【英文标题】:Labeling one class for cross validation in libsvm matlab 【发布时间】:2013-05-09 03:44:46 【问题描述】:

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

提前致谢。 -杰西卡

【问题讨论】:

查看以下帖子。 one-class svm,顾名思义,你的训练集中只有一个类***.com/questions/14588967/one-class-svm-libsvm 谢谢,不过,我还有下一个疑问。所以不可能对一类/异常值使用交叉验证?我使用了 weka 包装器,如果我使用标有“?”的实例他们只是在训练过程中被忽略了。 另外,哪个标签对一个班级来说是正确的?只是任何数字,还是我应该严格使用 -1 或特定值? 任何数字都可以作为标签(尝试使用不同的标签,看看是否会改变你的分类器)......虽然不确定交叉验证。 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于在 libsvm matlab 中标记一个类以进行交叉验证的主要内容,如果未能解决你的问题,请参考以下文章

libsvm 交叉验证与 matlab 中的预计算内核

准备我的数据以在 SVM libsvm matlab 中进行训练 [关闭]

我的模型在 libsvm 工具箱 matlab 中预测所有正类到负类

缩放 LIBSVM 的测试数据:MATLAB 实现

请问Matlab的libsvm工具箱如何进行多元回归?

使用 LibSVM 进行分类