Dernière mise à jour le 31 août 2020
La classification multi-étiquettes consiste à prédire zéro étiquette de classe ou plus.
Contrairement aux tâches de classification normales où les étiquettes de classe sont mutuellement exclusives, la classification multi-étiquettes nécessite des algorithmes d’apprentissage automatique spécialisés qui prennent en charge la prédiction de plusieurs classes ou étiquettes mutuellement non exclusives. »
Les réseaux neuronaux d’apprentissage en profondeur sont un exemple d’algorithme qui prend en charge nativement les problèmes de classification multi-étiquettes. Les modèles de réseaux neuronaux pour les tâches de classification multi-étiquettes peuvent être facilement définis et évalués à l’aide de la bibliothèque d’apprentissage profond Keras.
Dans ce tutoriel, vous découvrirez comment développer des modèles d’apprentissage profond pour la classification multi-étiquettes.
Après avoir terminé ce tutoriel, vous saurez:
- La classification multi-étiquettes est une tâche de modélisation prédictive qui consiste à prédire des étiquettes de classe zéro ou plus mutuellement non exclusives.
- Les modèles de réseaux neuronaux peuvent être configurés pour des tâches de classification multi-étiquettes.
- Comment évaluer un réseau de neurones pour une classification multi-étiquettes et faire une prédiction pour de nouvelles données.
Commençons.
Classification Multi-Étiquettes avec apprentissage profond
Photo de Trevor Marron, certains droits réservés.
- Aperçu du tutoriel
- Classification Multi-Étiquettes
- Réseaux de neurones pour plusieurs étiquettes
- Réseau de neurones pour la classification Multi-étiquettes
- Pour en savoir plus
- Résumé
- Développez des projets d’Apprentissage Profond avec Python !
- Et Si Vous Pouviez Développer Un Réseau en Quelques Minutes
- Apportez Enfin L’Apprentissage Profond À Vos Propres Projets
Aperçu du tutoriel
Ce tutoriel est divisé en trois parties; elles sont:
- Classification Multi-Étiquettes
- Réseaux de neurones pour plusieurs étiquettes
- Réseau de neurones pour une Classification Multi-Étiquettes
Classification Multi-Étiquettes
La classification est un problème de modélisation prédictive qui implique la sortie d’une étiquette de classe avec une entrée
Elle est différente des tâches de régression qui impliquent prédire une valeur numérique.
En règle générale, une tâche de classification consiste à prédire une étiquette unique. Alternativement, cela peut impliquer de prédire la probabilité sur deux étiquettes de classe ou plus. Dans ces cas, les classes sont mutuellement exclusives, ce qui signifie que la tâche de classification suppose que l’entrée appartient à une seule classe.
Certaines tâches de classification nécessitent de prédire plus d’une étiquette de classe. Cela signifie que les étiquettes de classe ou l’appartenance à une classe ne s’excluent pas mutuellement. Ces tâches sont appelées classification à étiquettes multiples ou classification à étiquettes multiples pour faire court.
Dans la classification multi-étiquettes, zéro ou plusieurs étiquettes sont requises comme sortie pour chaque échantillon d’entrée, et les sorties sont requises simultanément. L’hypothèse est que les étiquettes de sortie sont une fonction des entrées.
Nous pouvons créer un ensemble de données de classification synthétique multi-étiquettes à l’aide de la fonction make_multilabel_classification() de la bibliothèque scikit-learn.
Notre jeu de données comprendra 1 000 échantillons avec 10 fonctionnalités d’entrée. L’ensemble de données aura trois sorties d’étiquette de classe pour chaque échantillon et chaque classe aura une ou deux valeurs (0 ou 1, par exemple présent ou non présent).
L’exemple complet de création et de synthèse de l’ensemble de données de classification synthétique multi-étiquettes est présenté ci-dessous.
1
2
3
4
5
6
7
8
9
|
# exemple d’une tâche de classification multi-étiquettes
de sklearn.importer des ensembles de données make_multilabel_classification
# définir l’ensemble de données
X, y = make_multilabel_classification(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
# résumer la forme de l’ensemble de données
print (X.shape, y.forme)
# résumer les premiers exemples
pour i dans la plage(10):
imprimer (X, y)
|
L’exécution de l’exemple crée l’ensemble de données et résume la forme des éléments d’entrée et de sortie.
Nous pouvons voir que, comme prévu, il y a 1 000 échantillons, chacun avec 10 fonctionnalités d’entrée et trois fonctionnalités de sortie.
Les 10 premières lignes d’entrées et de sorties sont résumées et nous pouvons voir que toutes les entrées de cet ensemble de données sont numériques et que les étiquettes de classe de sortie ont des valeurs 0 ou 1 pour chacune des trois étiquettes de classe.
1
2
3
4
5
6
7
8
9
10
11
12
|
(1000, 10) (1000, 3)
|
Ensuite, regardons comment nous pouvons développer des modèles de réseaux de neurones pour les tâches de classification multi-étiquettes.
Réseaux de neurones pour plusieurs étiquettes
Certains algorithmes d’apprentissage automatique prennent en charge nativement la classification multi-étiquettes.
Les modèles de réseaux neuronaux peuvent être configurés pour prendre en charge la classification multi-étiquettes et peuvent fonctionner correctement, en fonction des spécificités de la tâche de classification.
La classification multi-étiquettes peut être prise en charge directement par les réseaux de neurones simplement en spécifiant le nombre d’étiquettes cibles dans le problème comme le nombre de nœuds dans la couche de sortie. Par exemple, une tâche qui a trois étiquettes de sortie (classes) nécessitera une couche de sortie de réseau neuronal avec trois nœuds dans la couche de sortie.
Chaque nœud de la couche de sortie doit utiliser l’activation sigmoïde. Cela permettra de prédire une probabilité d’appartenance à une classe pour l’étiquette, une valeur comprise entre 0 et 1. Enfin, le modèle doit être adapté à la fonction de perte d’entropie croisée binaire.
En résumé, pour configurer un modèle de réseau neuronal pour une classification multi-étiquettes, les spécificités sont:
- Le nombre de nœuds dans la couche de sortie correspond au nombre d’étiquettes.
- Activation sigmoïde pour chaque nœud de la couche de sortie.
- Fonction de perte d’entropie croisée binaire.
Nous pouvons le démontrer en utilisant la bibliothèque d’apprentissage profond Keras.
Nous allons définir un modèle de Perceptron multicouche (MLP) pour la tâche de classification multi-étiquettes définie dans la section précédente.
Chaque échantillon a 10 entrées et trois sorties ; par conséquent, le réseau nécessite une couche d’entrée qui attend 10 entrées spécifiées via l’argument « input_dim » dans la première couche cachée et trois nœuds dans la couche de sortie.
Nous utiliserons la fonction d’activation ReLU populaire dans la couche cachée. La couche cachée a 20 nœuds qui ont été choisis après quelques essais et erreurs. Nous adapterons le modèle en utilisant la perte d’entropie croisée binaire et la version Adam de la descente de gradient stochastique.
La définition du réseau pour la tâche de classification multi-étiquettes est listée ci-dessous.
1
2
3
4
5
|
# définissez le modèle
model=Sequential()
model.il est possible d’ajouter un modèle (Dense(20, input_dim= n_inputs, kernel_initializer= ‘he_uniform’, activation=’relu’))
.ajouter (Dense(n_outputs, activation = ‘sigmoïde’))
modèle.compile(loss= ‘binary_crossentropy’, optimizer =’adam’)
|
Vous voudrez peut-être adapter ce modèle à votre propre tâche de classification multi-étiquettes; par conséquent, nous pouvons créer une fonction pour définir et renvoyer le modèle où le nombre de variables d’entrée et de sortie est fourni comme arguments.
1
2
3
4
5
6
7
|
# obtenez le modèle
def get_model(n_inputs, n_outputs) :
model=Sequential()
model.il est possible d’ajouter un modèle (Dense(20, input_dim= n_inputs, kernel_initializer= ‘he_uniform’, activation=’relu’))
.ajouter (Dense(n_outputs, activation = ‘sigmoïde’))
modèle.compile(loss=’binary_crossentropy’, optimizer= ‘adam’)
modèle de retour
|
Maintenant que nous sommes familiers avec la définition d’une MLP pour la classification multi-étiquettes, explorons comment ce modèle peut être évalué.
Réseau de neurones pour la classification Multi-étiquettes
Si l’ensemble de données est petit, il est recommandé d’évaluer les modèles de réseaux de neurones à plusieurs reprises sur le même ensemble de données et de rapporter la performance moyenne entre les répétitions.
Ceci est dû à la nature stochastique de l’algorithme d’apprentissage.
De plus, il est recommandé d’utiliser la validation croisée du pli-k au lieu de diviser un ensemble de données par train/test pour obtenir une estimation impartiale des performances du modèle lors de la prévision de nouvelles données. Encore une fois, ce n’est que s’il n’y a pas trop de données que le processus peut être terminé dans un délai raisonnable.
En tenant compte de cela, nous évaluerons le modèle MLP sur la tâche de régression multi-sorties en utilisant une validation croisée répétée de k-fold avec 10 plis et trois répétitions.
Le modèle MLP prédit la probabilité pour chaque étiquette de classe par défaut. Cela signifie qu’il va prédire trois probabilités pour chaque échantillon. Ceux-ci peuvent être convertis en étiquettes de classe nettes en arrondissant les valeurs à 0 ou 1. Nous pouvons ensuite calculer la précision de classification pour les étiquettes de classe crisp.
1
2
3
4
5
6
7
|
…
# faites une prédiction sur l’ensemble de tests
yhat=model.predict(X_test)
# arrondir les probabilités aux étiquettes de classe
yhat=yhat.round()
# calculez la précision
acc =accuracy_score(y_test, yhat)
|
Les scores sont collectés et peuvent être résumés en rapportant la moyenne et l’écart type pour tous les plis de répétition et de validation croisée.
La fonction evaluate_model() ci-dessous prend l’ensemble de données, évalue le modèle et renvoie une liste de scores d’évaluation, dans ce cas, des scores de précision.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# évaluer un modèle à l’aide d’une validation croisée répétée du pli k
def evaluate_model(X, y):
résultats = liste()
n_inputs, n_outputs = X.forme, y. forme
# définir la procédure d’évaluation
cv= RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
# énumérez les plis
pour train_ix, test_ix dans cv.vous pouvez également définir le modèle
X_train, X_test = X, X
y_train, y_test = y, y
# définir le modèle
model = get_model(n_inputs, n_outputs)
# fit modèle
modèle.fit(X_train, y_train, verbeux = 0, époques=100)
# faites une prédiction sur l’ensemble de tests
yhat=model.predict(X_test)
# arrondir les probabilités aux étiquettes de classe
yhat=yhat.round()
# calculez la précision
acc = accuracy_score(y_test, yhat)
# stockez le résultat
print(‘>%.3f’% acc)
résultats.ajouter (acc)
retourner les résultats
|
Nous pouvons ensuite charger notre jeu de données et évaluer le modèle et rapporter la performance moyenne.
En liant ceci, l’exemple complet est répertorié ci-dessous.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
# mlp pour la classification multi-étiquettes
de numpy import moyenne
de numpy import std
de sklearn.les ensembles de données importent make_multilabel_classification
depuis sklearn.model_selection import RepeatedKFold
depuis keras.les modèles importent Séquentiel
de keras.les couches importent Dense
depuis sklearn.les métriques importent accuracy_score
# obtiennent l’ensemble de données
def get_dataset():
X, y = make_multilabel_classification(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
retourne X, y
# récupère le modèle
def get_model(n_inputs, n_outputs) :
model=Sequential()
model.il est possible d’ajouter un modèle (Dense(20, input_dim= n_inputs, kernel_initializer= ‘he_uniform’, activation=’relu’))
.ajouter (Dense(n_outputs, activation = ‘sigmoïde’))
modèle.compile(loss= ‘binary_crossentropy’, optimizer = ‘adam’)
modèle de retour
# évaluez un modèle en utilisant une validation croisée répétée du pli k
def evaluate_model(X, y):
results= list()
n_inputs, n_outputs = X.forme, y.shape
# définir la procédure d’évaluation
cv= RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
# énumérez les plis
pour train_ix, test_ix dans cv.vous pouvez également définir le modèle
X_train, X_test = X, X
y_train, y_test = y, y
# définir le modèle
model = get_model(n_inputs, n_outputs)
# fit modèle
modèle.fit(X_train, y_train, verbeux = 0, époques=100)
# faites une prédiction sur l’ensemble de tests
yhat=model.predict(X_test)
# arrondir les probabilités aux étiquettes de classe
yhat=yhat.round()
# calculez la précision
acc = accuracy_score(y_test, yhat)
# stockez le résultat
print(‘>%.3f’% acc)
résultats.ajouter (acc)
résultats de retour
# charger l’ensemble de données
X, y = get_dataset()
# évaluer le modèle
résultats = evaluate_model(X, y)
# résumer les performances
imprimer (‘Précision: %.3f (%.3f) ‘% (moyenne (résultats), mst (résultats)))
|
L’exécution de l’exemple indique la précision de la classification pour chaque pli et chaque répétition, pour donner une idée de la progression de l’évaluation.
Remarque : Vos résultats peuvent varier en fonction de la nature stochastique de l’algorithme ou de la procédure d’évaluation, ou des différences de précision numérique. Envisagez d’exécuter l’exemple plusieurs fois et comparez le résultat moyen.
À la fin, la précision de la moyenne et de l’écart type est indiquée. Dans ce cas, il est démontré que le modèle atteint une précision d’environ 81, 2%.
Vous pouvez utiliser ce code comme modèle pour évaluer les modèles MLP sur vos propres tâches de classification multi-étiquettes. Le nombre de nœuds et de couches dans le modèle peut facilement être adapté et adapté à la complexité de votre jeu de données.
1
2
3
4
5
6
7
|
…
>0.780
>0.820
>0.790
>0.810
>0.840
Précision: 0.812 (0.032)
|
Une fois qu’une configuration de modèle est choisie, nous pouvons l’utiliser pour ajuster un modèle final sur toutes les données disponibles et faire une prédiction pour de nouvelles données.
L’exemple ci-dessous le démontre en ajustant d’abord le modèle MLP sur l’ensemble des données de classification multi-étiquettes, puis en appelant la fonction predict() sur le modèle enregistré afin de faire une prédiction pour une nouvelle ligne de données.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
# utilisez mlp pour la prédiction sur la classification multi-étiquettes
de numpy import asarray
de sklearn.les ensembles de données importent make_multilabel_classification
depuis keras.les modèles importent Séquentiel
de keras.les couches importent Dense
# obtiennent l’ensemble de données
def get_dataset():
X, y = make_multilabel_classification(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
return X , y
# obtenez le modèle
def get_model(n_inputs, n_outputs):
model=Sequential()
model.il est possible d’ajouter un modèle (Dense(20, input_dim= n_inputs, kernel_initializer= ‘he_uniform’, activation=’relu’))
.ajouter (Dense(n_outputs, activation = ‘sigmoïde’))
modèle.compile (loss= ‘binary_crossentropy’, optimizer = ‘adam’)
modèle de retour
# ensemble de données de charge
X, y = get_dataset()
n_inputs, n_outputs = X.shape, y.shape
# get model
model= get_model(n_inputs, n_outputs)
# ajustez le modèle sur toutes les données
modèle.fit(X, y, verbeux = 0, époques=100)
# faites une prédiction pour les nouvelles données
row=
newX=asarray()
yhat=model.predict(newX)
print(‘Predicted: %s’%yhat)
|
L’exécution de l’exemple correspond au modèle et fait une prédiction pour une nouvelle ligne. Comme prévu, la prédiction contient trois variables de sortie requises pour la tâche de classification multi-étiquettes : les probabilités de chaque étiquette de classe.
1
|
Prédite:
|
Pour en savoir plus
Cette section fournit plus de ressources sur le sujet si vous cherchez à aller plus loin.
- Classification multi-étiquettes, Wikipedia.
- sklearn.jeux de données.API make_multilabel_classification.
- Page d’accueil de Keras.
- sklearn.sélection de modèles.API RepeatedStratifiedKFold.
Résumé
Dans ce tutoriel, vous avez découvert comment développer des modèles d’apprentissage profond pour la classification multi-étiquettes.
Plus précisément, vous avez appris:
- La classification multi-étiquettes est une tâche de modélisation prédictive qui consiste à prédire des étiquettes de classe zéro ou plus mutuellement non exclusives.
- Les modèles de réseaux neuronaux peuvent être configurés pour des tâches de classification multi-étiquettes.
- Comment évaluer un réseau de neurones pour une classification multi-étiquettes et faire une prédiction pour de nouvelles données.
Avez-vous des questions?
Posez vos questions dans les commentaires ci-dessous et je ferai de mon mieux pour y répondre.
Développez des projets d’Apprentissage Profond avec Python !
Et Si Vous Pouviez Développer Un Réseau en Quelques Minutes
…avec seulement quelques lignes de Python
Découvrez comment dans mon nouvel Ebook:
Apprentissage en profondeur avec Python
Il couvre des projets de bout en bout sur des sujets tels que:
Perceptrons Multicouches, Réseaux Convolutionnels et Réseaux Neuronaux récurrents, et plus encore…
Apportez Enfin L’Apprentissage Profond À
Vos Propres Projets
Passez les Universitaires. Juste des résultats.
Voir ce qu’il y a à l’intérieur