Java 为什么WEKA评估类需要训练实例?

Java 为什么WEKA评估类需要训练实例?,java,weka,Java,Weka,我不明白为什么Weka评估类构造函数需要train实例才能工作 谁能给我解释一下吗 理论上,评估仅取决于经过训练的模型(cls在下一个代码中)和测试数据(TestingSet) 谢谢 这是一个例子: // TrainingSet is the training Instances // TestingSet is the testingInstances // Build de classifier Classifier cls = (Classifier) new NaiveBayes(

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

谁能给我解释一下吗

理论上,评估仅取决于经过训练的模型(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);
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);
}
发件人:

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

初始化评估的所有计数器。
参数:
数据-训练实例集,用于获取一些标题信息和先前的类分布信息
抛出:
java.lang.Exception-如果未定义类


您可以查看构造函数源代码。

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

下面的代码是一个示例:

// 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);
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);
}
publicstaticvoidloadAndTest(stringfilename\u test,stringfilename\u model)抛出异常{
BufferedReader数据文件\u测试=读取数据文件(文件名\u测试);
实例数据_测试=新实例(数据文件_测试);
data_test.setClassIndex(data_test.numAttributes()-1);
分类器cls=(分类器)weka.core.SerializationHelper.read(文件名\模型);
int-act=0;
对于(int i=0;i
用于映射结果 大多数算法都处理数值数据。因此,一个特征的所有非数值必须转换成数值形式。此映射必须是唯一的。这意味着所有具有特定非数值的值都将映射到相同的数值。
在训练数据时,数据预处理器第一次看到数据。转换非数字数据时,预处理器使用
映射
来记住映射。

例如,如果特征的所有可能值都是{yes,no,maybe},那么这些值可以像这样映射:
{“是”:1,“否”:2,“可能”:3}


因此,看起来像
[yes,yes,no,yes,maybe,yes]
的输入特性/列现在将转换为
[1,1,2,1,3,1]
的内部形式。这些数值由算法使用。
现在,这些信息存储在Weka中的实例(经过培训)中。因此,当计算器预测某个特征的数值时,它需要将该数值转换为其实际值。
也就是说,如果算法输出的值为2,它需要地图计算出2对应于“否”。为此,算法需要在训练前创建映射。因此,它要求提供培训实例。

注意:AFAIK同样的逻辑适用于所有ML框架,如weka、dl4j等。