【问题标题】:Weka output predictionsWeka 输出预测
【发布时间】:2018-07-09 16:47:28
【问题描述】:

我已使用 Weka GUI 来训练和测试文件(进行预测),但无法使用 API 执行相同的操作。我得到的错误说训练和测试文件中有不同数量的属性。在 GUI 中,这可以通过检查“输出预测”来解决。

如何使用 API 做类似的事情?你知道那里有任何样品吗?

import weka.classifiers.bayes.NaiveBayes;
import weka.classifiers.meta.FilteredClassifier;
import weka.classifiers.trees.J48;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.NominalToBinary;
import weka.filters.unsupervised.attribute.Remove;

public class WekaTutorial
{

  public static void main(String[] args) throws Exception
  {
    DataSource trainSource = new DataSource("/tmp/classes - edited.arff"); // training
    Instances trainData = trainSource.getDataSet();

    DataSource testSource = new DataSource("/tmp/classes_testing.arff");
    Instances testData = testSource.getDataSet();

    if (trainData.classIndex() == -1)
    {
      trainData.setClassIndex(trainData.numAttributes() - 1);
    }

    if (testData.classIndex() == -1)
    {
      testData.setClassIndex(testData.numAttributes() - 1);
    }    

    String[] options = weka.core.Utils.splitOptions("weka.filters.unsupervised.attribute.StringToWordVector -R first-last -W 1000 -prune-rate -1.0 -N 0 -stemmer weka.core.stemmers.NullStemmer -M 1 "
            + "-tokenizer \"weka.core.tokenizers.WordTokenizer -delimiters \" \\r\\n\\t.,;:\\\'\\\"()?!\"");

    Remove remove = new Remove();
    remove.setOptions(options);
    remove.setInputFormat(trainData);

    NominalToBinary filter = new NominalToBinary(); 

    NaiveBayes nb = new NaiveBayes();

    FilteredClassifier fc = new FilteredClassifier();
    fc.setFilter(filter);
    fc.setClassifier(nb);
    // train and make predictions
    fc.buildClassifier(trainData);

    for (int i = 0; i < testData.numInstances(); i++)
    {
      double pred = fc.classifyInstance(testData.instance(i));
      System.out.print("ID: " + testData.instance(i).value(0));
      System.out.print(", actual: " + testData.classAttribute().value((int) testData.instance(i).classValue()));
      System.out.println(", predicted: " + testData.classAttribute().value((int) pred));
    }

  }

}

错误:
Exception in thread "main" java.lang.IllegalArgumentException: Src and Dest differ in # of attributes: 2 != 17152

这不是 GUI 的问题。

【问题讨论】:

标签: java weka


【解决方案1】:

您需要确保训练和测试集中的类别兼容,尝试

  • 结合训练集和测试集
  • 列表项
  • 预处理它们
  • 将它们保存为 arff
  • 打开两个空文件
  • 将标题从顶部复制到“@data”行
  • 将训练集复制到第一个文件中,将测试集复制到第二个文件中

【讨论】:

  • 我已经处理了我在 GUI 中使用得很好的 .arff 文件,并尝试使用 API 进行预测。
猜你喜欢
  • 2017-01-13
  • 2016-06-03
  • 2015-04-13
  • 2017-04-30
  • 2016-05-22
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 2013-09-25
相关资源
最近更新 更多