2010-07-11 12 views
7

J'ai un ensemble de données de classe binaire (0/1) avec un grand biais vers la classe "0" (environ 30000 vs 1500). Il y a 7 caractéristiques pour chaque instance, pas de valeurs manquantes. Lorsque j'utilise le J48 ou tout autre classificateur d'arbre, j'obtiens presque toutes les instances «1» mal classées comme «0».Comment surévaluer volontairement les classificateurs Weka?

En définissant le classificateur sur "non maillé", définissant le nombre minimal d'occurrences par feuille sur 1, définissant le facteur de confiance sur 1, ajoutant un attribut factice avec le numéro d'ID de l'instance.

Je n'arrive pas à créer un modèle qui surpasse mes données!

J'ai également essayé presque tous les autres classificateurs fournis par Weka, mais j'ai obtenu des résultats similaires. L'utilisation de IB1 permet d'obtenir une précision de 100% (rame sur la rame), donc ce n'est pas un problème d'instances multiples avec les mêmes valeurs de caractéristiques et différentes classes.

Comment créer un arbre complètement non-élagué? Ou sinon forcer Weka à surpasser mes données?

Merci.

Mise à jour: D'accord, c'est absurde. Je l'ai utilisé seulement environ 3100 négatifs et 1200 exemples positifs, ce qui est l'arbre que je suis arrivé (unpruned!):

J48 unpruned tree 
------------------ 

F <= 0.90747: 1 (201.0/54.0) 
F > 0.90747: 0 (4153.0/1062.0) 

Inutile de dire que, IB1 donne toujours 100% de précision. Je ne sais pas comment je l'ai manqué - SimpleCart ne fonctionne pas et donne 100% de précision dans le train; Le SimpleCart élagué n'est pas aussi biaisé que J48 et a un faux positif positif et négatif.

+0

question connexe possible: http://stackoverflow.com/ questions/2519997/différents-poids-de-faux-positif-et-faux-négatif-dans-réseau neuronal – Amro

Répondre

2

La solution rapide et sale consiste à ré-échantillonner. Jetez tous sauf 1500 de vos exemples positifs et entraînez-vous sur un ensemble de données équilibré. Je suis assez sûr qu'il y a un composant de rééchantillonnage dans Weka pour faire cela.

L'autre solution consiste à utiliser un classificateur avec un coût variable pour chaque classe. Je suis sûr que libSVM vous permet de faire cela et je sais que Weka peut envelopper libSVM. Cependant, je n'ai pas utilisé Weka depuis un moment, donc je ne peux pas être d'une grande aide pratique ici.

+0

Merci. Je ne suis pas sûr que le rééchantillonnage fonctionnerait - d'après les expériences que j'ai faites, même sur un ensemble de données assez équilibré (1000 exemples pour chaque classe) J48 et d'autres classificateurs (sauf SimpleCart) obtiennent des résultats ridicules - FP ou FN très élevé pour la classe 0 "ou très élevé pour la classe" 1 "(et l'autre classe est classée le plus souvent correctement). En ce qui concerne la classification sensible aux coûts - je l'ai complètement oublié, j'y reviendrai bientôt. Je vous remercie! – Haggai

+0

L'approche sensible aux coûts a fonctionné. Je ne comprends toujours pas pourquoi J48 ne me donne pas 100% de précision sur l'ensemble d'entraînement, ou pourquoi un jeu de données plutôt équilibré avec J48 donne encore des résultats ridicules. Mais au moins maintenant j'ai quelque chose à travailler avec. Merci! – Haggai

5

Weka contient deux méta-classificateurs d'intérêt:

Ils vous permet de faire tout prix sensible algorithme (non limité à SVM) et de préciser un matrice de coût (pénalité des différentes erreurs); vous donneriez une pénalité plus élevée pour avoir classé 1 instances comme 0 que ce que vous donneriez pour classer par erreur 0 comme 1.

Le résultat est que l'algorithme serait alors essayer de:

minimiser les coûts de mauvaise classification attendue (plutôt que la classe la plus probable)

+1

Merci, c'est exactement la solution que j'ai utilisée. – Haggai