2010-08-04 5 views
2

Des résultats étranges apparaissent lors de l'utilisation d'un arbre J48. J'ai besoin de classer un vecteur de 48 fonctionnalités, ce qui fonctionne très bien, mais quand j'ai essayé de "optimiser", je rencontre des résultats étranges.Résultats de l'instance weka étranges

J'ai une méthode Classifier:

public boolean classify(double feature1, double feature2, double[] featureVec) { 
     Instance toBeClassified = new Instance(2+featureVec.length); 
     toBeClassified.setValue(0, feature1); 
     toBeClassified.setValue(1, feature2); 
     for (int i = 2; i < f.length + 2; ++i) { 
      toBeClassified.setValue(i, featureVec [i - 2]); 
     } 
     toBeClassified.setDataset(dataset); 

     try { 
      double _class = tree.classifyInstance(toBeClassified); 
      return _class > 0; 
     } catch (Exception e1) { 
      if(Logging.active) { 
       logger.error(e1.getMessage(), e1.getCause());} 
      } 
     return false; 
    } 
} 

Il fonctionne très bien, et je l'espère, je fais les choses. Mais je voulais supprimer la création d'instance qui est faite à chaque appel de méthode, donc j'ai déplacé l'instance toBeClassified = new Instance (48); ligne dans le corps de la classe - de sorte qu'il est créé qu'une seule fois. Cela fonctionne bien aussi, malgré le fait que je reçois des résultats légèrement différents par rapport à l'autre. disons, à partir de 400 classifications, on est différent (pour ne pas dire incorrect). Mais je ne vois pas de raison pour cela ... J'espère que certains gars utilisent weka, afin que je comprenne ce qui se passe/mal. (Oui, 2 + featureVec.length est 48).

Merci et salutations.

+1

Avez-vous toujours la même classification différente par les deux méthodes pour le même exemple sur le même ensemble de données? – Brabster

+1

Aussi - bien que je sois curieux de savoir pourquoi vous voyez une divergence - les docs Weka http://weka.sourceforge.net/doc/ suggèrent qu'il pourrait être plus rapide de créer une nouvelle Instance au lieu de modifier une instance existante. En supposant que vous cherchez la meilleure performance, avez-vous chronométré/profilé les deux méthodes et trouvé qui est le plus rapide? – Brabster

+0

@Brabster Oui, je suis à la recherche de performance mais aussi pour "J'aime ça". Je l'ai déjà mesuré, mais je pourrais le faire demain quand je serai de retour au travail. Oui, c'est toujours, Si je change juste la manière de créer l'instance, j'obtiens des résultats différents tout le temps. – InsertNickHere

Répondre

3

Il est très improbable que quelque chose ne va pas avec J48. La création et la classification des classificateurs elles-mêmes sont déterministes. Je vous recommande de poster une plus grande partie de votre code, parce que celui-ci a l'air génial (unbuggy).

Comme pour votre test de boucle 400: celui-ci devrait certainement produire les mêmes résultats à chaque fois, sans exception. Deux pensées:

  • Affirmez que vérifie si les valeurs d'instance sont identiques à celles du modèle. Cela exclurait tout bug dans l'instance.

  • La classification fonctionne-t-elle de manière multi-thread? Y a-t-il des objets de données partagés?

+0

Je suis désolé mais je ne peux pas montrer plus de code car cela violerait ce que j'ai chanté dans mon contrat. Hahahaha, votre mon homme. Tout comme je lis votre "manière multi-threading" - oui, cette fonction est appelée à partir de différents threads concurrents. Ceci ne pose aucun problème si chaque appel de méthode crée sa propre instance, mais si je n'en utilise qu'une seule, je dois synchroniser pour que les choses soient faites correctement. Je vais retravailler cela demain et ensuite, si vous réussissez, acceptez votre réponse. – InsertNickHere

+0

Merci pour la réponse rapide. Corrigez-moi si je me trompe: disons que vous avez N Threads, N Instances et ... Une instance de classifier? – Rekin

+1

L'instance de classificateur est donc partagée entre les threads. Je ne sais pas si c'est le problème, mais j'ai entendu dire que même en Java, les lectures doivent être synchronisées. Essayez l'instance de clonage pour chaque thread. L'objet 'ThreadLocal' du paquet' java.util.concurrent' pourrait être utile. – Rekin

Questions connexes