Machine learning weka中的自定义批处理过滤器

Machine learning weka中的自定义批处理过滤器,machine-learning,weka,data-mining,Machine Learning,Weka,Data Mining,我正在尝试构建一个扩展SimpleBatchFilter的自定义批处理过滤器。但是,我遇到了第二次运行它以获得反向输出的问题。以下是相关代码和两次运行完成后出现的错误: Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 79, Size: 79 at java.util.ArrayList.rangeCheck(ArrayList.java:653) at java.util.ArrayL

我正在尝试构建一个扩展SimpleBatchFilter的自定义批处理过滤器。但是,我遇到了第二次运行它以获得反向输出的问题。以下是相关代码和两次运行完成后出现的错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 79, Size: 79
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at weka.core.Attribute.addStringValue(Attribute.java:994)
    at weka.core.StringLocator.copyStringValues(StringLocator.java:155)
    at weka.core.StringLocator.copyStringValues(StringLocator.java:91)
    at weka.filters.Filter.copyValues(Filter.java:373)
    at weka.filters.Filter.push(Filter.java:290)
    at weka.filters.SimpleBatchFilter.batchFinished(SimpleBatchFilter.java:266)
    at weka.filters.Filter.useFilter(Filter.java:667)
    at likeability.Main.main(Main.java:30)
以下是相关代码:

公共类TestFilter扩展了SimpleBatchFilter{
私人属性a;
私有属性b;
private int sampleSizePercent=15;
私有布尔反转=false;
私有int种子=1;
@凌驾
受保护实例进程(Instances inst)引发异常{
ArrayList partitionsA=分区(inst,a);
ArrayList分区=新的ArrayList();
对于(实例数据:分区A){
addAll(partition(data,b));
}
返回getTestSet(分区);
}
/*
*对数据进行分区,以便只有一个
*属性在一个分区中。
*/
私有ArrayList分区(实例数据、属性att)引发异常{
ArrayList实例=新的ArrayList();
对于(int i=0;i
我这样称呼它:

TestFilter=newtestfilter();
filter.setA(data.attribute(“性别”));
filter.setB(data.attribute(“age”));
filter.setInputFormat(数据);
实例测试=Filter.useFilter(数据,过滤器);
filter.setInvert(真);
filter.setInputFormat(数据);
实例序列=Filter.useFilter(数据,过滤器);

在我看来,我需要在两次通话之间使用这两条线路是相当愚蠢的。我想我应该使用isBatchFinished(),这是否意味着我必须扩展BatchFilter而不是SimpleBatchFilter来实现它?看到一些成功的实现也会很有帮助,因为我能找到的只有WEKA手册中的实现。

我通过扩展一个过滤器并将流程函数改为batchFinished()。我张贴这个答案,因为我没有找到一个自定义过滤器的例子在其他地方

@覆盖
公共布尔batchFinished()引发异常{
如果(isFirstBatchDone()){
反转=真;
}
if(getInputFormat()==null)
抛出新的NullPointerException(“未定义输入实例格式”);
实例inst=getInputFormat();
ArrayList partitionsA=分区(inst,a);
ArrayList分区=新的ArrayList();
对于(实例数据:分区A){
addAll(partition(data,b));
}
私有void getTestSet(List insts)引发异常{
对于(实例inst:insts){
重采样过滤器=新的重采样();
过滤器。种子(种子);
filter.setNoReplacement(真);
过滤器。设置反转选择(反转);
过滤器。设置采样率(采样率);
filter.setInputFormat(inst);
实例curr=Filter.useFilter(inst,Filter);
System.out.println(inst.size()+“”+curr.size());
当前forEach((i)->push(i));
}
}
@凌驾
公共布尔setInputFormat(实例arg)引发异常{
super.setInputFormat(arg);
实例outputFormat=新实例(arg,0);
setOutputFormat(outputFormat);
返回true;
}