我正在尝试使用 libsvm 实现来熟悉 1-class SVM。正如我所读到的,libsvm 的 1-class 任务中没有类标签。但是在读取没有标签列的数据文件时,总是会出现读取错误。我尝试标记我的玩具数据,然后使用 svm-train 测试结果模型,但准确度总是很糟糕,大约 50%。
我的问题是,如果我有一个带标签的数据集(例如,数百个高斯分布的 2d 点和其中的几个异常值),我如何使用这些数据训练 libsvm,以及如何估计结果模型的准确性?
我正在尝试使用 libsvm 实现来熟悉 1-class SVM。正如我所读到的,libsvm 的 1-class 任务中没有类标签。但是在读取没有标签列的数据文件时,总是会出现读取错误。我尝试标记我的玩具数据,然后使用 svm-train 测试结果模型,但准确度总是很糟糕,大约 50%。
我的问题是,如果我有一个带标签的数据集(例如,数百个高斯分布的 2d 点和其中的几个异常值),我如何使用这些数据训练 libsvm,以及如何估计结果模型的准确性?
1) LIBSVM (C/C++) 的一行训练集如下所示(称为稀疏数据格式):
标签 1:value1 2:value2 .....
(每行以 '\n' 字符结束)
即使是一类情况,您也必须提供标签栏;只是它可以是任何数字。LIBSVM 在训练过程中会忽略它。这应该可以消除您的读取错误。
2)关于您对玩具数据的准确性,您是否对“nu”和“g”参数进行了交叉验证?这些是一类 SVM 模型的超参数。您可能还想摆弄内核类型。那 50% 是在训练集、测试集还是验证集上?
3)由于一类SVM本质上是做高维密度估计,所以训练集的所有点都应该落在超球面上或内部,它们都应该属于一个类。你可能想参考这里。您必须找到一种方法来构建一个没有异常值的训练集,并将异常值作为测试点(也可能包含一些属于圈内的点)来估计模型的准确性。如果这不可能,您必须求助于其他异常值检测方法,例如聚类。好消息是文献中有强大的聚类算法。
4)您的数据集是二维的,因此首先绘制它们并了解数据集和异常值应该不难。