Classification multilabel Une introduction avec Scikit-Learn de Python
Classification multilabel avec Scikit-Learn de Python
Dans les tâches d’apprentissage automatique, la classification est une méthode d’apprentissage supervisé pour prédire l’étiquette en fonction des données d’entrée. Par exemple, nous voulons prédire si quelqu’un est intéressé par une offre de vente en utilisant ses caractéristiques historiques. En formant le modèle d’apprentissage automatique à l’aide des données d’entraînement disponibles, nous pouvons effectuer les tâches de classification sur les données entrantes.
Nous rencontrons souvent des tâches de classification classiques telles que la classification binaire (deux étiquettes) et la classification multiclasse (plus de deux étiquettes). Dans ce cas, nous formerions le classifieur et le modèle essaierait de prédire l’une des étiquettes parmi toutes les étiquettes disponibles. L’ensemble de données utilisé pour la classification est similaire à l’image ci-dessous.
- Fraude par « deepfake » pilotée par l’IA La bataille en cours du Kerala contre les escrocs
- Les meilleurs outils d’IA pour la comptabilité en 2023
- Découvrez BeLFusion Une approche de l’espace latent comportemental pour une prédiction réaliste et diversifiée des mouvements humains stochastiques à l’aide de la diffusion latente.
L’image ci-dessus montre que la cible (Offre de vente) contient deux étiquettes dans la classification binaire et trois dans la classification multiclasse. Le modèle serait formé à partir des caractéristiques disponibles, puis ne produirait qu’une seule étiquette.
La classification multilibellée est différente de la classification binaire ou multiclasse. Dans la classification multilibellée, nous n’essayons pas de prédire uniquement avec une seule étiquette de sortie. Au lieu de cela, la classification multilibellée essaie de prédire autant d’étiquettes que possible qui s’appliquent aux données d’entrée. La sortie pourrait être aucune étiquette jusqu’au nombre maximum d’étiquettes disponibles.
La classification multilibellée est souvent utilisée dans la tâche de classification des données textuelles. Par exemple, voici un jeu de données d’exemple pour la classification multilibellée.
Dans l’exemple ci-dessus, imaginez que le Texte 1 à Texte 5 est une phrase qui peut être catégorisée en quatre catégories : Événement, Sport, Culture Pop et Nature. Avec les données d’entraînement ci-dessus, la tâche de classification multilibellée prédit quelle étiquette s’applique à la phrase donnée. Chaque catégorie n’est pas en opposition avec les autres car elles ne sont pas mutuellement exclusives ; chaque étiquette peut être considérée comme indépendante.
Pour plus de détails, nous pouvons voir que les étiquettes Sport et Culture Pop sont attribuées au Texte 1, tandis que les étiquettes Culture Pop et Nature sont attribuées au Texte 2. Cela montre que chaque étiquette était mutuellement exclusive et que la classification multilibellée peut avoir une sortie de prédiction avec aucune des étiquettes ou toutes les étiquettes simultanément.
Avec cette introduction, essayons de construire un classificateur multiclasse avec Scikit-Learn.
Classification multilibellée avec Scikit-Learn
Ce tutoriel utilisera l’ensemble de données de classification multilibellée Biomedical PubMed disponible publiquement sur Kaggle. L’ensemble de données contiendra diverses caractéristiques, mais nous n’utiliserons que la fonction abstractText avec leur classification MeSH (A : Anatomie, B : Organisme, C : Maladies, etc.). Les données d’exemple sont montrées dans l’image ci-dessous.
L’ensemble de données ci-dessus montre que chaque article peut être classé dans plus d’une catégorie, les cas de classification multilibellée. Avec cet ensemble de données, nous pouvons construire un classificateur multilibellé avec Scikit-Learn. Préparons l’ensemble de données avant de former le modèle.
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
df = pd.read_csv('PubMed Multi Label Text Classification Dataset Processed.csv')
df = df.drop(['Title', 'meshMajor', 'pmid', 'meshid', 'meshroot'], axis =1)
X = df["abstractText"]
y = np.asarray(df[df.columns[1:]])
vectorizer = TfidfVectorizer(max_features=2500, max_df=0.9)
vectorizer.fit(X)
Dans le code ci-dessus, nous transformons les données textuelles en représentation TF-IDF afin que notre modèle Scikit-Learn puisse accepter les données d’entraînement. De plus, je saute les étapes de prétraitement des données, telles que la suppression des mots vides, pour simplifier le tutoriel.
Après la transformation des données, nous divisons l’ensemble de données en ensembles d’entraînement et de test.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=101)
X_train_tfidf = vectorizer.transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)
Après toute la préparation, nous commencerions à former notre classifieur multilabel. Dans Scikit-Learn, nous utiliserions l’objet MultiOutputClassifier pour former le modèle de classifieur multilabel. La stratégie derrière ce modèle est de former un classifieur par étiquette. Fondamentalement, chaque étiquette a son propre classifieur.
Nous utiliserions la régression logistique dans cet exemple, et MultiOutputClassifier les étendrait à toutes les étiquettes.
from sklearn.multioutput import MultiOutputClassifier
from sklearn.linear_model import LogisticRegression
clf = MultiOutputClassifier(LogisticRegression()).fit(X_train_tfidf, y_train)
Nous pouvons changer le modèle et ajuster les paramètres du modèle qui sont passés dans le MultiOutputClasiffier, donc gérez-les selon vos besoins. Après la formation, utilisons le modèle pour prédire les données de test.
prediction = clf.predict(X_test_tfidf)
prediction
Le résultat de la prédiction est un tableau d’étiquettes pour chaque catégorie MeSH. Chaque ligne représente la phrase, et chaque colonne représente l’étiquette.
Enfin, nous devons évaluer notre classifieur multilabel. Nous pouvons utiliser les mesures de précision pour évaluer le modèle.
from sklearn.metrics import accuracy_score
print('Score de précision : ', accuracy_score(y_test, prediction))
Score de précision : 0,145
Le résultat du score de précision est de 0,145, ce qui montre que le modèle ne pouvait prédire la combinaison exacte d’étiquettes que moins de 14,5% du temps. Cependant, le score de précision présente des faiblesses pour une évaluation de prédiction multilabel. Le score de précision nécessiterait que chaque phrase ait la présence de toutes les étiquettes à la position exacte, sinon elle serait considérée comme fausse.
Par exemple, la prédiction de la première ligne ne diffère que d’une étiquette entre la prédiction et les données de test.
Elle serait considérée comme une prédiction incorrecte pour le score de précision car la combinaison d’étiquettes diffère. C’est pourquoi notre modèle a un score métrique faible.
Pour atténuer ce problème, nous devons évaluer la prédiction d’étiquettes plutôt que leur combinaison d’étiquettes. Dans ce cas, nous pouvons nous fier à la métrique d’évaluation de la perte de Hamming. La perte de Hamming est calculée en prenant une fraction de la prédiction incorrecte par rapport au nombre total d’étiquettes. Comme la perte de Hamming est une fonction de perte, plus le score est bas, mieux c’est (0 indique aucune prédiction incorrecte et 1 indique que toutes les prédictions sont fausses).
from sklearn.metrics import hamming_loss
print('Perte de Hamming : ', round(hamming_loss(y_test, prediction),2))
Perte de Hamming : 0,13
Notre modèle de classifieur multilabel avec perte de Hamming est de 0,13, ce qui signifie que notre modèle aurait une prédiction incorrecte 13% du temps de manière indépendante. Cela signifie que chaque prédiction d’étiquette pourrait être fausse 13% du temps.
Conclusion
La classification multilabel est une tâche d’apprentissage automatique où la sortie pourrait être aucune étiquette ou toutes les étiquettes possibles en fonction des données d’entrée. C’est différent de la classification binaire ou multiclasse, où la sortie d’étiquette est mutuellement exclusive.
En utilisant MultiOutputClassifier de Scikit-Learn, nous pourrions développer un classifieur multilabel où nous formons un classifieur pour chaque étiquette. Pour l’évaluation du modèle, il est préférable d’utiliser la métrique de perte de Hamming car le score de précision pourrait ne pas donner une image complète correctement. Cornellius Yudha Wijaya est un responsable adjoint de la science des données et un rédacteur de données. Tout en travaillant à temps plein chez Allianz Indonesia, il aime partager des astuces Python et des conseils sur les données via les médias sociaux et l’écriture.
We will continue to update IPGirl; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- Meta dévoile AudioCraft un outil d’IA pour transformer du texte en audio et en musique.
- 40+ Outils AI Cool que vous devriez vérifier (août 2023)
- Dernières avancées dans les noyaux de CNN pour les modèles d’images volumineux
- La menace de la désinformation climatique propagée par la technologie d’IA générative
- Fuite de données Qu’est-ce que c’est et pourquoi cela cause l’échec de nos systèmes prédictifs
- Instagram va désormais étiqueter le contenu généré par l’IA
- Découvrez CREATOR un nouveau cadre d’IA novateur qui permet aux LLM de créer leurs propres outils grâce à la documentation et à la réalisation de code.