Catégorisation de texte: combiner différents types de fonctionnalités

19

Le problème que j'aborde est de classer les textes courts en plusieurs classes. Mon approche actuelle consiste à utiliser les fréquences des termes pondérés tf-idf et à apprendre un classificateur linéaire simple (régression logistique). Cela fonctionne assez bien (environ 90% de macro F-1 sur le test, près de 100% sur le set d'entraînement). Un gros problème sont les mots / n-grammes invisibles.

J'essaie d'améliorer le classificateur en ajoutant d'autres fonctionnalités, par exemple un vecteur de taille fixe calculé en utilisant des similitudes de distribution (telles que calculées par word2vec) ou d'autres caractéristiques catégorielles des exemples. Mon idée était d'ajouter simplement les fonctionnalités aux fonctionnalités d'entrée clairsemées du sac de mots. Cependant, cela se traduit par de moins bonnes performances sur l'ensemble de test et d'entraînement. Les fonctionnalités supplémentaires donnent à elles seules environ 80% de F-1 sur l'ensemble de test, donc elles ne sont pas des ordures. La mise à l'échelle des fonctionnalités n'a pas aidé non plus. Ma pensée actuelle est que ce type de fonctionnalités ne se mélange pas bien avec le sac (clairsemé) de fonctionnalités de mots.

La question est donc la suivante: en supposant que les fonctionnalités supplémentaires fournissent des informations supplémentaires, quelle est la meilleure façon de les incorporer? Pourrait former des classificateurs séparés et les combiner dans une sorte de travail d'ensemble (cela aurait probablement l'inconvénient qu'aucune interaction entre les caractéristiques des différents classificateurs ne pourrait être capturée)? Y a-t-il d'autres modèles plus complexes que je devrais considérer?

elmille
la source
3
Mise à jour: j'ai pu obtenir des résultats acceptables en normalisant les vecteurs denses supplémentaires en l2. J'ai supposé à tort que le sklearn StandardScaler ferait cela. Je suis toujours à la recherche de méthodes plus complexes, qui me permettraient de modéliser les dépendances d'étiquette ou d'intégrer la confiance des sous-classificateurs.
elmille
Je faisais la même expérience de base l'année dernière et je rencontre exactement le même problème que vous. Votre vecteur word2vec après le processus de normalisation l2 peut-il battre BOW? Je n'ai pas fait de normalisation l2, mais même après avoir testé de nombreuses méthodes de post-traitement, le vecteur sémantique est toujours à 2-4 pour cent absolu derrière les fonctionnalités BOW tf / idf, je me demande si cette direction est une impasse. Mon objectif initial était de combiner un vecteur sémantique dense avec BOW traditionnel et de voir s'il peut améliorer les performances de classification / modélisation de sujets. BTW: sur quel ensemble de données avez-vous travaillé, le mien est 20newsgroup.
Je travaillais avec un ensemble de données pour le concours CIKM 2014. Pour moi, les représentations vectorielles n'ont jamais pu battre BOW avec des poids tf-idf. Mon plan était de les utiliser en plus pour améliorer la qualité. D'après mon expérience (pour la classification de texte), une certaine forme de tf-idf + un modèle linéaire avec n-grammes est une approche extrêmement forte. J'expérimente actuellement avec des réseaux de neurones convolutifs et même avec ces modèles (plus ou moins) complexes qui s'approchent difficilement.
elmille
Pour Mod: Désolé de ne pas avoir 50 points de réputation, je ne peux donc pas écrire dans la zone de commentaire. Salut elmille: Oui, c'est ce que je vis dans tout le test. Cependant, trouvez-vous que le mot vec + BOW vous aide? D'après mon expérience, lorsque je concatène le mot vec avec BOW tf-idf (dans mon cas, ce vec est en fait un vecteur global dans l'article entier, ce n'est pas word-vec mais très similaire), les performances deviennent encore plus faibles. Je pense à l'origine que ce devrait être BOW + vec> BOW> vec. Puisqu'ils contiennent des informations mutuellement assistantes. Le résultat réel est BOW> vec> BOW + vec. Ensuite, je fais une mise à l'échelle et une normalisation standard pour s'incliner et vec

Réponses:

13

