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.

   

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!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AI

Comment l'IA aide les clients à mieux faire leurs achats sur Amazon

Les avis des clients sont devenus la pierre angulaire des achats en ligne, donnant aux acheteurs des informations pré...

AI

Booster vos projets de Data Science, ML et CV Outils essentiels pour une gestion de projet efficace

Les projets de ML ou de science des données sont très volumineux à construire car ils contiennent de nombreux types d...

Actualités sur l'IA

Médicament conçu par l'IA prêt pour les essais sur l'homme.

Une entreprise de biotechnologie, Insilico Medicine, soutenue par le conglomérat chinois Fosun Group et le géant du c...

AI

Comment la plateforme de VAST Data élimine les obstacles à l'innovation en matière d'IA

Un accès plus rapide à davantage de données, indépendamment de l'endroit où se trouvent les données, accélérera l'ado...

Actualités sur l'IA

Comment Google évalue le contenu dernières mises à jour

Google, le moteur de recherche leader mondial, a réalisé des avancées significatives dans la compréhension et l’...

AI

Appel à toutes les start-ups de cybersécurité en IA - en Europe et maintenant aux États-Unis.

Lancement du nouveau programme Google for Startups Growth Academy programme d'IA pour la cybersécurité destiné aux e...