在java代码中使用weka Filter

时间:2014-04-22 06:05:04

标签: weka

我在java中使用weka api时遇到问题。我的训练和测试数据集中有41个特征(或属性)。我想只采取25个属性(例如说1,3,5,7,8,10 .....)并在训练和测试分类器期间删除其他属性。我在http://weka.wikispaces.com/Use+WEKA+in+your+Java+code#Filterhttp://grepcode.com/file/repo1.maven.org/maven2/nz.ac.waikato.cms.weka/weka-stable/3.6.6/weka/filters/unsupervised/attribute/Remove.java上阅读了Weka的过滤手册,但我无法理解如何在我的问题中使用过滤器。你能帮我解决一下这种情况的代码吗?您的建议/帮助将受到高度赞赏。

我的代码是这样的......

import weka.classifiers.meta.FilteredClassifier;
import weka.classifiers.trees.J48;
import weka.core.Instances;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.Remove;
Instances train = ...   
 Instances test = ...   

Here I want to take only 25 attributes(i.e column values) out of 41.
 Classifier cls = new J48();
 cls.buildClassifier(train);
 // evaluate classifier and print some statistics
 Evaluation eval = new Evaluation(train);
 eval.evaluateModel(cls, test);
.....
.....

1 个答案:

答案 0 :(得分:0)

假设你有这个,正如你所说:

import weka.classifiers.meta.FilteredClassifier;
import weka.classifiers.trees.J48;
import weka.core.Instances;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.Remove;
Instances train = ...   
Instances test = ...   

然后设置所需的列索引数组。我假设你在for循环或其他东西中这样做,但我已经完成了手动输入6个索引,所以你得到了这个想法。

int[] indicesOfColumnsToUse = [1,3,5,7,8,10];

然后初始化并设置删除过滤器(初始化它,然后设置列索引,然后反转您的选择,以便删除您不想要的那些,然后根据您的训练数据设置“输入格式”)

Remove remove = new Remove();
remove.setAttributeIndices(indicesOfColumnsToUse);
remove.setInvertSelection(true);
remove.setInputFormat(train);

然后将删除应用到您的训练集

Instances trainingSubset = Filter.useFilter(train, remove);

然后按照你的说法继续,除了训练你刚刚创建的子集上的分类器:

 Classifier cls = new J48();
 cls.buildClassifier(trainingSubset);
 // evaluate classifier and print some statistics
 Evaluation eval = new Evaluation(train);
 eval.evaluateModel(cls, test);