Weka暂时删除属性并稍后恢复

时间:2017-08-28 10:08:27

标签: java classification weka

在Weka(使用Java)中,我想成功地将分类器拟合到同一数据集的不同属性子集。

有没有办法只构建一次Instances对象,然后只是暂时删除未选中的功能,这样可以有效地恢复它们并在以后需要使用该属性来构建另一个分类器时使用它们,而不需要从头开始每次创建一个全新的Instances对象?

我知道方法deleteAttributeAt()表示

  

在之前执行属性信息的深层复制   属性已删除

以及班级Remove,但我不确定这是我需要的。

1 个答案:

答案 0 :(得分:0)

在每个阶段创建新的Instances对象并正确使用。

例如,下面的示例是使用没有类的实例对象并进行规范化以构建集群。

使用rawData获取原始实例。希望这会有所帮助。

    final SimpleKMeans kmeans = new SimpleKMeans();

    final String[] options = weka.core.Utils
            .splitOptions("-init 0 -max-candidates 100 -periodic-pruning 10000 -min-density 2.0 -t1 -1.25 -t2 -1.0 -N 10 -A \"weka.core.EuclideanDistance -R first-last\" -I 500 -num-slots 1 -S 50");
    kmeans.setOptions(options);

    kmeans.setSeed(1000);
    kmeans.setPreserveInstancesOrder(true);
    kmeans.setNumClusters(5);
    kmeans.setMaxIterations(1000);

    final BufferedReader datafile = readDataFile("/Users/data.arff");
    final Instances rawData = new Instances(datafile);
    rawData.setClassIndex(classIndex);

    //remove class column[0] from cluster
    final Remove removeFilter = new Remove();
    removeFilter.setAttributeIndices("" + (rawData.classIndex() + 1));
    removeFilter.setInputFormat(rawData);
    final Instances dataNoClass = Filter.useFilter(rawData, removeFilter);

    //normalize
    final Normalize normalizeFilter = new Normalize();
    normalizeFilter.setIgnoreClass(true);
    normalizeFilter.setInputFormat(dataNoClass);
    final Instances data = Filter.useFilter(dataNoClass, normalizeFilter);

    kmeans.buildClusterer(data);