Si je comprends bien, vous avez essentiellement deux formes de fonctionnalités pour vos modèles. (1) Les données textuelles que vous avez représentées comme un sac de mots épars et (2) des caractéristiques denses plus traditionnelles. Si tel est le cas, il existe 3 approches communes:

  1. Effectuez une réduction de dimensionnalité (telle que LSA via TruncatedSVD) sur vos données clairsemées pour les rendre denses et combinez les fonctionnalités en une seule matrice dense pour former vos modèles.
  2. Ajoutez vos quelques caractéristiques denses à votre matrice clairsemée en utilisant quelque chose comme scipy hstackdans une matrice clairsemée unique pour former votre modèle (s).
  3. Créez un modèle en utilisant uniquement vos données de texte clairsemées, puis combinez ses prédictions (probabilités s'il s'agit d'une classification) en tant qu'entité dense avec vos autres entités denses pour créer un modèle (par exemple: assemblage via l'empilement). Si vous suivez cette voie, n'oubliez pas de n'utiliser que les prédictions de CV comme fonctionnalités pour entraîner votre modèle, sinon vous risquez de trop suréquiper (vous pouvez créer une classe assez calme pour faire tout cela en un seul Pipelinesi vous le souhaitez).

Les trois approches sont valides et ont leurs propres avantages et inconvénients. Personnellement, je trouve que (1) est généralement le pire car il est, relativement parlant, extrêmement lent. Je trouve également que (3) est généralement le meilleur, étant à la fois suffisamment rapide et entraînant de très bonnes prédictions. Vous pouvez évidemment faire une combinaison des deux si vous êtes prêt à faire un assemblage plus étendu.

Quant aux algorithmes que vous utilisez, ils peuvent essentiellement tous s'inscrire dans ce cadre. La régression logistique fonctionne étonnamment bien la plupart du temps, mais d'autres peuvent faire mieux en fonction du problème à résoudre et de la façon dont vous les réglez. Je suis moi-même partisan des GBM, mais l'essentiel est que vous pouvez essayer autant d'algorithmes que vous le souhaitez et même faire de simples ensembles pondérés de leurs prédictions conduira presque toujours à une meilleure solution globale.

David
la source
10

Les modèles linéaires ajoutent simplement leurs caractéristiques multipliées par les poids correspondants. Si, par exemple, vous avez 1000 entités éparses dont seulement 3 ou 4 sont actives dans chaque instance (et les autres sont des zéros) et 20 entités denses qui ne sont pas toutes des zéros, alors il est fort probable que les entités denses tireront le meilleur parti de l'impact alors que les fonctionnalités clairsemées n'ajouteront qu'une petite valeur. Vous pouvez le vérifier en examinant les pondérations des entités pour quelques cas et comment elles influencent la somme résultante.

Une façon de le corriger est de s'éloigner du modèle additif. Voici quelques modèles candidats.

SVM est basé sur la séparation des hyperplans. Bien que l'hyperplan soit lui-même un modèle linéaire, SVM ne résume pas ses paramètres, mais essaie plutôt de diviser l'espace des fonctionnalités de manière optimale. Compte tenu du nombre de fonctionnalités, je dirais que le SVM linéaire devrait fonctionner correctement, tandis que les noyaux plus compliqués peuvent avoir tendance à surcharger les données.

Malgré son nom, Naive Bayes est un modèle statistique assez puissant qui a montré de bons résultats pour la classification de texte. Il est également suffisamment flexible pour capturer le déséquilibre dans la fréquence des fonctionnalités rares et denses, vous devriez donc certainement essayer.

Enfin, les forêts aléatoires peuvent fonctionner comme une bonne méthode d'ensemble dans ce cas. La randomisation garantira que différents types de caractéristiques (clairsemés / denses) seront utilisés comme nœuds de décision principaux dans différents arbres. Les arbres RF / décision sont également bons pour inspecter les fonctionnalités elles-mêmes, il convient donc de noter leur structure de toute façon.

Notez que toutes ces méthodes ont leurs inconvénients qui peuvent les transformer en ordures dans votre cas. Combiner des fonctionnalités clairsemées et denses n'est pas vraiment une tâche bien étudiée, alors laissez-nous savoir laquelle de ces approches fonctionne le mieux pour votre cas.

ami
la source
Merci pour votre réponse! J'ai deux questions de suivi :) 1) En quoi SVM (avec un noyau linéaire) et Naive Bayes sont-ils différents en ce qu'ils ne résument pas leurs caractéristiques et les poids correspondants (c'est-à-dire ce que vous appelez un "modèle additif")? Les deux créent efficacement un hyperplan de séparation, donc le résultat n'est-il pas toujours une sorte d'ajout d'entités multiplié par les poids correspondants? 2) J'aimerais essayer des forêts aléatoires, mais malheureusement l'espace des fonctionnalités est trop grand pour le représenter en format dense (j'utilise sklearn). Y a-t-il une implémentation qui peut gérer cela?
elmille
1) Dans la régression linéaire, vous vous intéressez aux points sur l' hyperplan, vous ajoutez donc des entités pondérées pour obtenir le point prédit. Dans SVM, en revanche, vous recherchez des points sur les côtés de l'hyperplan. Vous effectuez la classification en vérifiant simplement de quel côté est votre exemple, sans sommation impliquée lors de la prédiction. Naive Bayes peut incorporer différents types de modèles (par exemple binomiaux ou multinomiaux), mais fondamentalement, vous multipliez les probabilités, pas les ajoutez.
ffriend
2) J'ai vu des recherches dans ce sujet, mais je n'ai jamais rencontré de mise en œuvre (probablement googler donnera quelques liens ici). Cependant, vous pouvez toujours aller dans une autre direction - réduire la dimensionnalité avec, par exemple, PCA, puis exécuter une forêt aléatoire en fonction d'un ensemble de données réduit.
ffriend