Classificazione multi-etichetta con Deep Learning

Tweet Condividi Condividi

Ultimo aggiornamento il 31 agosto 2020

La classificazione multi-etichetta comporta la previsione di zero o più etichette di classe.

A differenza delle normali attività di classificazione in cui le etichette di classe si escludono a vicenda, la classificazione multi-etichetta richiede algoritmi di apprendimento automatico specializzati che supportano la previsione di più classi o “etichette” reciprocamente non esclusive.”

Le reti neurali di apprendimento profondo sono un esempio di un algoritmo che supporta nativamente problemi di classificazione multi-etichetta. I modelli di rete neurale per attività di classificazione multi-etichetta possono essere facilmente definiti e valutati utilizzando la libreria di deep learning Keras.

In questo tutorial, scoprirai come sviluppare modelli di apprendimento profondo per la classificazione multi-etichetta.

Dopo aver completato questo tutorial, saprai:

  • La classificazione multi-etichetta è un’attività di modellazione predittiva che comporta la previsione di zero o più etichette di classe reciprocamente non esclusive.
  • I modelli di rete neurale possono essere configurati per attività di classificazione multi-etichetta.
  • Come valutare una rete neurale per la classificazione multi-etichetta e fare una previsione per nuovi dati.

Iniziamo.

Classificazione multi-etichetta con Deep Learning

Classificazione multi-etichetta con Deep Learning
Foto di Trevor Marron, alcuni diritti riservati.

Panoramica del tutorial

Questo tutorial è diviso in tre parti; sono:

  • Multi-Etichetta di Classificazione
  • Reti Neurali per la Più Etichette
  • Rete Neurale per il Multi-Etichetta di Classificazione

Multi-Etichetta di Classificazione

Classificazione è una modellazione predittiva problema che coinvolge l’output di una etichetta di classe dato qualche input

è diverso dalla regressione compiti che comportano la previsione di un valore numerico.

In genere, un’attività di classificazione comporta la previsione di una singola etichetta. In alternativa, potrebbe comportare la previsione della probabilità su due o più etichette di classe. In questi casi, le classi si escludono a vicenda, il che significa che l’attività di classificazione presuppone che l’input appartenga a una sola classe.

Alcune attività di classificazione richiedono la previsione di più di un’etichetta di classe. Ciò significa che le etichette di classe o l’appartenenza alla classe non si escludono a vicenda. Queste attività sono indicate come classificazione di etichette multiple, o classificazione multi-etichetta in breve.

Nella classificazione multi-etichetta, zero o più etichette sono richieste come output per ogni campione di input e le uscite sono richieste simultaneamente. L’ipotesi è che le etichette di output siano una funzione degli input.

Possiamo creare un set di dati di classificazione multi-etichetta sintetica utilizzando la funzione make_multilabel_classification () nella libreria scikit-learn.

Il nostro set di dati avrà 1.000 campioni con 10 funzioni di input. Il set di dati avrà tre output di etichette di classe per ogni campione e ogni classe avrà uno o due valori (0 o 1, ad esempio presente o non presente).

L’esempio completo di creazione e riepilogo del set di dati di classificazione multi-etichetta sintetica è elencato di seguito.

1
2
3
4
5
6
7
8
9

