我们正在尝试从Java程序中实现WEKA分类器。到目前为止一切顺利,但是当从Weka GUI中的训练集构建分类器时,我们使用StringToWordVector IDF变换来帮助提高分类准确性。
如何在Java中为新实例计算IDF转换,以便在将实例传递给分类器之前为新实例中的每个标记值设置?
基本代码如下所示:
Instances ins = vectorize(msg);
Instances unlabeled = new Instances(train,1);
Instance inst = new Instance(unlabeled.numAttributes());
String tmp = "";
for(int i=0; i < ins.numAttributes(); i++) {
tmp = ins.attribute(i).name();
if(unlabeled.attribute(tmp)!=null)
inst.setValue(unlabeled.attribute(tmp), 1.0); //TODO: Need to figure out the IDF transformed value to put here NOT 1!!
}
unlabeled.add(inst);
unlabeled.setClassIndex(classIdx);
.....cl.distributionForInstance(unlabeled.instance(i));
那么我该如何对此进行编码,以便将正确的值放入我想要分类的新实例中?
需要明确的是,inst.setValue(unlabeled.attribute(tmp), 1.0);
行需要从1.0
更改为IDF转换后的数字...
答案 0 :(得分:1)
您需要使用FilteredClassifier来实现此目的。代码段是:
StringToWordVector strWVector = new StringToWordVector();
filteredClassifier fcls = new FilteredClassifier();
fcls.setFilter(strWVector);
fcls.setClassifier(new SMO());
fcls.buildClassifier(yourdata)
//rest of your code
这可以更容易,因为您可以一次性传递所有实例.FilteredClassifier负责所有其他细节。代码未经过测试,但可以帮助您入门。
编辑:您也可以通过以下方式进行操作。这是来自weka教程的代码片段请参阅http://weka.wikispaces.com/Use+WEKA+in+your+Java+code#Filter-Filtering%20on-the-fly批处理模式了解详情
Instances train = ... // from somewhere
Instances test = ... // from somewhere
Standardize filter = new Standardize();
filter.setInputFormat(train); // initializing the filter once with training set
Instances newTrain = Filter.useFilter(train, filter); // configures the Filter based on train instances and returns filtered instances
Instances newTest = Filter.useFilter(test, filter); // create new test se
HTH