我正在使用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}}
这是如何引起的?如何解决?
答案 0 :(得分:3)
答案 1 :(得分:1)
您的svm似乎运行了一些默认参数:
svmClassifier.buildClassifier(dataSet);
这可能导致琐碎的模型(总是回答" cat1")。机器学习并不那么简单,你必须调整一些元参数才能实现良好的模型。在SVM的情况下,它应该是C
参数和(在RBF /多项式内核的情况下)gamma
。换句话说 - 看起来没问题,只需使用默认参数,SVM就会选择构建一个最简单的解决方案。
您似乎也无法规范化您的数据,这也可能是SVM模型的问题。您至少应将每个输入维度缩放到某个区间(例如[-1,1]
)。
如果这些都没有帮助,这就意味着你的数据在某种程度上被破坏了(也许你的课程实际上是多元化的?也许这只是"与#34;数据相矛盾?)