我在我的java代码中使用了weka中的LibSVM。我正在尝试做一个回归。下面是我的代码,Java,weka LibSVM不能正确预测
public static void predict() {
try {
DataSource sourcePref1 = new DataSource("train_pref2new.arff");
Instances trainData = sourcePref1.getDataSet();
DataSource sourcePref2 = new DataSource("testDatanew.arff");
Instances testData = sourcePref2.getDataSet();
if (trainData.classIndex() == -1) {
trainData.setClassIndex(trainData.numAttributes() - 2);
}
if (testData.classIndex() == -1) {
testData.setClassIndex(testData.numAttributes() - 2);
}
LibSVM svm1 = new LibSVM();
String options = ("-S 3 -K 2 -D 3 -G 1000.0 -R 0.0 -N 0.5 -M 40.0 -C 1.0 -E 0.001 -P 0.1");
String[] optionsArray = options.split(" ");
svm1.setOptions(optionsArray);
svm1.buildClassifier(trainData);
for (int i = 0; i < testData.numInstances(); i++) {
double pref1 = svm1.classifyInstance(testData.instance(i));
System.out.println("predicted value : " + pref1);
}
} catch (Exception ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
}
但预测值我从这个代码得到的是比预测值,我使用的Weka GUI越来越不同。
示例: 下面是我为java代码和weka GUI提供的单个测试数据。
的Java代码的预测值作为1.9064516129032265而Weka的GUI的预测值是10.043。我为Java代码和Weka GUI使用相同的训练数据集和相同的参数。
我希望你明白我的问题。有人告诉我我的代码有什么问题吗?
其实Libsvm有2个SVM类型的回归,nu-SVR和epsilon-SVR。通过定义算法的-S参数,我可以决定使用哪种svm类型。在我的代码中,我使用了epsilon-SVR(-S 3)。但是你的代码确实帮我找到了我的代码中的错误。 setClassIndex在我的代码中是错误的。我用你的代码,它的工作。非常感谢您的帮助。 – udi