Big Data Analytics TP2 Utilisation de Mahout Cécile Bothorel, Romain Picot-Clemente Printemps 2015 1 Objectif Cette séance de TP utilise des outils Big Data bien connus : la librairie Mahout. C’est une librairie en constante évolution fournissant l’implémentation distribuée (Hadoop, Spark) d’une multitude d’algorithmes d’apprentissage / de prédiction pour des très grands jeux de données. Nous utiliserons la version d’Hadoop de Mahout, sur la machine virtuelle du premier TP VM cloudera-training2015. Au terme de ce TP, vous serez capables : • d’utiliser Mahout, • en particulier d’utiliser l’algorithme de classification non supervisée K-Means, • de reproduire une chaîne de traitement de classification de textes, • de résoudre un problème en imaginant votre propre chaîne de traitement utilisant la librairie Mahout, • de générer des jeux de données de train/test, d’estimer et tester des classifieurs de textes. 2 Classification non supervisée de textes pas à pas Cette première partie vous initie à la classification non supervisée de textes. Le but est de trouver des groupes de textes similaires (thème de la Recherche d’Information, Information Retrieval en Anglais). Nous allons partir de fichiers textes bruts, en générer une représentation vectorielle (vecteurs de mots), puis utiliser l’algorithme K-Means de la librairie Mahout sur ces vecteurs pour trouver des clusters de documents. Suivre pas à pas les instructions ci-dessous. Télécharger les fichiers .txt présents ici. URLURLURL!!!!!! Créer un répertoire texts/ dans HDFS. $ hadoop fs -mkdir ./texts/ Uploader tous les fichiers .txt dans ce répertoire. 1 $ hadoop fs -put *.txt ./texts/ Générer un fichier sequence-file à partir de l’ensemble des documents .txt pour les rendre utilisables par Mahout. Ce fichier consiste en un ensemble de clefs/valeurs où la clef se réfère au nom du document .txt et la valeur à son contenu. $ mahout seqdirectory -i ./texts/ -o ./seqTexts/ -c UTF-8 -chunk 5 # -c pour préciser l’encodage des fichiers textes en UTF-8 ici # -chunk pour préciser la taille d’un chunk en MegaBytes Vérifier le fichier généré $ mahout seqdumper -i ./seqTexts/ | less Générer un modèle vectoriel1 du sequence-file (tf, tf-idf). Les documents seront décrits par des vecteurs dans l’espace des mots. $ # # # mahout seq2sparse -i ./seqTexts/ -o -ow pour overwrite du répertoire de -chunk pour préciser la taille d’un -nv pour préciser que l’on souhaite ./vectTexts/ -ow -chunk 100 -nv sortie chunk en MegaBytes des vecteurs nommés (named vectors) Regarder les fichiers/répertoire générés $ hadoop fs -ls ./vectTexts/ Vérifier le fichier des vecteurs tf-idf $ mahout seqdumper -i ./vectTexts/tfidf-vectors/ | less Nous pouvons maintenant appliquer l’algorithme K-Means sur les vecteurs tf-idf pour obtenir des clusters de documents. 1 http://fr.wikipedia.org/wiki/Mod\%C3\%A8le\_vectoriel 2 $ mahout kmeans -i ./vectTexts/tfidf-vectors/ -o ./clusters -c ./centers -k 3 -x 3 -ow -cl # # # # # -k pour préciser le nombre de clusters désirés -x pour préciser le nombre d’itérations de l’algorithme -c pour préciser le répertoire de sortie des centroids -o pour préciser le répertoire de sortie des clusters -cl pour effectuer le clustering après les itérations Générer un fichier résumant le clustering dans un fichier de sortie hors HDFS $ mahout clusterdump -i ./clusters/clusters-*-final -o ./cluster-output.txt -d ./vectTexts/dictionary.file-0 -dt sequencefile -n 20 -b 100 -p ./clusters/clusteredPoints/ # -d le fichier dictionnaire des mots # -dt le type de fichier dictionnaire # -n le nombre de mots les plus fréquents à afficher pour chaque cluster # -p le répertoire des points de chaque cluster (pour connaître quels sont les éléments de chaque cluster et leur vecteur tf-idf) # -b pour n’afficher qu’un nombre limité de caractères du vecteur tf-idf du centroid de chaque cluster. Vérifier le fichier résumant le clustering. $ cat ./cluster-output.txt | less Vous trouverez une version plus détaillée de cette manipulation ici : https://mahout.apache. org/users/basics/creating-vectors-from-text.html 3 A vous de jouer Nous souhaitons classifier des documents. Nos documents sont des messages postés dans des newsgroups. Il y a exactement 18846 messages dans le jeu de données que nous allons analyser : 20news-all.zip. Ces documents proviennent de 20 newsgroups différents. Certains newsgroups sont très proches (e.g. comp.sys.ibm.pc.hardware / comp.sys.mac.hardware), d’autres n’ont rien à voir les uns avec les autres (e.g misc.forsale / soc.religion.christian). Le jeu de données est décrit ici : http://qwone.com/~jason/20Newsgroups/. 3 Tâche que nous souhaitons réaliser : sage. prédire le groupe dans lequel classer un nouveau mes- Ce genre de tâche n’est pas vraiment utile dans les newsgroups (d’ailleurs ça existe toujours ?). Mais on peut imaginer que la gestion des listes de diffusion des projets Apache soit complexe. Les utilisateurs ne postent pas toujours leurs emails dans les bonnes catégories. On trouve un nombre considérable d’Apache projects (Lucene, Mahout, Tomcat,etc.), et chaque projet dispose de plusieurs mailing lists (user, development, etc.). Un outil d’aiguillage des mails pourraît être intéressant. Par exemple, est-ce qu’un message donné est destiné à la Lucene mailing list ou à la Tomcat mailing list ? Nous rappelons que pour toute tâche de classification, avec Mahout ou pas, un modèle (classifieur) doit être entraîné pour représenter les motifs à identifier, puis testé sur un jeu de données de test. Pour générer un sous-ensemble de données de train et de test, utiliser la commande $mahout split une fois la vectorisation de document réalisée. La liste des algorithmes de Mahout sont ici : http://mahout.apache.org/users/basics/ algorithms.html. Les commandes Mahout installées sur notre machine virtuelle sont listée dans la Table 1. Activité à rendre • Proposez une chaîne de traitement Hadoop/Mahout pour estimer et tester un classifieur de documents • Développez cette proposition • Proposez et développez une variante en termes d’algorithmes et comparer Activité optionnelle Vérifiez si un algorithme de clustering peut retrouver le classement approximatif mais intuitif ( !) en 6 catégories proposé sur le fournisseur de données sur son site http://qwone.com/~jason/ 20Newsgroups/ 4 arff.vector baumwelch canopy cat cleansvd clusterdump clusterpp cmdump cvb cvb0_local dirichlet eigencuts evaluateFactorization fkmeans fpg hmmpredict itemsimilarity kmeans lucene.vector matrixdump matrixmult meanshift minhash parallelALS recommendfactorized recommenditembased regexconverter rowid rowsimilarity runAdaptiveLogistic runlogistic seq2encoded seq2sparse seqdirectory seqdumper seqmailarchives seqwiki spectralkmeans split splitDataset ssvd svd testnb trainAdaptiveLogistic trainlogistic trainnb transpose validateAdaptiveLogistic vecdist vectordump viterbi Generate Vectors from an ARFF file or directory Baum-Welch algorithm for unsupervised HMM training Canopy clustering Print a file or resource as the logistic regression models would see it Cleanup and verification of SVD output Dump cluster output to text Groups Clustering Output In Clusters Dump confusion matrix in HTML or text formats LDA via Collapsed Variation Bayes (0th deriv. approx) LDA via Collapsed Variation Bayes, in memory locally. Dirichlet Clustering Eigencuts spectral clustering compute RMSE and MAE of a rating matrix factorization against probes Fuzzy K-means clustering Frequent Pattern Growth Generate random sequence of observations by given HMM Compute the item-item-similarities for item-based collaborative filtering K-means clustering Generate Vectors from a Lucene index Dump matrix in CSV format Take the product of two matrices Mean Shift clustering Run Minhash clustering ALS-WR factorization of a rating matrix Compute recommendations using the factorization of a rating matrix Compute recommendations using item-based collaborative filtering Convert text files on a per line basis based on regular expressions Map SequenceFile<Text,VectorWritable> to SequenceFile<IntWritable,VectorWritable>, SequenceFile<IntWritable,Text> Compute the pairwise similarities of the rows of a matrix Score new production data using a probably trained and validated AdaptivelogisticRegression model Run a logistic regression model against CSV data Encoded Sparse Vector generation from Text sequence files Sparse Vector generation from Text sequence files Generate sequence files (of Text) from a directory Generic Sequence File dumper Creates SequenceFile from a directory containing gzipped mail archives Wikipedia xml dump to sequence file Spectral k-means clustering Split Input data into test and train sets split a rating dataset into training and probe parts Stochastic SVD Lanczos Singular Value Decomposition Test the Vector-based Bayes classifier Train an AdaptivelogisticRegression model Train a logistic regression using stochastic gradient descent Train the Vector-based Bayes classifier Take the transpose of a matrix Validate an AdaptivelogisticRegression model against hold-out data set Compute the distances between a set of Vectors (or Cluster or Canopy, they must fit in memory) and a list of Vectors Dump vectors from a sequence file to text Viterbi decoding of hidden states from given output states sequence TABLE 1 – Programmes connus 5 de notre version de mahout