2

我们正在尝试从 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 转换后的数字...

4

1 回答 1

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 Batch Mode


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

高温高压

于 2011-09-01T15:59:53.907 回答