【问题标题】:Training one-class SVM训练一类 SVM
【发布时间】:2012-06-27 05:32:31
【问题描述】:

我正在尝试使用 libsvm 实现来熟悉 1-class SVM。 正如我所读到的,libsvm 的 1-class 任务中没有类标签。 但是在读取没有标签列的数据文件时,总是会出现读取错误。 我尝试标记我的玩具数据,然后使用 svm-train 测试结果模型,但准确度总是很糟糕,大约 50%。

我的问题是,如果我有一个带标签的数据集(例如,数百个高斯分布的 2d 点和其中的几个异常值),我如何使用这些数据训练 libsvm,以及如何估计结果的准确性型号?

【问题讨论】:

    标签: distribution svm libsvm


    【解决方案1】:

    1) LIBSVM (C/C++) 的一行训练集如下(称为稀疏数据格式):

    标签 1:value1 2:value2 .....

    (每行以 '\n' 字符结束)

    必须提供标签栏,即使是一类情况;只是它可以是任何数字。 LIBSVM 在训练过程中会忽略它。这应该会消除您的读取错误。

    2) 关于您对玩具数据的准确性,您是否对“nu”和“g”参数进行了交叉验证?这些是一类 SVM 模型的超参数。您可能还想摆弄内核类型。那 50% 是在训练集还是测试集还是验证集上?

    3) 由于一类SVM本质上是做高维密度估计,所以训练集的所有点都应该落在超球面上或内部,它们都应该属于一个类。你可以参考here。您必须找到一种方法来构建一个没有异常值的训练集,并将异常值作为测试点(也可能包含一些属于圈内的点)来估计模型的准确性。如果这不可能,您必须求助于其他异常值检测方法,例如聚类。好消息是文献中有强大的聚类算法。

    4)您的数据集是二维的,因此首先绘制它们并了解数据集和异常值应该不难。

    【讨论】:

    • 嗨,杰伊,您的回复很有帮助。但是,我仍然有点困惑。你看过这个帖子吗?基本上,这家伙是说不可能对一类 SVM 进行交叉验证。你怎么看? stackoverflow.com/questions/16550329/…
    • @leon:我不同意其中的一些观点。如果您有兴趣,我已经添加了我的答案。
    猜你喜欢
    • 2013-10-18
    • 2013-04-14
    • 2015-05-04
    • 2015-07-25
    • 2012-11-03
    • 2015-04-18
    • 2015-01-22
    • 2018-12-20
    相关资源
    最近更新 更多