2017-08-28 23 views
0

在Weka(使用Java)中,我想成功地將分類器適配到同一數據集的不同屬性子集。Weka暫時刪除屬性,然後恢復

是否有一種方法僅構建一次Instances對象,然後刪除非選定的功能,但只是暫時的,因此可以高效地恢復並稍後使用,以便在稍後需要該屬性以構建另一個分類時不需要每次從頭創建一個全新的Instances對象時都必須創建?

我知道方法的deleteAttributeAt(),它說,

的 屬性被刪除

之前,也Remove類的,但我執行的屬性信息的深層副本米不知道這是我所需要的。

+0

'weka.filters.unsupervised.attribute.Remove'是一個過濾器,刪除您指定的一組從數據集的屬性 - 您可以使用與'weka.classifiers.meta.FilteredClassifier'結合? – nekomatic

回答

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