2
我使用weka java API來進行網格搜索,以便找到MultilayerPerceptron的最佳參數。然而,我的java代碼給出的RMSE(我在這裏做迴歸)與weka GUI給出的不同。下面是代碼:weka GUI和Java代碼給出不同的結果
public class ANN {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
DataSource source = new DataSource("/home/yongfeng/ML/Project/choose_openning_price/holdout.arff");
Instances raw = source.getDataSet();
int trainSize = (int) Math.round(raw.numInstances()*0.666666666);
int testSize = raw.numInstances() - trainSize;
Instances train = new Instances(raw, 0, trainSize);
Instances test = new Instances(raw, trainSize, testSize);
train.setClassIndex(0);
test.setClassIndex(0);
final int sizeOfSearch = 15;
double[][] resultsArray = new double[sizeOfSearch][sizeOfSearch];
for (int i=0;i < sizeOfSearch;i++){
for (int j=0;j < sizeOfSearch;j++){
double m = i;
double k = j;
double learningRate = (m+1)/1000;
double momentum = (k+1)/100;
MultilayerPerceptron ann = new MultilayerPerceptron();
String options = String.format("-L %f -M %f -N 500 -V 0 -S 0 -E 20 -H a", learningRate, momentum);
ann.setOptions(weka.core.Utils.splitOptions(options));
ann.buildClassifier(train);
Evaluation eval = new Evaluation(train);
eval.evaluateModel(ann, test);
double error = eval.rootMeanSquaredError();
System.out.println("learningRate: " + learningRate + "\tMomentum: " + momentum + "\tError: " + error);
printOptions(ann.getOptions());
resultsArray[i][j] = error;
ann = null;
eval = null;
}
}
}
}
我即使在每次迭代中打印出的選項和它們原來是相同的那些WEKA GUI。要預測的屬性是第一個,所以setClassIndex(0);並使用列車測試集進行評估。任何人都可以幫忙嗎?非常感謝!