我的问题与Weka预测插件有关。我正在尝试使用Weka Forecaster在预测范围为6的情况下预测sin(x)的值,算法是SMOReg,我试图使用不同的滞后(1-24)。我用了一个循环。我写的程序运行得很好,但问题是我从程序中获得的结果与直接使用Weka GUI不同,我不知道为什么?有什么想法吗?
我确保使用相同的算法"选项",但结果仍然不同。
这是代码:
import java.io.*;
import java.util.*;
import java.util.List;
import weka.core.Instances;
import weka.classifiers.Evaluation;
import weka.classifiers.functions.*;
import weka.classifiers.rules.*;
import weka.classifiers.meta.*;
import weka.classifiers.trees.*;
import weka.classifiers.evaluation.NumericPrediction;
import weka.classifiers.timeseries.WekaForecaster;
import weka.classifiers.timeseries.core.TSLagMaker;
import weka.classifiers.timeseries.core.TSLagMaker.Periodicity;
import weka.classifiers.timeseries.eval.TSEvaluation;
import weka.classifiers.timeseries.eval.ErrorModule;
import weka.core.converters.ConverterUtils.DataSource;
public class TimeSeriesSin {
static Scanner console = new Scanner(System.in);
public static void main(String[] args) throws FileNotFoundException{
try {
String pathToSinData = "C:/Users/khouloud/Desktop/AUSmaster/thesis/summer/chapter1/sin_10.arff";
PrintWriter out = new PrintWriter("C:/Users/khouloud/Desktop/AUSmaster/thesis/summer/chapter1/try_sin_10.txt");
DataSource source = new DataSource(pathToSinData);
Instances diab = source.getDataSet();
for(int i = 1; i <= 24; i++) {
WekaForecaster forecaster = new WekaForecaster();
forecaster.setFieldsToForecast("sin");
SMOreg tr = new SMOreg();
String options = "weka.classifiers.functions.SMOreg -C 1.0 -N 0 -I "weka.classifiers.functions.supportVector.RegSMOImproved -L 0.001 -W 1 -P 1.0E-12 -T 0.001 -V" -K "weka.classifiers.functions.supportVector.PolyKernel -C 250007 -E 1.0"";
tr.setOptions(weka.core.Utils.splitOptions(options));
forecaster.setBaseForecaster(tr);
forecaster.getTSLagMaker().setMinLag(1);
forecaster.getTSLagMaker().setMaxLag(i);
forecaster.buildForecaster(diab, System.out);
forecaster.primeForecaster(diab);
List<List<NumericPrediction>> forecast = forecaster.forecast(6, System.out);
TSEvaluation eval = new TSEvaluation(diab, 0.3);
eval.setHorizon(6);
eval.setEvaluateOnTestData(true);
eval.setEvaluateOnTrainingData(false);
eval.evaluateForecaster(forecaster, System.out);
out.println("lag= " + i);
out.println(eval.toSummaryString());
}
out.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
我在预测三个不同的变量时遇到了同样的问题。我使用了MLPRegressor
和SMOreg
。
我在package Manager中检查了WEKA-GUI
中pdm-timseriesforecasting
包的包版本,并将相同的包版本放在我的WEKA代码中(我使用maven存储库来实现代码),问题就解决了。
我也遇到了同样的问题。我认为这是关于周期性配置(对象TSLagMaker)。
如果你从这里运行代码,
它将产生与GUI相同的结果。如果删除以下行,结果将有所不同:
// add a month of the year indicator field
forecaster.getTSLagMaker().setAddMonthOfYear(true);
// add a quarter of the year indicator field
forecaster.getTSLagMaker().setAddQuarterOfYear(true);
我认为GUI会以某种方式自动检测到它。
希望它能有所帮助,Honza