La recherche en IA te passionne ?
Les papers et avancées qui comptent, expliqués simplement, chaque soir. Gratuit.
Inclus dès l'inscription : notre sélection des meilleurs guides & comparatifs IA.
Choisis ton rythme
Gratuit · Pas de spam · Désabonnement en 1 clic
Scikit-LLM : Une avancée dans la classification multi-label
Introduction
La classification de texte est souvent perçue comme une tâche binaire, où les avis sont catégorisés comme "positifs" ou "négatifs", ou encore où les demandes sont classées dans des catégories distinctes. Cependant, les émotions humaines sont rarement aussi simples à décrire. Une phrase unique peut exprimer des émotions multiples, comme la joie et la colère simultanément. Prenons par exemple : "J'adore absolument l'autonomie de la batterie améliorée, mais le nouveau design est incroyablement horrible." Ici, la classification multi-label entre en jeu, permettant d'attribuer plusieurs catégories à un même texte.
Créer de tels classificateurs nécessite généralement des volumes importants de données étiquetées et des architectures de réseaux neuronaux complexes. Cependant, les grands modèles de langage (LLMs) offrent une solution alternative grâce à leur capacité de raisonnement, notamment en zero-shot. Avec des bibliothèques comme scikit-LLM, il est désormais possible d'intégrer ces modèles dans un flux de travail traditionnel d'apprentissage automatique, tel que scikit-learn. Cet article explore comment aborder un problème de classification de sentiments multi-label en utilisant un ensemble de données open-source.
Guide étape par étape
Scikit-LLM se distingue par sa capacité à simplifier l'utilisation des LLMs pour l'inférence, sans nécessiter un entraînement intensif. Il permet également l'utilisation de LLMs gratuits et open-source sans restrictions de quota. Nous allons illustrer comment charger, adapter et exploiter un LLM pré-entraîné pour une tâche de classification multi-label.
Pour commencer, il est nécessaire d'importer les bibliothèques requises :
pip install scikit-llm datasets
Nous utiliserons un LLM gratuit de Groq, connu pour ses capacités d'inférence rapide. Après inscription sur leur site, vous obtiendrez une clé API. Cette clé, une fois générée, doit être copiée et insérée dans le code suivant :
from skllm.config import SKLLMConfig
from skllm.models.[gpt](/glossaire/gpt).classification.zero_shot import MultiLabelZeroShotGPTClassifier
# 1. Définir votre clé API (utilisez "any_string" si local)
SKLLMConfig.set_openai_key("VOTRE_CLÉ_API_GRATUITE")
# 2. Définir l'URL de point de terminaison personnalisé
SKLLMConfig.set_gpt_url("https://api.groq.com/[openai](/dossier/openai)/v1/")
# 3. Initialiser le classificateur.
clf = MultiLabelZeroShotGPTClassifier(model="custom_url::[llama](/dossier/meta-ia)-3.3-70b-versatile", max_labels=3)
Nous avons ici créé un objet de la classe MultiLabelZeroShotGPTClassifier pour héberger notre modèle pré-entraîné de Groq.
Ensuite, nous importons un ensemble de données. Hugging Face propose un large éventail d'ensembles de données, et nous utiliserons spécifiquement l'ensemble go_emotions, idéal pour notre tâche. Selon votre environnement, une clé API Hugging Face pourrait être nécessaire, obtenue facilement en s'inscrivant sur leur site.
from datasets import load_dataset
import pandas as pd
dataset = load_dataset("google-research-datasets/go_emotions", split="train[:100]")
df = dataset.to_pandas()
texts = df['text'].tolist()
print(f"Chargé {len(texts)} commentaires.")
print(f"Exemple : '{texts[0]}'")
Vous verrez une sortie indiquant un exemple de l'ensemble de données chargé :
Chargé 100 commentaires.
Exemple : 'Mon plat préféré est tout ce que je n'ai pas eu à cuisiner moi-même.'
Pour "entraîner" le LLM, nous devons simplement définir notre ensemble de labels spécifiques au domaine. Le modèle s'adapte alors pour classifier les textes en utilisant ces labels. Voici l'ensemble de labels que nous utiliserons :
candidate_labels = [
"admiration", "amusement", "anger", "annoyance",
"approval", "curiosity", "disappointment", "joy",
"sadness", "surprise"
]
Il ne s'agit pas d'un entraînement traditionnel : nous exposons simplement le modèle à notre ensemble de labels pour définir le problème. Voici comment procéder :
clf.fit(None, [candidate_labels])
Après avoir complété ces étapes, vous êtes prêt à faire des prédictions sur quelques exemples de texte. Essayons avec cinq textes de l'ensemble de données :
predictions = clf.predict(texts)
for i in range(5):
print(f"Commentaire : {texts[i]}")
print(f"Sentiments Prédits : {predictions[i]}")
print("-" * 50)
Résultats
Voici un extrait des résultats — deux des cinq prédictions sont montrées :
Commentaire : Mon plat préféré est tout ce que je n'ai pas eu à cuisiner moi-même.
Sentiments Prédits : ['amusement' 'joy' '']
--------------------------------------------------
Commentaire : Maintenant, s'il se suicide, tout le monde pensera qu'il rigole en se moquant des gens au lieu d'être réellement mort.
Sentiments Prédits : ['anger' 'annoyance' 'surprise']
Notez que plusieurs labels peuvent être attribués à un seul texte lors de la prédiction.
Ne soyez pas surpris si le processus de prédiction prend du temps. C'est normal, car l'utilisation locale de ces LLMs est gourmande en ressources. L'inférence est souvent plus longue que l'ajustement du modèle, car aucun entraînement réel n'est effectué, seulement une définition de scénario avec les labels.
Conclusion
Cet article a démontré comment réaliser une classification de texte multi-label avec scikit-LLM, en exploitant les capacités des LLMs pré-entraînés comme des modèles d'apprentissage automatique classiques avec scikit-learn.
Pour aller plus loin, vous pourriez élargir l'ensemble de labels pour mieux couvrir le spectre émotionnel de votre domaine, ou tester d'autres modèles hébergés par Groq pour comparer les prédictions. Scikit-LLM supporte également d'autres stratégies de classification zero-shot et few-shot, permettant d'affiner les prédictions avec un petit nombre d'exemples étiquetés. Enfin, pour une utilisation en production, il est crucial de mettre en place une boucle d'évaluation pour mesurer la précision et le rappel, afin d'identifier les forces et faiblesses du modèle.





