CNTK - Modello di classificazione

Questo capitolo ti aiuterà a capire come misurare le prestazioni del modello di classificazione in CNTK. Cominciamo con la matrice di confusione.

Matrice di confusione

Matrice di confusione: una tabella con l'output previsto rispetto all'output atteso è il modo più semplice per misurare le prestazioni di un problema di classificazione, in cui l'output può essere di due o più tipi di classi.

Per capire come funziona, creeremo una matrice di confusione per un modello di classificazione binaria che prevede se una transazione con carta di credito era normale o una frode. È mostrato come segue:

Frodi effettive Normale reale

Predicted fraud

Vero positivo

Falso positivo

Predicted normal

Falso negativo

Vero negativo

Come possiamo vedere, la matrice di confusione di esempio sopra contiene 2 colonne, una per la frode di classe e l'altra per la classe normale. Allo stesso modo abbiamo 2 righe, una viene aggiunta per la frode di classe e l'altra viene aggiunta per la classe normale. Di seguito è riportata la spiegazione dei termini associati alla matrice di confusione:

  • True Positives - Quando sia la classe effettiva che la classe prevista del punto dati sono 1.

  • True Negatives - Quando sia la classe effettiva che la classe prevista del punto dati sono 0.

  • False Positives - Quando la classe effettiva del punto dati è 0 e la classe prevista del punto dati è 1.

  • False Negatives - Quando la classe effettiva del punto dati è 1 e la classe prevista del punto dati è 0.

Vediamo, come possiamo calcolare il numero di cose diverse dalla matrice di confusione -

  • Accuracy- È il numero di previsioni corrette fatte dal nostro modello di classificazione ML. Può essere calcolato con l'aiuto della seguente formula:

  • Precision- Ci dice quanti campioni sono stati previsti correttamente su tutti i campioni che abbiamo previsto. Può essere calcolato con l'aiuto della seguente formula:

  • Recall or Sensitivity- I richiami sono il numero di positivi restituiti dal nostro modello di classificazione ML. In altre parole, ci dice quanti dei casi di frode nel set di dati sono stati effettivamente rilevati dal modello. Può essere calcolato con l'aiuto della seguente formula:

  • Specificity- Opposto al richiamo, fornisce il numero di negativi restituiti dal nostro modello di classificazione ML. Può essere calcolato con l'aiuto della seguente formula:

Misura F.

Possiamo usare la misura F come alternativa alla matrice di confusione. La ragione principale alla base di questo, non possiamo massimizzare Recall e Precision allo stesso tempo. Esiste una relazione molto forte tra queste metriche e ciò può essere compreso con l'aiuto del seguente esempio:

Supponiamo di voler utilizzare un modello DL per classificare i campioni di cellule come cancerosi o normali. Qui, per raggiungere la massima precisione, dobbiamo ridurre il numero di previsioni a 1. Anche se questo può darci una precisione del 100% circa, ma il richiamo diventerà molto basso.

D'altra parte, se vogliamo raggiungere il massimo richiamo, dobbiamo fare quante più previsioni possibili. Anche se questo può darci una capacità di richiamo di circa il 100%, la precisione diventerà davvero bassa.

In pratica, dobbiamo trovare un modo per bilanciare precisione e richiamo. La metrica F-measure ci consente di farlo, in quanto esprime una media armonica tra precisione e richiamo.

Questa formula è chiamata misura F1, dove il termine aggiuntivo chiamato B è impostato su 1 per ottenere un rapporto uguale di precisione e richiamo. Per enfatizzare il richiamo, possiamo impostare il fattore B su 2. D'altra parte, per enfatizzare la precisione, possiamo impostare il fattore B su 0,5.

Utilizzo di CNTK per misurare le prestazioni di classificazione

Nella sezione precedente abbiamo creato un modello di classificazione utilizzando il set di dati del fiore Iris. Qui, misureremo le sue prestazioni utilizzando la matrice di confusione e la metrica di misura F.

Creazione della matrice di confusione

Abbiamo già creato il modello, quindi possiamo avviare il processo di convalida, che include confusion matrix, sullo stesso. Per prima cosa, creeremo una matrice di confusione con l'aiuto diconfusion_matrix funzione da scikit-learn. Per questo, abbiamo bisogno delle etichette reali per i nostri campioni di prova e delle etichette previste per gli stessi campioni di prova.

Calcoliamo la matrice di confusione utilizzando il seguente codice Python:

from sklearn.metrics import confusion_matrix
y_true = np.argmax(y_test, axis=1)
y_pred = np.argmax(z(X_test), axis=1)
matrix = confusion_matrix(y_true=y_true, y_pred=y_pred)
print(matrix)

Produzione

[[10 0 0]
[ 0 1 9]
[ 0 0 10]]

Possiamo anche usare la funzione heatmap per visualizzare una matrice di confusione come segue:

import seaborn as sns
import matplotlib.pyplot as plt
g = sns.heatmap(matrix,
     annot=True,
     xticklabels=label_encoder.classes_.tolist(),
     yticklabels=label_encoder.classes_.tolist(),
     cmap='Blues')
g.set_yticklabels(g.get_yticklabels(), rotation=0)
plt.show()

Dovremmo anche avere un unico numero di prestazioni, che possiamo usare per confrontare il modello. Per questo, dobbiamo calcolare l'errore di classificazione utilizzandoclassification_error funzione, dal pacchetto metriche in CNTK come fatto durante la creazione del modello di classificazione.

Ora per calcolare l'errore di classificazione, eseguire il metodo di test sulla funzione di perdita con un set di dati. Dopodiché, CNTK prenderà i campioni che abbiamo fornito come input per questa funzione e farà una previsione basata sulle funzionalità di input X_test.

loss.test([X_test, y_test])

Produzione

{'metric': 0.36666666666, 'samples': 30}

Implementazione delle misure F.

Per l'implementazione di F-Measures, CNTK include anche una funzione chiamata fmeasures. Possiamo usare questa funzione, mentre addestriamo l'NN sostituendo la cellacntk.metrics.classification_error, con una chiamata a cntk.losses.fmeasure quando si definisce la funzione di fabbrica del criterio come segue:

import cntk
@cntk.Function
def criterion_factory(output, target):
   loss = cntk.losses.cross_entropy_with_softmax(output, target)
metric = cntk.losses.fmeasure(output, target)
   return loss, metric

Dopo aver utilizzato la funzione cntk.losses.fmeasure, otterremo un output diverso per il file loss.test chiamata al metodo data come segue -

loss.test([X_test, y_test])

Produzione

{'metric': 0.83101488749, 'samples': 30}