类索引在weka中有不同的错误

时间:2016-12-27 20:28:05

标签: nlp weka

我想用weka进行文本分类。我有火车和测试文件(波斯语)。首先我加载火车文件,然后选择"字符串到字矢量"在预处理中。而且由于选择了这一点,班级职位开始了。要将类移动到其索引(文件中为2),我可以转到"编辑"部分并右键单击类列,然后选择"属性为类"或者只是在分类菜单中,选择(NOM)类。 (除非大多数算法都处于非活动状态)。我运行SMO并保存模型。问题是,在打开测试文件后,单击"在当前测试集上重新评估模型",出现此错误," ...类索引不同:1!= 2& #34 ;.我知道这是因为在打开测试文件后,类列再次开始。对于火车部分,我解决了上面描述的问题。但是我怎样才能为测试部分解决它呢?

样本列车文件: enter image description here

示例测试文件: enter image description here

2 个答案:

答案 0 :(得分:1)

在使用测试集评估训练模型之前,应该在测试集上使用相同的变换。使用GUI时,您可以使用资源管理器中的预处理器视图,手动应用相同的转换,然后将该集保存到新的arff文件中。当您想进行一系列实验时,我建议您编写一个例程,为您进行转换。

这看起来有点像这样:

import weka.core.Instances;
import weka.core.converters.ArffSaver;
import weka.core.converters.CSVLoader;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.Remove;
import weka.filters.unsupervised.attribute.Reorder;
import weka.filters.unsupervised.attribute.NumericToNominal;

import java.io.File;

public class DataConverter
{
 public static void Convert(String sourcepath,String destpath) throws Exception
 {
 CSVLoader loader = new CSVLoader();
 loader.setSource(new File(sourcepath));
 Instances data = loader.getDataSet();

 Remove remove = new Remove();                         
 remove.setOptions(weka.core.Utils.splitOptions("-R 1")); 
 remove.setInputFormat(data);                          
 data = Filter.useFilter(data, remove);   

 Reorder reorder = new Reorder();
 reorder.setOptions(weka.core.Utils.splitOptions("-R first-29,31-last,30"));
 reorder.setInputFormat(data);                          
 data = Filter.useFilter(data, reorder);   

 NumericToNominal ntn = new NumericToNominal();
 ntn.setOptions(weka.core.Utils.splitOptions("-R first,last"));
 ntn.setInputFormat(data);                          
 data = Filter.useFilter(data, ntn); 

 // save ARFF
 ArffSaver saver = new ArffSaver();
 saver.setInstances(data);
 saver.setFile(new File(destpath));
 //saver.setDestination(new File(destpath));
 saver.writeBatch();
 }
 public static void main(String args[]) throws Exception
 {
   File folder = new File("..\\..\\data\\output\\learning\\csv\\");
   File[] listOfFiles = folder.listFiles();

   for (int i = 0; i < listOfFiles.length; i++) {
    if (listOfFiles[i].isFile()) {
     String target = listOfFiles[i].getName();
     target = target.substring(0, target.lastIndexOf("."));
     System.out.println("converting file " + (i + 1) + "/" + listOfFiles.length);
     Convert("..\\..\\data\\output\\learning\\csv\\" + listOfFiles[i].getName(), "..\\..\\data\\output\\learning\\arff\\" + target + ".arff");
   }
  }
 }
}

另外:重新排序过滤器可以帮助您将目标类放在文件的末尾。它将旧索引的新顺序作为参数。在这种情况下,您可以应用Reorder -R 2-last,1

答案 1 :(得分:0)

首先,我根据列车文件中1000个最常用的单词将文件更改为向量,并为列车和测试文件创建一个数字arff文件,然后在&#34;分类&#34;菜单中&#34;测试选项&#34;我选择了&#34;(Nom)课程。