
2024
Classification automatique d'entreprises - Société Médée
Un modèle qui classe automatiquement les entreprises par secteur pour repérer les zones de marché à fort potentiel.
Mission de machine learning pour Médée : concevoir un modèle de classification automatique d'entreprises dans deux secteurs (photographie ou cuisine) pour une multinationale. L'objectif était ensuite d'exploiter ce modèle pour identifier des zones géographiques dépourvues de points de vente dans ces catégories, dans le cadre d'études de marché. 1. Collecte des données : enrichissement des données d'entreprises via les métadonnées de leurs sites web (contenu textuel, titres, descriptions), APIs tierces (Google Maps, avis utilisateurs), et analyse d'images via des modèles de langage pour générer des descriptions contextuelles. 2. Préparation des données : nettoyage, suppression des entreprises avec un volume d'information insuffisant, vectorisation des données textuelles via des embeddings Mistral. 3. Modélisation : test de plusieurs classifieurs supervisés (SVM, Random Forest) sur les embeddings, avec des performances dépassant 90 % de précision et un faible taux de faux positifs.
Étude de cas détaillée
Médée est une SAS de prestations technologiques qui, en parallèle de son produit principal (un chatbot de conseil santé), intervenait comme prestataire pour des clients. Dans ce cas, elle agissait en tant qu'intermédiaire pour une multinationale (dont je tais le nom pour des raisons de confidentialité). L'objectif : classer automatiquement des entreprises dans deux secteurs cibles (photographie et cuisine) pour identifier des zones géographiques dépourvues de points de vente pertinents.
Le point de départ était un Excel fourni par le client : des adresses d'entreprises avec leur label de vérité (cible ou hors-cible). C'est ce jeu de données annoté qui a servi de base d'entraînement. La mission était un MVP destiné à valider la faisabilité avant une seconde mission plus large.
La situation de départ : un Excel et une question simple
Le client avait un besoin précis : étant donné une liste d'entreprises avec leur adresse, savoir lesquelles appartiennent au secteur photographie ou cuisine.
Le cas d'usage final était géographique. En classifiant automatiquement les entreprises d'une zone, on pouvait repérer les secteurs sous-représentés : une rue commerçante sans photographe professionnel, un quartier sans traiteur spécialisé. Ce qui intéressait la multinationale, c'était ces zones blanches.
L'Excel de vérité terrain couvrait quelques centaines d'entreprises, labelisées manuellement. Pas assez pour entraîner directement un modèle robuste : il fallait enrichir les données.
Collecte des données : scraping + enrichissement multi-sources
Trois sources d'enrichissement ont été utilisées.
Sites web des entreprises. Pour chaque entreprise disposant d'un site, on a extrait le contenu textuel (titres, méta-descriptions, texte principal). C'est souvent la source la plus discriminante : une entreprise de cuisine a des mots très différents sur son site d'une entreprise de photographie.
Pages Jaunes. Les pages d'annuaires donnent accès à la catégorie déclarée, aux avis clients, et parfois à une description de l'activité. Le problème : les Pages Jaunes sont protégées contre le scraping. La solution a été d'utiliser des proxys résidentiels rotatifs pour contourner la détection, en simulant des requêtes issues de vraies connexions domestiques.
Enrichissement par LLM sur images. Certaines entreprises n'avaient pas de site ni de fiche Pages Jaunes exploitable, mais une image (logo, photo de vitrine). On a utilisé un modèle de vision pour générer une description textuelle de l'image, qui alimentait ensuite le pipeline de vectorisation.
Préparation des données : nettoyer avant de vectoriser
Toutes les entreprises n'étaient pas exploitables. Deux types de cas ont été filtrés :
- Pas de site web, pas de fiche Pages Jaunes, pas d'image. Sans signal textuel ou visuel, impossible de construire un embedding représentatif. Ces entreprises ont été retirées du jeu d'entraînement.
- Données trop pauvres. Certaines fiches avaient un nom d'entreprise générique et rien d'autre. Conserver ces cas aurait introduit du bruit sans valeur prédictive.
Après nettoyage, le texte consolidé de chaque entreprise (site + Pages Jaunes + description image) a été vectorisé avec les embeddings de Mistral. Chaque entreprise devenait un vecteur dense de plusieurs centaines de dimensions, captant le sens sémantique de l'ensemble de ses signaux textuels.
Modélisation : pourquoi XGBoost sur des embeddings
Plusieurs classifieurs ont été testés sur ces embeddings : SVM, Random Forest, XGBoost. XGBoost a donné les meilleurs résultats, et ce n'est pas un hasard.
La raison principale : les données manquantes. Même après nettoyage, certaines entreprises n'avaient pas toutes les sources renseignées. Un site web mais pas de Pages Jaunes. Une image mais pas de site. Les modèles d'arborescence (Random Forest, XGBoost) gèrent nativement ce type de données tabulaires incomplètes, là où un SVM sur embeddings concaténés aurait été sensible à la structure des entrées manquantes.
XGBoost ajoute par-dessus le boosting gradient : chaque arbre apprend des erreurs du précédent, ce qui améliore la robustesse sur les cas difficiles (entreprises ambiguës dont le nom ou le site ne donne pas de signal clair).
from xgboost import XGBClassifier
from sklearn.model_selection import cross_val_score
model = XGBClassifier(
n_estimators=200,
max_depth=6,
learning_rate=0.05,
subsample=0.8,
colsample_bytree=0.8,
use_label_encoder=False,
eval_metric="logloss",
)
scores = cross_val_score(model, X_embeddings, y, cv=5, scoring="f1_weighted")La validation croisée à 5 folds a permis de mesurer la précision sur des sous-ensembles non vus de l'Excel client, en évitant le surapprentissage sur un jeu labellisé relativement petit.
Résultats
91 % de précision sur le jeu de validation. Pour un MVP sur données enrichies et partiellement manquantes, c'est un niveau suffisant pour justifier la deuxième mission.
Faible taux de faux positifs. L'erreur la plus coûteuse pour le client final était de classifier une entreprise hors-cible comme cible (investir dans une zone qui n'en vaut pas la peine). La précision par classe sur les vrais positifs a été optimisée en priorité.
Zones de marché identifiables. En appliquant le modèle à de nouvelles adresses, il devient possible de cartographier les zones par densité de cibles. C'est la sortie attendue pour la deuxième mission.
Ce que ce projet illustre sur la collecte de données
Deux observations applicables à d'autres projets de classification sur données web.
Le signal textuel bat le signal catégoriel. Les catégories déclarées sur les Pages Jaunes sont souvent trop larges ou mal renseignées. Le texte brut du site, lui, est discriminant : une école de cuisine parle de "cours", de "recettes", de "tablier". Un studio photo parle de "séance", de "portrait", de "retouche". Les embeddings capturent cette sémantique sans règles manuelles.
Les proxys résidentiels ne sont pas un détail. Les Pages Jaunes détectent et bloquent les requêtes issues de datacenters. Sans proxys résidentiels rotatifs, le scraping s'arrête après quelques dizaines de requêtes. Sur un projet de classification à l'échelle, c'est une contrainte d'infrastructure à anticiper dès le cadrage.
Pièges à éviter
Conserver des entreprises sans signal. Il est tentant de garder toutes les entrées de l'Excel client pour maximiser le volume d'entraînement. En pratique, une entrée sans texte ni image ne donne qu'un vecteur nul ou bruité : elle dégrade les performances plutôt qu'elle ne les améliore.
Un seul modèle pour tout. Les secteurs "photographie" et "cuisine" ont des signaux très différents. Selon les besoins, un modèle one-vs-rest par secteur peut surpasser un modèle multiclasse générique.
Ignorer le déséquilibre de classes. Si l'Excel client a 80 % d'entreprises hors-cible et 20 % de cibles, un modèle naif qui prédit "hors-cible" tout le temps atteint 80 % de précision globale sans rien apprendre. Utiliser le F1-score pondéré et le paramètre scale_pos_weight de XGBoost pour équilibrer.
Conclusion : TL;DR
Classification automatique d'entreprises par secteur, à partir de données scrappées et enrichies par LLM, pour cartographier des zones de marché à fort potentiel.
Points-clés :
- Excel client + scraping Pages Jaunes (proxys résidentiels) + sites web + descriptions images LLM
- Embeddings Mistral pour vectoriser les signaux textuels hétérogènes
- XGBoost pour gérer les données manquantes par source et maximiser la précision
- 91 % de précision, base pour la deuxième mission
Si vous avez un besoin de qualification ou de classification automatique à partir de données web, parlons-en.