Je cherche à faire une classification sur mes données texte. J'ai 300 classes
200 documents de formation par classe (donc 60000 documents in total
) et cela est susceptible d'entraîner des données dimensionnelles très élevées (nous pouvons rechercher plus de 1 million de dimensions ).
Je voudrais effectuer les étapes suivantes dans le pipeline (juste pour vous donner une idée de mes besoins):
- Conversion de chaque document en vecteur d'entité (
tf-idf
ouvector space model
) Feature selection
(Mutual Information
basé de préférence ou tout autre standard)- La formation du classificateur (
SVM
,Naive Bayes
,Logistic Regression
ouRandom Forest
) - Prédire les données invisibles sur la base du modèle de classificateur formé.
La question est donc de savoir quels outils / framework utiliser pour gérer de telles données de grande dimension? Je connais les suspects habituels (R, WEKA ...) mais pour autant que je sache (je peux me tromper), aucun d'entre eux ne peut gérer des données aussi importantes. Existe-t-il un autre outil standard que je pourrais consulter?
Si je dois le paralléliser, dois-je regarder Apache Mahout ? Il semble qu'il ne fournisse pas encore toutes les fonctionnalités dont j'ai besoin.
Merci à tous d'avance.
Mise à jour: J'ai parcouru ce site Web , la liste de diffusion R et Internet en général. Il me semble que les problèmes suivants pourraient apparaître dans ma situation:
(1) Le prétraitement de mes données à l'aide de R ( package tm en particulier) pourrait être impossible , car tm
il sera extrêmement lent.
(2) Étant donné que je devrai utiliser un ensemble de packages R (pré-traitement, matrices clairsemées, classificateurs, etc.) l'interopérabilité entre les packages pourrait devenir un problème, et je pourrais encourir un surcoût supplémentaire lors de la conversion de données d'un format à un autre . Par exemple, si je fais mon prétraitement à l'aide tm
(ou d'un outil externe comme WEKA), je devrai trouver un moyen de convertir ces données sous une forme que les bibliothèques HPC dans R peuvent lire. Et encore une fois, il n'est pas clair pour moi si les packages de classificateur prendraient directement les données fournies par les bibliothèques HPC.
Suis-je sur la bonne voie? Et plus important encore, ai-je un sens?
la source
foreach
bibliothèque écrire du code parallèle en R. Cela fonctionne particulièrement bien en conjonction avec des forêts aléatoires, qui sont intrinsèquement faciles à paralléliser.Réponses:
Cela devrait être possible pour le faire fonctionner tant que les données sont représentées comme une structure de données clairsemée telle que
scipy.sparse.csr_matrix
instance en Python. J'ai écrit un tutoriel pour travailler sur les données texte . Il est en outre possible de réduire davantage l'utilisation de la mémoire en tirant parti de l'astuce de hachage: l'adapter pour utiliser leHashingVectorizer
au lieu duCountingVectorizer
ou duTfidfVectorizer
. Ceci est expliqué dans la section de documentation extraction des fonctionnalités du texte .Les forêts aléatoires sont en général beaucoup plus chères que les modèles linéaires (tels que les machines à vecteur de support linéaire et la régression logistique) et les Bayes multinomiaux ou naïfs de Bernoulli et pour la plupart des problèmes de classification de texte qui n'apportent pas une précision prédictive nettement meilleure que les modèles plus simples.
Si scikit-learn ne parvient pas à s'adapter à votre problème, Vowpal Wabbit fera (et probablement plus vite que sklearn) bien qu'il n'implémente pas tous les modèles dont vous parlez.
Modifié en avril 2015 pour refléter l'état actuel de la bibliothèque scikit-learn et pour réparer les liens rompus.
la source
Gensim pour Python est magique. Et comme il est en Python, vous pouvez l'utiliser en conjonction avec la suggestion de @ ogrisel.
la source
Pas pour tirer mon propre klaxon, mais j'ai fait une série vidéo assez populaire sur l'analyse de texte avec Rapidminer. Tu peux le voir ici:
http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html
Vous pouvez probablement éviter de sélectionner des fonctionnalités, utilisez simplement un classificateur qui ne crée pas une matrice de millions * millions en mémoire :)
La régression logistique s'étouffera sur ces nombreuses dimensions. Naive Bayes prend des dimensions indépendantes, donc tout ira bien. SVM ne dépend pas du nombre de dimensions (mais du nombre de vecteurs de support) donc ça ira aussi.
300, c'est beaucoup de cours. Je commencerais avec seulement quelques-uns et continuerais votre chemin.
la source
Tout d'abord, sur la base de vos commentaires, je traiterais cela comme 300 problèmes de classification binaires (oui / non). Il existe de nombreux apprenants de classificateurs binaires open source faciles à utiliser, ce qui vous permet d'échanger du temps contre de la mémoire.
Les SVM et la régression logistique sont probablement les approches les plus populaires pour la classification de texte. Les deux peuvent facilement gérer des dimensions de 1000000, car les implémentations modernes utilisent des structures de données clairsemées et incluent des paramètres de régularisation qui évitent le sur-ajustement.
Plusieurs suites d'apprentissage automatique open source, dont WEKA et KNIME , incluent à la fois des SVM et une régression logistique. Les implémentations autonomes des SVM incluent libSVM et SVMlight . Pour la régression logistique, je vais brancher BXRtrain et BXRclassify , que j'ai développés avec Madigan, Genkin et d'autres. BXRclassify peut créer un index en mémoire de milliers de modèles de régression logistique et les appliquer simultanément.
En ce qui concerne la conversion de texte en forme vectorielle attributaire, je finis toujours par écrire un peu de Perl pour le faire à partir de zéro. :-) Mais je pense que les suites de machine learning que j'ai mentionnées incluent la tokenisation et le code de vectorisation. Une autre voie serait d'aller avec plus d'une boîte à outils en langage naturel comme LingPipe , bien que cela puisse être exagéré pour vous.
la source
Depuis Sklearn 0.13 il y a en effet une implémentation du HashingVectorizer .
EDIT: Voici un exemple à part entière d'une telle application de sklearn docs
Fondamentalement, cet exemple montre que vous pouvez classer du texte sur des données qui ne peuvent pas tenir dans la mémoire principale de l'ordinateur (mais plutôt sur disque / réseau / ...).
la source