问题:我有一些要分类的数据集 - 有用(1)/无用(0)。我将提供全套数据作为分类器训练目的的输入。并使用不同的数据集进行测试。
为此,我试图将我的数据转换为LIBSVM格式。在做任何事情之前,我想过提供一个向量的数字输入并检查结果。
输入:
训练:1 1 2(前1表示此向量中有用的类,后跟数字输入) 测试:1 1 2(我不确定输入数据格式)
输出:
(0:0.9982708183417436)(1:0.0017291816582564153)(实际:1.0预测:0.0)
我在训练集中没有0级,但它已经为0级估计了。
我不确定如何将数据转换为数字向量输入,并将数据测试数据集中的数据提取到提供的等效数据。在此方面的任何帮助都得到了极大的赞赏。
计划任务: 1.将所有数据加载到哈希表中,并将密钥保存在具有相应分类器的数据集中 - USEFUL(1)。 2.将数据集提供给svmTrain并获取模型。 3.准备测试数据集(如果找到则将每个单词/短语转换为相应的数值保存训练集。否则,指定新值)。 4.将测试集和模型提供给SVM的EVALUATE方法。 5.从USEFUL类中获取结果向量并重新映射到数据。
代码:来自不同来源。public class Datatosvmformat {
static double[][] train = new double[1000][3];
public static void main(String[] args) {
// TODO Auto-generated method stub
HashMap<String, Integer> dataSet = new HashMap<String, Integer>();
double[][] test = new double[10][3];
train[1][0] = 1;
train[1][1] = 1;
train[1][2] = 2;
svm_model model = svmTrain();
//Test Data Set
double[] test1 = new double[3];
test1[0] = 1;
test1[1] = 1;
test1[2] = 2;
evaluate(test1,model);
}
private static svm_model svmTrain() {
svm_problem prob = new svm_problem();
int dataCount = train.length;
prob.y = new double[dataCount];
prob.l = dataCount;
prob.x = new svm_node[dataCount][];
for (int i = 0; i <dataCount; i++){
double[] features = train[i];
//ystem.out.println("Features "+features[i]);
prob.x[i] = new svm_node[features.length-1];
for (int j = 1; j < features.length; j++){
svm_node node = new svm_node();
node.index = j;
node.value = features[j];
prob.x[i][j-1] = node;
}
prob.y[i] = features[0];
}
svm_parameter param = new svm_parameter();
param.probability = 1;
param.gamma = 0.5;
param.nu = 0.5;
param.C = 1;
param.svm_type = svm_parameter.C_SVC;
param.kernel_type = svm_parameter.LINEAR;
param.cache_size = 20000;
param.eps = 0.001;
svm_model model = svm.svm_train(prob, param);
return model;
}
public static double evaluate(double[] features, svm_model model)
{
svm_node[] nodes = new svm_node[features.length-1];
for (int i = 1; i < features.length; i++)
{
svm_node node = new svm_node();
node.index = i;
node.value = features[i];
nodes[i-1] = node;
}
int totalClasses = 2;
int[] labels = new int[totalClasses];
svm.svm_get_labels(model,labels);
double[] prob_estimates = new double[totalClasses];
double v = svm.svm_predict_probability(model, nodes, prob_estimates);
for (int i = 0; i < totalClasses; i++){
System.out.print("(" + labels[i] + ":" + prob_estimates[i] + ")");
}
System.out.println("(Actual:" + features[0] + " Prediction:" + v + ")");
return v;
}
}
答案 0 :(得分:0)
我不完全确定,但问题可能是因为您需要使用+1
标记正面示例,使用-1
标记负面示例。
否则,libsvm软件可以将一个任意类(例如0
)分配给训练向量1 1 2
,因为它将特征向量的前一个元素作为特征值(而不是标签)类)。
因此,尝试将正面示例中的类标签1更改为+1(负面示例为-1)。
通常,对于libsvm的数据格式如下:
<label> <index1>:<value1> <index2>:<value2>
其中:
可以在此页面找到libsvm工具接受的数据格式示例: LIBSVM Data: Classification (Binary Class)
您可以浏览许多数据集,以了解libsvm工具接受的数据格式。