我正在使用javaML对我的数据进行分类。
我尝试过的是:
假设我有两个类别cat1,cat2
,所以我这样创建Instance
:
Instance instance = new SparseInstance();
每个特征在cat1和cat2中都有特定的索引,所以我使用以下方法:
//每个实例包含一个文档instance.put(index,value);//例如这个实例属于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
这是怎么引起的?我该如何解决?
回答:
看起来你是在使用一些默认参数运行SVM:
svmClassifier.buildClassifier(dataSet);
这可能会导致一个简单的模型(总是回答“cat1”)。机器学习并不简单,你需要调整一些元参数以获得好的模型。对于SVM来说,应该是C
参数,以及(在使用RBF/多项式核的情况下)gamma
参数。换句话说——看起来没问题,只是使用默认参数时,你的SVM选择构建了一个最简单的解决方案。
你似乎也没有对数据进行归一化,这对于SVM模型来说也可能是一个问题。你至少应该将每个输入维度缩放到某个区间(例如[-1,1]
)。
如果这些方法都不奏效,这可能意味着你的数据在某种程度上是损坏的(也许实际上无法区分你的类别?也许这只是“矛盾”的数据?)