mercredi 15 janvier 2014

Facebook Recruiting III - Keyword Extraction

http://www.kaggle.com/c/facebook-recruiting-iii-keyword-extraction

Plusieurs fois par an Facebook propose sur Kaggle un concours pour dénicher leur futur data scientist. Pour cette troisième édition, l'accent a été mis sur le textmining, au-delà de l'aspect statistique ou du machine learning, le défi principal est la capacité à manipuler de larges bases de données en ayant de fortes contraintes en mémoire vive.
À partir de 6 millions de questions issues de Stack Overflow (un site de discussion au sujet de la programmation) avec les variables suivantes : le titre, le détail de la question et les tags de la question il faut réussir à prédire pour 2 autres millions de questions les tags correspondants.

Le but est de maximiser la moyenne du score F1 :

F1 = 2[ p*r / (p+r) ]

Soit p, la précision c'est le rapport du nombre de vrais positifs sur l'ensemble des positifs prédits (vrais et faux positifs).

Soit r, le rappel c'est le rapport du nombre de vrais positifs sur l'ensemble des positifs réels non prédits (vrai positif et faux négatifs)

Résultat : le meilleur modèle a un score de 0.81350, mon modèle arrive à un score de 0.68622. En classement final, j'obtiens la 130e place sur un total de 367 participants. Mes contraintes en mémoire ont fait que j'ai du simplifier mon modèle initial. La modélisation a été réalisée entièrement sous Python.





1: Comme dit précédemment les données train et test sont constituées ainsi : un titre, le détail de la question, les tags de la question pour les données train.

Pour réaliser la prédiction des tags je n'ai pas considéré le détail de la question et me suis appuyé sur uniquement le Title (Titre). S'agissant d'un forum informatique, le détail de la question contenait souvent de nombreuses lignes de codes difficilement appréhendable en regard de mes connaissances en textmining.


2: Pour le train et le test, j'ai effectué quelques traitements afin de faciliter la modélisation et réduire la taille des fichiers. J'ai mis en minuscules le texte et supprimé les stopwords : mots qui sont tellement communs qu'il est inutile de les utiliser (articles...). Pour avoir une idée du code sous Python voir mon billet précédent : Manipuler de gros fichier en ayant peu de mémoire vive.


3: En utilisant l'excellent scikit-learn, j'ai réalisé la matrice des termes des Titles.


il
fait
beau
pleut
title1 : il fait beau
1
1
1

title2 : il pleut
1


1
Exemple de terms document matrix

La matrice des termes du Test est réalisée en utilisant les éléments du Train pour avoir les mêmes variables pour les deux matrices.


4: Les scores F1 sont très élevés, habituellement pour ce type de modélisation on arrive difficilement à 0.50 cela s'explique par le fait que des données du train sont aussi présente dans le test. J'ai réalisé la déduplication à partir du Title.


5: J'ai voulu dans un premier temps réaliser une forêt aléatoire, mais ce dernier ne prenait pas en compte les matrices creuses ou sparse matrix, j'ai essayé un Multinomial NB un modèle probabiliste, mais je ne disposais pas assez de mémoire. Suite à la lecture de différents articles, j'ai réalisé la modélisation en utilisant la descente du gradient stochastique (SGDClassifier) qui est rapide et économe en mémoire vive.


6: Pour chaque question, il est possible d'avoir plusieurs tags, j'ai considéré ici les cinq premiers tags.j'ai réalisé pour la position de chaque tag un modèle SGDClassifier que j'ai appliqué sur les données test.
Le modèle a appris sur un échantillon aléatoire de 400 000 questions de la base train, l'utilisation d'une instance EC2 a été nécessaire. (25 go d'utilisation mémoire, un processeur, 3 heures de calcul)


Autres :