【问题标题】:How to divide svm_problem into 5 folds for custom cross validation - LIBSVM如何将 svm_problem 分成 5 折进行自定义交叉验证 - LIBSVM
【发布时间】:2015-01-10 04:29:24
【问题描述】:

我正在尝试为 LIBSVM 实现我自己的交叉验证功能,但是我对如何根据我的输入数据处理提供给我的数据结构感到困惑。

数据存储在一个结构svm_problem中:

public class svm_problem implements java.io.Serializable
{
    public int l;
    public double[] y;
    public svm_node[][] x;
}

在哪里: l 是数据集的长度; y 是包含其目标值的数组; x 是一个指针数组,每个指针都指向一个训练向量的表示。

svm_node定义为:

public class svm_node implements java.io.Serializable
{
    public int index;
    public double value;
}

我的目标是将训练数据分成 5 份,其中 4 份用于训练(函数 svm_train),其余的用于测试结果(svm_predict),以找出 C 的哪个值具有最佳预测结果(基于错误函数)。

我的问题是如何根据数据的结构将数据分成 5 折。如何将数据结构正确划分为 5 折,以便我继续进行 C 的优化。

我一直以此为指导: A Practical Guide to Support Vector Classification

如果有人能提供一个例子或一个例子的链接,说明如何最好地做到这一点,我们将不胜感激。谢谢。

【问题讨论】:

    标签: java data-structures svm libsvm cross-validation


    【解决方案1】:

    对于 i = 0, 1, ..., l - 1svm_problem 描述了对于学习函数 ff(x[i]) 应该近似等于 y[i]。每个元组 (x[i], y[i]) 都可以被认为是您试图找到的函数 f 的噪声样本。

    要将您的数据集拆分为训练、交叉验证和测试数据集,您可以简单地将集合 {0, 1, ..., l - 1} 随机拆分为这 3 个部分。这通常通过改组数字列表0, 1, ..., l - 1 然后说“前 60% 的数字是训练,接下来的 20% 是交叉验证,接下来的 20% 是测试”或类似的东西来完成。对于数据集的每个子集,您都可以构建一个新的svm_problem,它仅描述该部分数据。

    【讨论】:

    • 我已经有两个数据集,一个用于训练,一个用于测试。我正在尝试将训练数据集拆分为 5 折,以便执行交叉验证以找到最佳 C 值。当整个数据集用于训练 svm 时,将使用此 C 值。我不确定如何使用其他四个来验证每个集合以找到最佳 C。(C 将由我手动更新)。应该将其他四个合并然后传递到 svm_train 还是应该将每个单独传递到 svm_train ?这些函数包含在 Libsvm 中。
    • @MattKoczwara 假设 svm_train 正在逐步更新模型参数,实际上,您输入四个 20% svm_problem 实例还是一个 80% svm_problem 实例并不重要。我不熟悉特定的库,但我描述的拆分数据的方式在机器学习方面非常普遍。
    猜你喜欢
    • 2020-07-12
    • 2012-02-04
    • 2016-04-05
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2014-07-27
    • 2020-05-15
    相关资源
    最近更新 更多