# esempio di un multi-label attività di classificazione
da sklearn.set di dati di importazione make_multilabel_classification
# define dataset
X, y = make_multilabel_classification(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
# riassumere dataset forma
stampa(X. forma, y.shape)
# riassumi i primi esempi
per i nell’intervallo(10):
stampa (x, y)

L’esecuzione dell’esempio crea il set di dati e riassume la forma degli elementi di input e output.

Possiamo vedere che, come previsto, ci sono 1.000 campioni, ciascuno con 10 caratteristiche di ingresso e tre caratteristiche di uscita.

Le prime 10 righe di input e output sono riassunte e possiamo vedere che tutti gli input per questo set di dati sono numerici e che le etichette di classe di output hanno 0 o 1 valori per ciascuna delle tre etichette di classe.

1
2
3
4
5
6
7
8
9
10
11
12

(1000, 10) (1000, 3)

a quel punto, diamo un’occhiata a come siamo in grado di sviluppare modelli di reti neurali per il multi-label attività di classificazione.

Reti neurali per etichette multiple

Alcuni algoritmi di apprendimento automatico supportano la classificazione multi-etichetta in modo nativo.

I modelli di rete neurale possono essere configurati per supportare la classificazione multi-etichetta e possono funzionare bene, a seconda delle specifiche dell’attività di classificazione.

La classificazione multi-etichetta può essere supportata direttamente dalle reti neurali semplicemente specificando il numero di etichette di destinazione presenti nel problema come il numero di nodi nel livello di output. Ad esempio, un’attività con tre etichette di output (classi) richiederà un livello di output della rete neurale con tre nodi nel livello di output.

Ogni nodo nel livello di output deve utilizzare l’attivazione sigmoid. Questo predicerà una probabilità di appartenenza alla classe per l’etichetta, un valore compreso tra 0 e 1. Infine, il modello deve essere in forma con la funzione di perdita di cross-entropia binaria.

In sintesi, per configurare un modello di rete neurale per la classificazione multi-etichetta, le specifiche sono:

  • Il numero di nodi nel livello di output corrisponde al numero di etichette.
  • Attivazione Sigmoid per ogni nodo nel livello di output.
  • Binario cross-entropia funzione di perdita.

Possiamo dimostrarlo usando la libreria di deep learning Keras.

Definiremo un modello Multilayer Perceptron (MLP) per l’attività di classificazione multi-etichetta definita nella sezione precedente.

Ogni campione ha 10 input e tre output; pertanto, la rete richiede un livello di input che prevede 10 input specificati tramite l’argomento “input_dim” nel primo livello nascosto e tre nodi nel livello di output.

Useremo la popolare funzione di attivazione ReLU nel livello nascosto. Il livello nascosto ha 20 nodi che sono stati scelti dopo alcuni tentativi ed errori. Inseriremo il modello usando la perdita di entropia incrociata binaria e la versione Adam della discesa del gradiente stocastico.

La definizione della rete per l’attività di classificazione multi-etichetta è elencata di seguito.

1
2
3
4
5

# definire il modello
modello = Sequenziale()
modello.aggiungi (Denso (20, input_dim=n_inputs, kernel_initializer=’he_uniform’, activation=’relu’))
modello.add (Dense (n_outputs, activation=’sigmoid’))
modello.compile (loss= ‘binary_crossentropy’, optimizer= ‘adam’)

Potresti voler adattare questo modello per la tua attività di classificazione multi-etichetta; pertanto, possiamo creare una funzione per definire e restituire il modello in cui il numero di variabili di input e output è fornito come argomenti.

1
2
3
4
5
6
7

# il modello
def get_model(n_inputs, n_outputs):
modello = Sequenziale()
modello.aggiungi (Denso (20, input_dim=n_inputs, kernel_initializer=’he_uniform’, activation=’relu’))
modello.add (Dense (n_outputs, activation=’sigmoid’))
modello.compile (loss= ‘binary_crossentropy’, optimizer= ‘adam’)
modello di ritorno

Ora che abbiamo familiarità con come definire un MLP per la classificazione multi-etichetta, esploriamo come questo modello può essere valutato.

Rete neurale per la classificazione multi-etichetta

Se il set di dati è piccolo, è buona norma valutare ripetutamente i modelli di rete neurale sullo stesso set di dati e riportare le prestazioni medie tra le ripetizioni.

Ciò è dovuto alla natura stocastica dell’algoritmo di apprendimento.

Inoltre, è buona norma utilizzare la convalida incrociata di k-fold invece delle divisioni train/test di un set di dati per ottenere una stima imparziale delle prestazioni del modello quando si effettuano previsioni su nuovi dati. Anche in questo caso, solo se non ci sono troppi dati che il processo può essere completato in un tempo ragionevole.

Tenendo conto di ciò, valuteremo il modello MLP sull’attività di regressione multi-output utilizzando la convalida incrociata ripetuta di k-fold con 10 pieghe e tre ripetizioni.

Il modello MLP predirà la probabilità per ogni etichetta di classe per impostazione predefinita. Ciò significa che predirà tre probabilità per ogni campione. Questi possono essere convertiti in etichette di classe nitide arrotondando i valori a 0 o 1. Possiamo quindi calcolare l’accuratezza della classificazione per le etichette di classe crisp.

1
2
3
4
5
6
7

# fai una previsione sul set di test
yhat = model.predict (X_test)
# probabilità arrotondate alle etichette di classe
yhat = yhat.round()
# calcola la precisione
acc = accuracy_score (y_test, yhat)

I punteggi sono raccolti e possono essere riassunti riportando la media e la deviazione standard in tutte le ripetizioni e le pieghe di convalida incrociata.

La funzione evaluate_model () di seguito prende il set di dati, valuta il modello e restituisce un elenco di punteggi di valutazione, in questo caso, punteggi di precisione.

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

# valutare un modello di utilizzo ripetuto k-fold cross-validation
def evaluate_model(X, y):
risultati = list()
n_inputs, n_outputs = X. forma, y.forma
# define procedura di valutazione
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
# enumerare le pieghe
per train_ix, test_ix in cv.split(X):
# prepara i dati
X_train, X_test = X, X
y_train, y_test = y, y
# define model
model = get_model(n_inputs, n_outputs)
# fit modello
modello.fit (X_train, y_train, verbose=0, epoche=100)
# fare una previsione sul set di test
yhat = modello.predict (X_test)
# probabilità arrotondate alle etichette di classe
yhat = yhat.round ()
# calcola la precisione
acc = accuracy_score(y_test, yhat)
# memorizza il risultato
stampa(‘>%.3f ‘ % acc)
risultati.append (acc)
restituisce risultati

Possiamo quindi caricare il nostro set di dati e valutare il modello e segnalare le prestazioni medie.

Legando questo insieme, l’esempio completo è elencato di seguito.

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 per il multi-etichetta di classificazione
da import numpy media
da import numpy std
da sklearn.i set di dati importano make_multilabel_classification
da sklearn.model_selection importa RepeatedKFold
da keras.i modelli importano Sequenziale
da keras.i livelli importano denso
da sklearn.metriche di importazione accuracy_score
# ottenere il set di dati
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
# il modello
def get_model(n_inputs, n_outputs):
modello = Sequenziale()
modello.aggiungi (Denso (20, input_dim=n_inputs, kernel_initializer=’he_uniform’, activation=’relu’))
modello.add (Dense (n_outputs, activation=’sigmoid’))
modello.compile(loss=’binary_crossentropy’, optimizer=’adam’)
return model
# evaluate un modello usando la convalida incrociata ripetuta di k-fold
def evaluate_model(X, y):
results = list()
n_inputs, n_outputs = X. forma, y.shape
# define evaluation procedure
cv = RepeatedKFold(n_splits=10, n_repeats = 3, random_state=1)
# enumerare pieghe
per train_ix, test_ix in cv.split(X):
# prepara i dati
X_train, X_test = X, X
y_train, y_test = y, y
# define model
model = get_model(n_inputs, n_outputs)
# fit modello
modello.fit (X_train, y_train, verbose=0, epoche=100)
# fare una previsione sul set di test
yhat = modello.predict (X_test)
# probabilità arrotondate alle etichette di classe
yhat = yhat.round ()
# calcola la precisione
acc = accuracy_score(y_test, yhat)
# memorizza il risultato
stampa(‘>%.3f ‘ % acc)
risultati.append(acc)
restituisce risultati
# carica dataset
X, y = get_dataset()
# valuta modello
risultati = evaluate_model(X, y)
# riassume le prestazioni
stampa(‘Precisione: %.3f (%.3f) ‘ % (media (risultati), std (risultati)))

L’esecuzione dell’esempio riporta l’accuratezza della classificazione per ogni piega e ogni ripetizione, per dare un’idea dello stato di avanzamento della valutazione.

Nota: I risultati possono variare data la natura stocastica dell’algoritmo o della procedura di valutazione, o differenze nella precisione numerica. Considerare l’esecuzione dell’esempio alcune volte e confrontare il risultato medio.

Alla fine, viene riportata la precisione media e la deviazione standard. In questo caso, viene mostrato che il modello raggiunge una precisione di circa l ‘ 81,2 percento.

È possibile utilizzare questo codice come modello per valutare i modelli MLP nelle proprie attività di classificazione multi-etichetta. Il numero di nodi e livelli nel modello può essere facilmente adattato e adattato alla complessità del set di dati.

1
2
3
4
5
6
7

>0.780
>0.820
>0.790
>0.810
>0.840
Precisione: 0.812 (0.032)

Una volta scelta una configurazione del modello, possiamo usarla per adattare un modello finale a tutti i dati disponibili e fare una previsione per nuovi dati.

L’esempio seguente lo dimostra adattando prima il modello MLP sull’intero set di dati di classificazione multi-etichetta, quindi chiamando la funzione predict() sul modello salvato per fare una previsione per una nuova riga di dati.

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

# utilizzare mlp per la stima sulla classificazione multi-etichetta
da numpy importa asarray
da sklearn.i set di dati importano make_multilabel_classification
da keras.i modelli importano Sequenziale
da keras.livelli di importazione Denso
# ottenere il set di dati
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
# il modello
def get_model(n_inputs, n_outputs):
modello = Sequenziale()
modello.aggiungi (Denso (20, input_dim=n_inputs, kernel_initializer=’he_uniform’, activation=’relu’))
modello.add (Dense (n_outputs, activation=’sigmoid’))
modello.compilare(perdita=’binary_crossentropy’, un ottimizzatore=’adam’)
ritorno modello
# caricare il dataset
X, y = get_dataset()
n_inputs, n_outputs = X. forma, y.forma
# prendi un modello
modello = get_model(n_inputs, n_outputs)
# adattare il modello su tutti i dati
modello.fit (X, y, verbose=0, epoche=100)
# fare una previsione per i nuovi dati
row =
newX = asarray ()
yhat = model.predict (newX)
print (‘Previsto:% s’ % yhat)

L’esecuzione dell’esempio si adatta al modello e fa una previsione per una nuova riga. Come previsto, la previsione contiene tre variabili di output necessarie per l’attività di classificazione multi-etichetta: le probabilità di ciascuna etichetta di classe.

1
Previsto:

Ulteriore Lettura

in Questa sezione fornisce ulteriori risorse sull’argomento, se si sta cercando di andare più in profondità.

  • Classificazione multi-etichetta, Wikipedia.
  • sklearn.set di dati.API make_multilabel_classification.
  • Homepage di Keras.
  • sklearn.model_selection.RepeatedStratifiedKFold API.

Sommario

In questo tutorial, hai scoperto come sviluppare modelli di apprendimento profondo per la classificazione multi-etichetta.

In particolare, hai imparato:

  • La classificazione multi-etichetta è un’attività di modellazione predittiva che comporta la previsione di zero o più etichette di classe reciprocamente non esclusive.
  • I modelli di rete neurale possono essere configurati per attività di classificazione multi-etichetta.
  • Come valutare una rete neurale per la classificazione multi-etichetta e fare una previsione per nuovi dati.

Avete domande?
Fai le tue domande nei commenti qui sotto e farò del mio meglio per rispondere.

Sviluppare progetti di apprendimento profondo con Python!

Deep Learning con Python

E se si potesse sviluppare una rete in pochi minuti

…con poche righe di Python

Scopri come nel mio nuovo Ebook:
Deep Learning With Python

Copre progetti end-to-end su argomenti come:
Percettori multistrato, reti convoluzionali e reti neurali ricorrenti e altro ancora…

Infine Portare Deep Learning a
I propri progetti

Salta gli accademici. Solo risultati.

Vedere cosa c’è dentro

Tweet Condividi Condividi



+