我正在尝试为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
如果某人可以提供示例或链接到一个示例,说明如何做到最好,我们将不胜感激。感谢。
答案 0 :(得分:1)
对于svm_problem
,i = 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
。