web-dev-qa-db-fra.com

Façons d'améliorer la précision d'un classificateur Naive Bayes?

J'utilise un classificateur Naive Bayes pour classer plusieurs milliers de documents en 30 catégories différentes. J'ai implémenté un classificateur Naive Bayes et, avec une sélection de fonctionnalités (filtrant principalement les mots inutiles), j'ai obtenu une précision de test d'environ 30%, avec une précision d'entraînement de 45%. C'est nettement mieux que le hasard, mais je veux que ce soit mieux.

J'ai essayé d'implémenter AdaBoost avec NB, mais cela ne semble pas donner de résultats sensiblement meilleurs (la littérature semble divisée à ce sujet, certains documents disent qu'AdaBoost avec NB ne donne pas de meilleurs résultats, d'autres le font). Connaissez-vous d'autres extensions de NB qui pourraient éventuellement donner une meilleure précision?

62
wmute

D'après mon expérience, les classificateurs Naive Bayes correctement entraînés sont généralement d'une précision étonnante (et très rapides à former - nettement plus rapidement que n'importe quel constructeur de classificateurs que j'ai utilisé).

ainsi, lorsque vous souhaitez améliorer la prédiction du classificateur, vous pouvez rechercher à plusieurs endroits:

  • accordez votre classificateur} _ (ajustant les paramètres réglables du classificateur);

  • appliquer une sorte de technique de combinaison de classificateur (par exemple, assemblage, renforcement, mise en sac); ou tu peux

  • regardez les données envoyées au classificateur - ajoutez plus de données, améliorez votre analyse de base, ou affinez les fonctionnalités que vous sélectionnez parmi les données

classificateurs bayésiens naïfs, l’ajustement des paramètres est limité; Je vous recommande de vous concentrer sur vos données - c'est-à-dire la qualité de votre prétraitement et la sélection des fonctionnalités .

I. Analyse de données (pré-traitement)

je suppose que vos données brutes ressemblent à une chaîne de texte brut pour chaque point de données. Par une série d'étapes de traitement, vous transformez chaque chaîne en un vecteur structuré (tableau 1D) pour chaque point de données, de sorte que chaque décalage correspond à une entité ( généralement un mot) et la valeur de ce décalage correspond à la fréquence. 

  • stemming: soit manuellement, soit en utilisant une bibliothèque stemming? Les plus populaires logiciels libres sont Porter, Lancaster et Snowball. Ainsi, par exemple, si vous avez les termes programmeur, programme, programmation, Programmé dans un point de données donné, un stemmer les réduira à une seule racine .__ (probablement programme), de sorte que votre terme vecteur pour ces données points aura une valeur de 4 pour le programme descriptif, ce qui correspond à probablement ce que vous voulez.

  • recherche de synonyme _: même idée que dériver - replier les mots liés en un seul mot; ainsi, un synonyme Finder peut identifier un développeur, un programmeur, un codeur , un ingénieur en logiciel et les regrouper en un seul terme

  • mots neutres _: les mots ayant des fréquences similaires dans toutes les classes ont de mauvaises caractéristiques


II. Sélection de fonctionnalité

considérons un cas d'utilisation prototype pour les NBC: filtrage du spam; vous pouvez voir rapidement comment cela échoue et, tout aussi rapidement, comment l’améliorer. Par exemple, les filtres anti-spam supérieurs à la moyenne ont des caractéristiques nuancées telles que: fréquence des mots en majuscules, fréquence des mots dans le titre et apparition de points d'exclamation dans le titre. De plus, les meilleures caractéristiques ne sont généralement pas des mots simples, mais par exemple des paires de mots ou des groupes de mots plus importants.

III. Optimisations de classificateur spécifiques

Au lieu de 30 classes, utilisez un schéma 'un contre plusieurs' - en d'autres termes, vous commencez par un classifieur à deux classes (classe A et 'tout le reste'), puis les résultats dans le 'tout le reste' classe sont renvoyés à l'algorithme pour la classification en classe B et "tout le reste", etc.

La méthode Fisher ((probablement le moyen le plus courant d’optimiser un classificateur Naive Bayes.) Pour moi, Je pense à Fisher en tant que normalisant _ (plus correctement, normalisant _ ) les probabilités d'entrée Un CNB utilise les probabilités de caractéristiques pour construire une probabilité de document entier. La méthode de Fisher calcule la probabilité d'une catégorie pour la caractéristique chaque du document puis combine ces probabilités de caractéristiques et compare cette probabilité combinée à la probabilité d'un ensemble aléatoire de caractéristiques.

100
doug

Je suggérerais d'utiliser SGDClassifier comme dans this et de le régler en termes de force de régularisation.

Essayez également d’accorder la formule que vous utilisez dans TFIDF en ajustant les paramètres de TFIFVectorizer .

  • Je vois généralement cela pour les problèmes de classification de texte SVM ou Logistic Regressioin lorsqu’ils sont formés, surpasse NB. Comme vous pouvez le constater dans le présent article de Stanford People pour les documents plus longs, SVM surpasse NB. Le code du papier qui combine SVM et NB (NBSVM) est ici .

  • Deuxièmement, ajustez votre formule TFIDF (par exemple, tin, linéaire, smooth_idf).

  • Normaliser vos échantillons avec une normalisation l2 ou l1 (valeur par défaut dans Tfidfvectorization) car elle compense les différentes longueurs de document.

  • Multilayer Perceptron donne généralement de meilleurs résultats que NB ou SVM en raison de la non-linéarité introduite, inhérente à de nombreux problèmes de classification de texte. J’en ai implémenté un très parallèle avec Theano/Lasagne, facile à utiliser et téléchargeable ici .

  • Essayez de accorder votre régularisation l1/l2/elasticnet. Cela fait une différence énorme dans la régression SGDClassifier/SVM /.

  • Essayez d’utiliser n-grammes qui est configurable dans tfidfvectorizer.

  • Si vos documents ont une structure (par exemple, Titres), envisagez d’utiliser différentes fonctionnalités pour différentes parties. Par exemple, ajoutez title_Word1 à votre document si Word1 apparaît dans le titre du document.

  • Pensez à utiliser la longueur du document comme caractéristique (par exemple, le nombre de mots ou de caractères).

  • Pensez à utiliser meta information sur le document (par exemple, date de création, nom de l'auteur, URL du document, etc.).

  • Facebook a récemment publié son Code de classification FastText qui fonctionne très bien dans de nombreuses tâches, assurez-vous de l’essayer.

4
Ash

Utilisation de la correction laplacienne avec AdaBoost. 

Dans AdaBoost, un poids est tout d'abord attribué à chaque nuplet de données de l'ensemble de données d'apprentissage. Les pondérations initiales sont définies à l'aide de la méthode init_weights, qui initialise chaque pondération sur 1/d, où d est la taille de l'ensemble de données d'apprentissage. 

Ensuite, une méthode generate_classifiers est appelée, qui exécute k fois, créant des instances k du classifieur Naïve Bayes. Ces classificateurs sont ensuite pondérés et les données de test sont exécutées sur chaque classificateur. La somme des "votes" pondérés des classificateurs constitue le classement final.

0
user4959