2

Je voudrais utiliser l'implémentation de Naive Bayes semi-supervisée (Bernoulli) de Scikit-learn. Selon this link in github, il y avait un peu de travail et de discussion il y a un an (classe SemisupervisedNB). D'un autre côté, il semble y avoir another different implementation (function fit_semi?) which seems it was polished by another user afterwards. Cependant, aucun d'entre eux n'est disponible dans la version stable actuelle.Scikit-learn: l'implémentation semi-supervisée de Naive Bayes est-elle disponible?

Quelqu'un pourrait-il me montrer un exemple sur comment pourrais-je utiliser une de ces deux implémentations avec la version actuelle de scikit-learn afin de construire un Naive Bayes semi-supervisé? Merci.

PS: J'utilise scikit-learn classificateurs de NLTK avec la classe SklearnClassifier

EDIT

J'ai essayé le code de SemiSupervisedNB dans mon projet de changer l'étiquette de la classe sans étiquette de -1 à 2 (j'utilise SKlearnClassifier de NLTK et ma classe non étiquetée obtient le label 2). Cependant, je reçois ValueError: array ne doit pas contenir d'infs ou de NaNs lors du calcul de d (différence entre les paramètres actuels et précédents du modèle) car les tableaux d'interception contiennent des valeurs inf ... Une idée sur la façon de résoudre cela?

+0

Vous pouvez essayer de vérifier la branche et de travailler dessus, mais je ne suis pas sûr qu'elle soit dans un bon état actuellement - elle est également très en retard par rapport à la version actuelle. Vous pourriez essayer de rebaser/fusionner la branche sur le maître actuel. Mais si vous n'êtes pas familier avec git/le projet, vous aurez probablement quelques problèmes. Ou attendez simplement sur @larsmans pour commenter et vous dire quoi faire;) –

+0

Merci pour votre réponse. Malheureusement je n'ai pas beaucoup de temps pour revoir le code maintenant ... Je vais attendre aussi @ogrisel :) – AM2

+0

Je suis désolé, mais je n'ai vraiment pas le temps de réparer ça ou même de vous dire comment fais le. Le NB semi-supervisé devrait fonctionner (un collègue a essayé il y a quelques mois), mais ne correspond pas du tout à l'actuel scikit-learn. Vous pourriez essayer de le rebaser, comme suggéré par @amueller. –

Répondre

3

Il ya quelques mois, j'ai ouvert un issue on GitHub à ce sujet. Il est possible d'ajouter le code correspondant à la branche master actuelle de scikit-learn.

L'utilisateur @larsmans a ajouté une classe expérimentale SemisupervisedNB au fichier sklearn/naive_bayes.py il y a environ un an. Ce code réside dans la branche emnb de son référentiel scikit-learn et peut être consulté here.

Le code essentiel réside dans deux fichiers:

  1. Le fichier naive_bayes.py dans la branche maître actuel doit être remplacé par le plus ancien de la branche emnb.

  2. Une édition de la classe LabelBinarizer est nécessaire et peut être trouvée dans le fichier sklearn/preprocessing.py dans la branche principale. La classe entière doit être remplacée par sa définition dans la branche emnb de @larsmans. Là, il réside dans le fichier sklearn/preprocessing/__init__.py.

Même si le code des classificateurs Naive Bayes n'a pas beaucoup changé depuis un an, certaines corrections de bugs leur ont été ajoutées. Il est donc logique de conserver les versions actuelles du fichier naive_bayes.py et de la classe LabelBinarizer et de donner des noms différents aux versions expérimentales.

Je viens de créer ma propre branche du dépôt scikit-learn et j'ai ajouté les fichiers expérimentaux au-dessus de la branche stable actuelle 0.13.X. Cette branche est appelée 0.13.X-emnb et peut être consultée here. Si vous regardez mes trois derniers commits (1 et 2 et 3), vous voyez quels fichiers j'ai changé et nouvellement créé.

Depuis SemisupervisedNB ne fonctionne pas avec les versions les plus récentes des autres classificateurs, je viens d'ajouter un nouveau module à côté de naive_bayes.py appelé semisupervised_naive_bayes.py. Là, vous trouverez les anciennes versions des classificateurs dans les versions renommées, par ex.SemiMultinomialNB au lieu de MultinomialNB afin qu'ils ne s'affrontent pas avec les versions les plus récentes des classificateurs. De même, j'ai ajouté une classe SemisupervisedLabelBinarizer à côté de LabelBinarizer (le choix du nom est un peu malheureux mais au moins il est clair pour quoi il devrait être utilisé). Par conséquent, si vous souhaitez utiliser les versions semi-supervisées des classificateurs, utilisez le module sklearn.semisupervised_naive_bayes. Pour les versions actuelles, utilisez le module sklearn.naive_bayes. Mais s'il vous plaît gardez à l'esprit que c'est très expérimental. C'est juste un paramètre pour faire fonctionner ce vieux code. Je n'ai pas recherché de bugs.

+0

Merci pour votre temps et votre patience, enfin il a fonctionné avec la branche actuelle. J'ai dû changer les lignes 501 et 448 de semisupervised_naive_bayes.py à "SemiBaseDiscreteNB" et "SemiBernoulliNB" respectivement. – AM2

+0

@ AM2 Pas de problème. Vous êtes les bienvenus. :) J'ai moi-même besoin de la version semi-supervisée, c'est pourquoi j'ai traité ce problème avec tellement de détails. Je suis content que je puisse aider. – pemistahl

+0

@ AM2 Oh je vois, j'ai changé les noms de classe dans les deux lignes oubliées 448 et 501. Merci de me le faire savoir. – pemistahl