我在我的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