2017-08-28 2 views
0

Dans Weka (en utilisant Java), je voudrais adapter avec succès les classificateurs à différents sous-ensembles d'attributs du même ensemble de données.Weka remove attribut temporairement et plus tard restaurer

Existe-t-il un moyen de générer l'objet Instances une seule fois, puis de supprimer temporairement les fonctionnalités non sélectionnées afin qu'elles puissent être restaurées et utilisées plus tard si l'attribut est nécessaire pour construire un autre classificateur sans avoir à créer à chaque fois un objet Instances totalement nouveau à partir de zéro?

Je suis au courant de la méthode deleteAttributeAt() qui dit que

Une copie en profondeur de l'information d'attribut est effectuée avant l'attribut est supprimé

et aussi de la classe Remove mais je Je ne suis pas sûr que ce soit ce dont j'ai besoin.

+0

'weka.filters.unsupervised.attribute.Remove' est un filtre qui supprime votre jeu spécifié d'attributs de l'ensemble de données - vous pouvez utiliser que conjointement avec' weka.classifiers.meta.FilteredClassifier'? – nekomatic

Répondre

0

Créez de nouveaux objets Instances à chaque étape et utilisez-les de manière appropriée. Par exemple, l'exemple ci-dessous utilise un objet instance sans classe et normalisé pour construire un cluster.

Utilisez rawData pour obtenir des instances d'origine. J'espère que cela t'aides.

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