Tools & Stacks

Seaborn wordcloud Python Pandas Matplotlib Numpy Scipy nltk PIL Sklearn openCV Jupyter-Notebook
portfolio thumbnail

Classifiez automatiquement des biens de consommation

Détail du projet

Problématique

 

La marketplace e-commerce "Place de marche" souhaite étudier la faisabilité d'un moteur de classification des articles mis en place par les vendeurs. Pour l'instant, l'attribution de la catégorie d'un article est effectuée manuellement par les vendeurs et est donc peu fiable. De plus, le volume des articles est pour l’instant très petit.

 

Pour rendre l’expérience utilisateur des vendeurs (faciliter la mise en ligne de nouveaux articles) et des acheteurs (faciliter la recherche de produits) la plus fluide possible et dans l'optique d'un passage à l'échelle, il devient nécessaire d'automatiser cette tâche.

 

On va donc devoir prétraiter les description des produits et leurs images dans le but de réaliser un clustering.

 

 

Traitement des descriptions

 

Ce traitement commence par un préprocessing simple : tokénisation, suppression de la ponctuation, des chiffres et des stopwords. Qui permet de limiter notre vocabulaire tout en conservant le maximum de sens.

 

Nous avons ensuite choisi d'utiliser un lemmatizer (après comparaison avec différents stemmers) et de POS (Part-Of-Speech) Tagging, ce qui permet d'obtenir le lemme de chaque mot de notre vocabulaire en prenant en compte son rôle dans la phrase (verbe, adverbe, nom ...).

 

On ajoutera aussi le nom du produit à notre vocabulaire (jusqu'à 3 fois) car il contient souvent beaucoup d'information.

 

Clustering

 

On s'est limité à 7 clusters, ce qui correspond aux catégories de niveau 0. Ce sont des catégories assez larges mais elles présentent l'avantage d'être équilibrées (7 catégories de 150 produits). Cela nous permettra aussi de juger de la qualité de notre clustering en comparant les labels obtenus aux catégories à l'aide de l'Adjusted Rand Index.

 

 

Plusieurs manières de préparer le texte avant clustering on été testées (avec et sans réduction de dimensions) :

 

Bag of Words:

comptage simple du nombre d'apparition du lemme

 

TF-IDF:

calcule de la fréquence du mot dans le  document par rapport à sa fréquence dans le corpus

 

Word Embedding avec Word2Vec CBOW:

chaque lemme est représenté par un vecteur à 100 composantes (son contexte), un document est représenté par la moyenne des vecteurs de chacun de ses lemmes

 

Word Embedding avec l'Universal Sentence Encoder

Réseaux de neurones pré-entraînés encodant des phrases en vecteurs de dimensions 512 que l'on réduit à 178 dimensions par PCA (95% de variance)

 

 

Traitement des images

 

Redimensionnement à 244x244 pixels et passage en niveaux de gris.

Application d'un filtrage gaussienà 0.5 sigma pour réduire le bruit et les détails. Cette valeur à été choisi après clustering sur les features obtenues par SIFT, un filtrage plus élevé empêchant l'algorithme de détecter les features.

 

 

Égalisation de l'histogramme par CLAHE qui limite le palier à l'extrêmité de l'histogramme (blancs).

 

 

 

 

Création des features

 

Par création de descripteurs SIFT

 

 

 

 

On obtient 412921 descripteurs de dimensions 128 pour nos 1050 images soit environ 393 descripteurs par image.

On les regroupe par MiniBatchKMeans pour obtenir 100 clusters de descripteurs pour toutes les images, on a donc créé des bag-of-visual-words qu'on peut visualiser sous la forme d'histogrammes :

 

 

On a pi réduire ces vecteurs à 475 dimensions par PCA en conservant 95% de la variance.

 

À l'aide de VGG16

 

 

Réseaux de neurones utilisé pour la classification d'images et entraîné sur la base de données ImageNet. On supprime simplement la couche fully connected et la couche softmax pour obtenir le modèle d'extraction de features.

 

On obtient ainsi des bag-of-visual-words de 25088 dimensions, réduits à 947 dimensions par PCA (95% de variance).

 

 

Comparaison des modèles

 

 

Les modèles basés sur les données textuelles sont les meilleurs dans tous les cas et l'Universal Sentence Encoder est le meilleur d'entre eux.

 

Ont peut voir par visualisation TSNE que certaines catégories sont très bien identifiées mais les zones moins denses sont moins bien séparées.

 

 

 

La heatmap des catégories réelles contre les prédictions montrent assez peu d'erreur.

 

 

 

Ces erreurs sont en fait souvent assez logiques, les descriptions de produits induisant le modèle en erreur car pas assez précises, ici nous pouvons voir des produits destinés aux bébés mais très proches de leur équivalent généraliste.