【问题标题】:Why WEKA Evaluation class need train instances?为什么 WEKA 评估类需要训练实例?
【发布时间】:2015-12-12 20:12:58
【问题描述】:

我不明白为什么 Weka 评估类构造函数需要火车实例才能工作。

谁能解释一下?

理论上,评估仅取决于经过训练的模型(cls 在下一个代码中)和测试数据(TestingSet)。

谢谢!

这是一个例子:

// TrainingSet is the training Instances

// TestingSet is the testingInstances

// Build de classifier

Classifier cls = (Classifier) new NaiveBayes();

cls.buildClassifier(TrainingSet);

// Test the model

Evaluation eTest = new Evaluation(**TrainingSet**); 

eTest.evaluateModel(cls, TestingSet);

【问题讨论】:

    标签: java weka


    【解决方案1】:

    来自UMass Boston Computer Science Documentation on Weka

    评估 公共评估(实例数据)抛出 java.lang.Exception

    初始化所有计数器以进行评估。
    参数:
    数据 - 一组训练实例,用于获取一些标头信息和先验类分布信息
    抛出:
    java.lang.Exception - 如果类没有定义

    你可以看看构造函数源码here

    【讨论】:

      【解决方案2】:

      我对自己的问题有一个可能的解决方案。我正在寻找使用先前训练并保存在文件中的分类器模型来评估测试文件的方法。 Evaluation 类对我不起作用,因为它需要构造函数中的训练数据。但是可以使用分类器的方法classifyInstance

      下面的代码是一个例子:

      public static void LoadAndTest(String filename_test, String filename_model) throws Exception {
         BufferedReader datafile_test = readDataFile(filename_test);
         Instances      data_test     = new Instances(datafile_test);
         data_test.setClassIndex(data_test.numAttributes() - 1);
      
         Classifier cls = (Classifier) weka.core.SerializationHelper.read(filename_model);
         int act = 0;
         for (int i = 0; i < data_test.numInstances(); i++) {
           double pred = cls.classifyInstance(data_test.instance(i));
           double real = data_test.instance(i).classValue();
           if (pred==real) {
             act = act + 1;
           }
         }  
         double pct = (double) act / (double) data_test.numInstances();
         System.out.println("Accuracy = " + pct);
      }
      

      【讨论】:

        【解决方案3】:

        用于映射结果

        大多数算法都适用于数值数据。因此,一个特征的所有non-numeric 值都必须转换为数字形式。 此映射必须是唯一的。 这意味着所有具有特定非数字值的值都将映射到相同的数字值。
        在训练数据时,数据预处理器第一次看到数据。在转换非数字数据时,预处理器使用maps 来记住映射。

        例如如果某个功能的所有可能值都是{是,否,也许},那么这些值可以映射为:
        {"yes":1, "no":2, "maybe":3}

        因此,看起来像[yes,yes,no,yes,maybe,yes] 的输入特征/列现在将转换为[1,1,2,1,3,1] 的内部形式。这些数值供算法使用。
        现在这些信息存储在 Weka 的 Instances(trained) 中。因此,当评估者预测某个特征的数值时,它需要将该数值转换为其实际值。
        即如果算法吐出 2 的值,它需要映射来确定 2 对应于“否”。为此,算法需要在训练之前创建映射。因此它要求训练实例。

        Note : AFAIK same logic applies in all ML frameworks like weka, dl4j, etc.

        【讨论】:

          猜你喜欢
          • 2016-09-10
          • 2015-01-13
          • 2023-04-06
          • 1970-01-01
          • 2016-08-22
          • 1970-01-01
          • 2017-12-25
          • 1970-01-01
          • 2012-06-08
          相关资源
          最近更新 更多