【问题标题】:IndexOutOfBoundsException when trying to add more instances to training set using Weka尝试使用 Weka 向训练集添加更多实例时出现 IndexOutOfBoundsException
【发布时间】:2016-07-19 13:58:31
【问题描述】:

我正在尝试向我的训练集添加更多实例并执行 10 倍交叉验证。

我的实例是字符串格式,所以我使用 StringToWordVector 过滤器将它们转换为数字。如果我不添加我想要的额外页面,一切都会很好。但是当我添加命令trainSet.addAll(data2); 并将trainSet 传递给过滤器时,我在Instances fTrainSet = Filter.useFilter(trainSet, filter); 的第一次迭代中得到一个奇怪的IndexOutOfBoundsException

Instances data = getDataFromFile("pathtofile.arff");//main dataset 1821 instances
Instances data2 = getDataFromFile("anotherpath.arff");//709 instances i want to add 
int folds = 10;
for(int i=0;i<folds;i++){
    Instances trainSet = data.trainCV(folds, i);//training set
    System.out.println(trainSet.numInstances());//Prints 1638
    Instances testSet =  data.testCV(folds, i);//testing set

    //add more instances
    trainSet.addAll(data2);        
    System.out.println(trainSet.numInstances());//Prints 2347

    //filter
    StringToWordVector filter = new StringToWordVector();
    filter.setInputFormat(trainSet);        
    filter.setWordsToKeep(10000);
    filter.setTFTransform(true);
    filter.setLowerCaseTokens(true);
    filter.setOutputWordCounts(true);
    Stemmer stemmer = new IteratedLovinsStemmer();
    filter.setStemmer(stemmer);
    WordsFromFile stopwords = new WordsFromFile();
    stopwords.setStopwords(new File(".data/stopwords2.txt"));
    filter.setStopwordsHandler(stopwords);

    Instances fTrainSet = Filter.useFilter(trainSet, filter);//error!!!
    Instances fTestSet = Filter.useFilter(testSet, filter);
    ....
    //classification and evaluation....

当我尝试使用过滤器时出现以下错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2161, Size: 1749
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at weka.core.Attribute.addStringValue(Attribute.java:924)
    at weka.core.StringLocator.copyStringValues(StringLocator.java:150)
    at weka.core.StringLocator.copyStringValues(StringLocator.java:91)
    at weka.filters.Filter.copyValues(Filter.java:399)
    at weka.filters.Filter.bufferInput(Filter.java:342)
    at weka.filters.unsupervised.attribute.StringToWordVector.input(StringToWordVector.java:655)
    at weka.filters.Filter.useFilter(Filter.java:692)
    at CrossValidationExample.main(CrossValidationExample.java:108)

可能出了什么问题?

【问题讨论】:

  • 我们不知道folds 是什么,因为它是循环中i 的上限,所以它很重要。请提供更多代码。
  • 你希望folds=10 edited。如果您收到ArrayOutOfBoundsException,它一定是带有索引的东西。出了点问题。此变量是可疑变量之一,因此请提供更多代码。
  • 您正在点击Index: 2161,ArrayList 的大小为1749。这是一个奇怪的大小。你不觉得吗?
  • Attribute.java line 924, CrossValidationExample.java line 108 in method main.
  • 第一次迭代时出现错误。如果我评论添加更多实例的行,我不会收到错误。当然很奇怪。

标签: java weka


【解决方案1】:

经过一番搜索,我意识到addAll 函数有问题。我能想到的一个原因是 addAll 只是添加了实例的引用,当我尝试将它们与 filter 一起使用时,这是一个问题。 相反,我使用了这里提出的合并功能https://stackoverflow.com/a/12359788/3923800,所以我用Instances newTrainSettrainSet = merge(trainSet,data2);替换了trainSet.addAll(data2);,一切正常。

【讨论】:

    猜你喜欢
    • 2012-08-12
    • 2018-11-23
    • 2013-01-04
    • 2015-01-13
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    相关资源
    最近更新 更多