【问题标题】:class index differ error in wekaweka中的类索引不同错误
【发布时间】:2017-05-12 03:10:08
【问题描述】:

我想用 weka 做文本分类。我有一辆火车和一个测试文件(波斯语)。首先我加载训练文件,然后在预处理中选择“字符串到词向量”。由于选择了这一点,班级职位就开始了。要将类移动到其索引(文件中为 2),我可以转到“编辑”部分并右键单击类列并选择“属性作为类”,或者只是在分类菜单中,选择(NOM)类. (除非大多数算法都处于非活动状态)。我运行 SMO 并保存模型。问题是,打开测试文件后,点击“re-evaluate the model on current test set”,出现这个错误,“...class index different: 1!=2”。我知道这是因为打开测试文件后,类列又开始了。对于火车部分,我解决了上述问题。但是我如何才能在测试部分也解决它呢?

样本火车文件:

样本测试文件:

【问题讨论】:

    标签: nlp weka


    【解决方案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

    【讨论】:

    • @S van Balen,我不懂 java。有什么方法可以在 weka 本身解决这个问题,而不是编写任何代码?谢谢
    • 绝对!基本上,您只需从 GUI 执行 stringToWordVector 过滤器,将结果保存到 testset.arff(或其他),然后为您的训练集执行相同的练习。然后,您可以在 GUI 中加载您的训练集,并配置任何分类器以使用保存的测试集进行评估。
    【解决方案2】:

    首先,我根据训练文件中最常用的 1000 个单词将文件更改为向量,并为训练文件和测试文件制作了一个数字 arff 文件,然后在“测试选项”中的“分类”菜单中为这两个文件我选择“(名义)类。

    【讨论】:

      猜你喜欢
      • 2014-04-13
      • 2014-12-31
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 2017-05-17
      • 2015-01-30
      • 2012-09-18
      相关资源
      最近更新 更多