如何将svm_problem划分为5倍以进行自定义交叉验证 - LIBSVM

时间:2014-11-13 05:25:50

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

我正在尝试为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

如果某人可以提供示例或链接到一个示例,说明如何做到最好,我们将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

对于svm_problemi = 0, 1, ..., l - 1描述f(x[i])应该与学习函数y[i]大致相等f。每个元组(x[i], y[i])都可以被认为是您要查找的函数f中的嘈杂样本。

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