【问题标题】:using weka Filter in java code在java代码中使用weka过滤器
【发布时间】:2014-06-06 08:33:44
【问题描述】:

我在 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);
.....
.....

【问题讨论】:

    标签: weka


    【解决方案1】:

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

    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);
    

    【讨论】:

    • 语法有点不同(至少在 Weka 3 中),remove.setAttributeIndices 想要一个String 作为参数,所以它会是remove.setAttributeIndices("1,3,5,7,8,10");。还有另一种使用数组的方法:setAttributeIndicesArray(int[] attributes)weka.sourceforge.net/doc.dev/weka/filters/unsupervised/…
    猜你喜欢
    • 1970-01-01
    • 2018-09-13
    • 2011-05-27
    • 1970-01-01
    • 2022-01-11
    • 2015-05-26
    • 2013-04-14
    • 2015-02-09
    相关资源
    最近更新 更多