CNTK - Misurazione delle prestazioni
Questo capitolo spiegherà come misurare le prestazioni del modello in CNKT.
Strategia per convalidare le prestazioni del modello
Dopo aver creato un modello ML, lo addestravamo utilizzando una serie di campioni di dati. Grazie a questa formazione il nostro modello ML apprende e ricava alcune regole generali. Le prestazioni del modello ML sono importanti quando alimentiamo nuovi campioni, ovvero campioni diversi da quelli forniti al momento della formazione, al modello. Il modello si comporta diversamente in quel caso. Potrebbe essere peggio fare una buona previsione su quei nuovi campioni.
Ma il modello deve funzionare bene anche per i nuovi campioni perché nell'ambiente di produzione riceveremo input diversi da quelli utilizzati per i dati di esempio a scopo di addestramento. Questo è il motivo per cui dovremmo convalidare il modello ML utilizzando una serie di campioni diversi da quelli che abbiamo utilizzato per scopi di formazione. Qui discuteremo due diverse tecniche per la creazione di un set di dati per la convalida di un NN.
Set di dati di controllo
È uno dei metodi più semplici per creare un set di dati per convalidare un NN. Come suggerisce il nome, in questo metodo tratterremo un set di campioni dall'addestramento (diciamo il 20%) e lo utilizzeremo per testare le prestazioni del nostro modello ML. Il diagramma seguente mostra il rapporto tra addestramento e campioni di convalida -
Il modello del set di dati di Hold-out garantisce che abbiamo dati sufficienti per addestrare il nostro modello ML e allo stesso tempo avremo un numero ragionevole di campioni per ottenere una buona misurazione delle prestazioni del modello.
Per includerli nel set di addestramento e nel set di test, è buona norma scegliere campioni casuali dal set di dati principale. Assicura una distribuzione uniforme tra training e test set.
Di seguito è riportato un esempio in cui stiamo producendo un proprio set di dati di controllo utilizzando train_test_split funzione dal scikit-learn biblioteca.
Esempio
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
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=1)
# Here above test_size = 0.2 represents that we provided 20% of the data as test data.
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
classifier_knn = KNeighborsClassifier(n_neighbors=3)
classifier_knn.fit(X_train, y_train)
y_pred = classifier_knn.predict(X_test)
# Providing sample data and the model will make prediction out of that data
sample = [[5, 5, 3, 2], [2, 4, 3, 5]]
preds = classifier_knn.predict(sample)
pred_species = [iris.target_names[p] for p in preds] print("Predictions:", pred_species)
Produzione
Predictions: ['versicolor', 'virginica']
Durante l'utilizzo di CNTK, dobbiamo randomizzare l'ordine del nostro set di dati ogni volta che addestriamo il nostro modello perché:
Gli algoritmi di deep learning sono fortemente influenzati dai generatori di numeri casuali.
L'ordine in cui forniamo i campioni a NN durante l'addestramento influisce notevolmente sulle sue prestazioni.
Il principale svantaggio dell'utilizzo della tecnica del set di dati di controllo è che non è affidabile perché a volte otteniamo risultati molto buoni, ma a volte otteniamo risultati negativi.
Convalida incrociata K-fold
Per rendere il nostro modello ML più affidabile, esiste una tecnica chiamata K-fold cross validation. In natura, la tecnica di convalida incrociata K-fold è la stessa della tecnica precedente, ma la ripete più volte, di solito da 5 a 10 volte. Il diagramma seguente ne rappresenta il concetto:
Lavorazione di K-fold cross validation
Il funzionamento della convalida incrociata K-fold può essere compreso con l'aiuto dei seguenti passaggi:
Step 1- Come nella tecnica del set di dati di Hand-out, nella tecnica di convalida incrociata K-fold, per prima cosa dobbiamo suddividere il set di dati in un set di addestramento e test. Idealmente, il rapporto è 80-20, ovvero l'80% del set di allenamento e il 20% del set di test.
Step 2 - Successivamente, dobbiamo addestrare il nostro modello utilizzando il set di addestramento.
Step 3- Infine, utilizzeremo il set di test per misurare le prestazioni del nostro modello. L'unica differenza tra la tecnica del set di dati di Hold-out e la tecnica di convalida k-cross è che il processo di cui sopra viene ripetuto di solito da 5 a 10 volte e alla fine la media viene calcolata su tutte le metriche delle prestazioni. Quella media sarebbe la metrica finale delle prestazioni.
Vediamo un esempio con un piccolo set di dati:
Esempio
from numpy import array
from sklearn.model_selection import KFold
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
kfold = KFold(5, True, 1)
for train, test in kfold.split(data):
print('train: %s, test: %s' % (data[train],(data[test]))
Produzione
train: [0.1 0.2 0.4 0.5 0.6 0.7 0.8 0.9], test: [0.3 1. ]
train: [0.1 0.2 0.3 0.4 0.6 0.8 0.9 1. ], test: [0.5 0.7]
train: [0.2 0.3 0.5 0.6 0.7 0.8 0.9 1. ], test: [0.1 0.4]
train: [0.1 0.3 0.4 0.5 0.6 0.7 0.9 1. ], test: [0.2 0.8]
train: [0.1 0.2 0.3 0.4 0.5 0.7 0.8 1. ], test: [0.6 0.9]
Come vediamo, a causa dell'utilizzo di uno scenario di test e addestramento più realistico, la tecnica di convalida incrociata k-fold ci offre una misurazione delle prestazioni molto più stabile ma, al contrario, richiede molto tempo per la convalida dei modelli di deep learning.
CNTK non supporta la convalida k-cross, quindi dobbiamo scrivere il nostro script per farlo.
Rilevamento di underfitting e overfitting
Indipendentemente dal fatto che utilizziamo il set di dati di Hand-out o la tecnica di convalida incrociata k-fold, scopriremo che l'output per le metriche sarà diverso per il set di dati utilizzato per l'addestramento e per il set di dati utilizzato per la convalida.
Rilevamento dell'overfitting
Il fenomeno chiamato overfitting è una situazione in cui il nostro modello ML, modella i dati di addestramento eccezionalmente bene, ma non riesce a funzionare bene sui dati di test, ovvero non è stato in grado di prevedere i dati di test.
Accade quando un modello ML apprende uno schema e un rumore specifici dai dati di addestramento in misura tale da influire negativamente sulla capacità di quel modello di generalizzare dai dati di addestramento a dati nuovi, cioè non visti. Qui, il rumore è l'informazione irrilevante o la casualità in un set di dati.
Di seguito sono riportati i due modi con cui possiamo rilevare se il nostro modello è troppo adatto o meno:
Il modello overfit funzionerà bene sugli stessi campioni che abbiamo usato per l'allenamento, ma si esibirà molto male sui nuovi campioni, cioè campioni diversi dall'addestramento.
Il modello è sovradimensionato durante la convalida se la metrica sul set di test è inferiore alla stessa metrica che usiamo nel nostro set di addestramento.
Rilevamento di underfitting
Un'altra situazione che può verificarsi nel nostro ML è l'underfitting. Questa è una situazione in cui il nostro modello ML non ha modellato bene i dati di addestramento e non riesce a prevedere l'output utile. Quando iniziamo ad allenarci nella prima epoca, il nostro modello sarà sottodimensionato, ma diventerà meno sottoadatto man mano che l'allenamento progredisce.
Uno dei modi per rilevare se il nostro modello è inadeguato o meno è esaminare le metriche per il set di allenamento e il set di test. Il nostro modello sarà sottoadattamento se la metrica sul set di test è superiore alla metrica sul set di addestramento.