我在java中使用weka api时遇到问题。我的训练和测试数据集中有41个特征(或属性)。我想只采取25个属性(例如说1,3,5,7,8,10 .....)并在训练和测试分类器期间删除其他属性。我在http://weka.wikispaces.com/Use+WEKA+in+your+Java+code#Filter和http://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);
.....
.....
答案 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);