javaML分类的结果总是一回事

时间:2014-02-13 07:56:31

标签: java machine-learning svm

我正在使用javaML对我的数据进行分类。

我尝试的是:

认为我有两个类别cat1,cat2,所以我这样做Instance

Instance instance = new SparseInstance();

任何功能在cat1和cat2中都有特定的索引,所以我使用它:

//each instance contains one document
instance.put(index,value);
//for example this instance belongs to cat1 
instance.setClassValue("cat1");
dataSet.add(instance);

因此,其他instance会像dataSet一样添加到testDataSet

之后我尝试使dataSet与我为分类器创建for (Instance inst : testDataSet) { Object predictedClassValue = classifier.classify(inst); System.out.println(predictedClassValue); } 所做的完全相同,这意味着索引相同但值不同

但是当我尝试

predictedClassValue

cat1始终为{{1}}

这是如何引起的?如何解决?

2 个答案:

答案 0 :(得分:3)

我曾经有过同样的问题。具有相同预测的原因是因为您正在训练LIBSVM的数据集,而不是因为您使用的是默认参数。确保每个"标签或classValue"有相同(或几乎)数量的数据。在您的数据集中。那应该解决它。例如cat1 = 50 INSTANCE,cat2 = 50 INSTANCE

答案 1 :(得分:1)

您的svm似乎运行了一些默认参数:

svmClassifier.buildClassifier(dataSet);

这可能导致琐碎的模型(总是回答" cat1")。机器学习并不那么简单,你必须调整一些元参数才能实现良好的模型。在SVM的情况下,它应该是C参数和(在RBF /多项式内核的情况下)gamma。换句话说 - 看起来没问题,只需使用默认参数,SVM就会选择构建一个最简单的解决方案。

您似乎也无法规范化您的数据,这也可能是SVM模型的问题。您至少应将每个输入维度缩放到某个区间(例如[-1,1])。

如果这些都没有帮助,这就意味着你的数据在某种程度上被破坏了(也许你的课程实际上是多元化的?也许这只是"与#34;数据相矛盾?)