【问题标题】:WEKA Forecasting PluginWEKA 预测插件
【发布时间】:2018-12-30 03:40:30
【问题描述】:

我的问题与 Weka Forecasting Plugin 有关。我正在尝试使用 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();
        }
    }
}

【问题讨论】:

  • 您能否编辑您的帖子并包含您的代码,以便我们查看与 Weka 的 GUI 方法相比是否可以发现任何差异?
  • @Sicco 我确实编辑了它,并添加了代码,我希望你看看它问题是 RMSE 值不同,例如当 max lag = 12;从 GUI 得到的 RMSE 是 0.0309,而使用 API 时 RMSE = 0.8566 所以差别很大

标签: weka


【解决方案1】:

我在预测三个不同的变量时遇到了同样的问题。我使用了MLPRegressorSMOreg

我在包管理器中从WEKA-GUI 中检查了pdm-timseriesforecasting 包的包版本,并将相同的包版本放入我的WEKA 代码中(我使用maven 存储库进行代码实现),问题得到解决.

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。 我认为这是关于周期性配置(对象 TSLagMaker)。

    如果你从here运行代码,

    它将生成与 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 会以某种方式自动检测到它。

    希望对您有所帮助, 洪萨

    【讨论】:

      猜你喜欢
      • 2015-04-13
      • 2017-04-30
      • 2016-05-22
      • 1970-01-01
      • 2013-09-25
      • 2012-10-19
      • 1970-01-01
      • 2015-11-12
      • 2013-10-17
      相关资源
      最近更新 更多