Trovare il giusto equilibrio comprendere l’underfitting e l’overfitting nei modelli di apprendimento automatico
Equilibrio tra underfitting e overfitting nei modelli di apprendimento automatico
Questo articolo spiegherà il concetto di overfitting e underfitting dalla prospettiva dell’apprendimento automatico e dell’apprendimento profondo.
Vedere l’underfitting e l’overfitting come un problema
Ogni persona che lavora su un problema di apprendimento automatico desidera che il suo modello funzioni nel modo più ottimale possibile. Ma ci sono momenti in cui il modello potrebbe non funzionare come vorremmo. Potrebbe avere un’accuratezza peggiore o migliore rispetto all’ideale. Nell’apprendimento automatico, entrambi questi casi sono considerati un problema.
Alcune persone potrebbero chiedersi perché un’accuratezza inferiore all’ideale venga considerata un problema. Questo accade quando il nostro modello cerca di trovare una relazione in cose prive di significato, come delle caratteristiche non necessarie o del rumore nei dati. Cerchiamo di capire meglio con un esempio.
Supponiamo che stiamo addestrando un modello per prevedere lo stipendio di una persona. Per questo problema, i nostri dati presentano quattro caratteristiche: il nome della persona, la sua istruzione, la sua esperienza e le sue competenze. Sulla base del buon senso, sappiamo che il nome della persona non è un fattore che influisce sullo stipendio. Ma nonostante questo fatto, se utilizziamo il nome della persona come una delle caratteristiche nei nostri dati, il nostro modello potrebbe cercare di trovare una qualche relazione tra il nome e lo stipendio. Questo tipo di relazione potrebbe aggiungere un’accuratezza extra al nostro modello. Ciò causa un’accuratezza superiore all’ideale e, in questi casi, il nostro modello viene addestrato in modo errato.
- Sii sicuro dei tuoi modelli di Machine Learning con l’aiuto della Cross-Validation
- Conoscere le diverse misure di performance per il problema di classificazione del Machine Learning
- Esplora intuitivamente le metriche R2 e R2 corretto
Terminologie di base
Prima di approfondire gli argomenti, cerchiamo di capire due diversi tipi di errori che sono necessari per comprendere l’underfitting e l’overfitting.
- Errore di bias: L’errore di bias è essenzialmente un errore che troviamo utilizzando i dati di addestramento e un modello addestrato. In altre parole, qui stiamo trovando l’errore utilizzando gli stessi dati utilizzati per addestrare il modello. Un errore può essere qualsiasi tipo di errore, come l’errore quadratico medio, l’errore assoluto medio, ecc.
- Errore di varianza: L’errore di varianza è un errore che troviamo utilizzando i dati di test e un modello addestrato. Anche qui, l’errore può essere di qualsiasi tipo. Anche se possiamo utilizzare qualsiasi tipo di errore per trovare la varianza, utilizziamo lo stesso errore che abbiamo utilizzato per trovare il bias perché in questo modo possiamo confrontare i valori di bias e varianza.
Si noti che la condizione ideale del nostro modello addestrato è avere un bias basso e una varianza bassa.
Cosa sono l’overfitting e l’underfitting nella vita di tutti i giorni?
Supponiamo che tu stia visitando un paese straniero e il tassista ti truffi. Potresti essere tentato di dire che tutti i tassisti in quel paese sono avidi. Questo è ciò che chiamiamo sovrageneralizzazione.
La sovrageneralizzazione può verificarsi anche nei nostri modelli di apprendimento automatico e profondo addestrati. La sovrageneralizzazione nel caso dell’apprendimento automatico e profondo è nota come overfitting del modello.
Allo stesso modo, la sotto-generalizzazione è nota come underfitting del modello.
Cosa significa overfitting da una prospettiva di apprendimento automatico?
Diciamo che il nostro modello soffre di overfitting se ha un bias basso e una varianza alta.
L’overfitting si verifica quando il modello è troppo complesso rispetto alla quantità e alla rumorosità dei dati di addestramento.
Possibili soluzioni al problema dell’overfitting
- Semplifica il modello in uno dei seguenti modi:
Scegli un modello di apprendimento automatico con meno parametri
Riduci le caratteristiche o le colonne utilizzate per addestrare il modello di apprendimento automatico
Limita il modello (utilizzando metodi di regolarizzazione)
2. Raccogli più dati di addestramento.
3. Riduci il rumore nei dati. Il rumore potrebbe essere rappresentato da errori nei dati o dalla presenza di valori anomali, ecc.
4. Utilizza l’arresto anticipato
Cosa significa underfitting?
L’underfitting si verifica quando un modello di apprendimento automatico non è in grado di catturare una relazione tra le nostre caratteristiche indipendenti e dipendenti. In altre parole, in caso di underfitting, il nostro modello ci darà un alto bias e alta varianza. Ci potrebbero essere diverse ragioni dietro questo.
Possibili soluzioni a un problema di underfitting
- Utilizzare un modello più complesso che possa catturare la relazione tra le caratteristiche indipendenti e dipendenti.
- Rilassare i vincoli sul modello, cioè ridurre la regolarizzazione.
- Cercare di ottenere più dati di addestramento.
- Cercare di aumentare la durata dell’addestramento del modello. Ciò può essere fatto addestrando il modello per più epoche.
- Cercare di pulire i dati per ridurre il rumore.
Vediamo come appare l’overfitting e l’underfitting utilizzando alcuni grafici
Utilizziamo il dataset di qualità del vino rosso per comprendere i concetti di underfitting e overfitting.
Underfitting:
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snssns.set_style('darkgrid')from sklearn.model_selection import train_test_splitimport tensorflow.keras.layers as tflfrom tensorflow.keras.models import Model## Leggere i datiwine = pd.read_csv('wine.csv')## Separare i dati in caratteristiche indipendenti e dipendentiX = wine.drop('quality',axis=1)y = wine['quality']## Separare i dati in addestramento e testX_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y)## Creare un modelloinput = tfl.Input(shape=X.shape[1:])hidden1 = tfl.Dense(6,activation='relu')(input)output = tfl.Dense(10, activation='softmax')(hidden1)model = Model(inputs=[input], outputs=[output])## Compilare il modellomodel.compile(optimizer='adam',loss='sparse_categorical_crossentropy', metrics=['accuracy'])## Addestrare il modello utilizzando il set di addestramento e testhistory = model.fit(X_train, y_train, epochs=150, validation_data=(X_test, y_test))## Visualizzare l'accuratezza di addestramento e testplt.plot(history.history['accuracy'],color='red',label='accuratezza di addestramento')plt.plot(history.history['val_accuracy'],color='blue',label='accuratezza di test')plt.legend()plt.show()
Osserva il grafico sopra. Possiamo vedere che l’accuratezza del modello di addestramento sia sui dati di addestramento che sui dati di test è inferiore al 55%, che è piuttosto basso. Quindi il nostro modello, in questo caso, sta affrontando il problema dell’underfitting. Questo si verifica a causa della semplicità del modello.
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snssns.set_style('darkgrid')from sklearn.model_selection import train_test_splitimport tensorflow.keras.layers as tflfrom tensorflow.keras.models import Model## Leggere i datiwine = pd.read_csv('wine.csv')## Separare i dati in caratteristiche indipendenti e dipendentiX = wine.drop('quality',axis=1)y = wine['quality']## Separare i dati in addestramento e testX_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y)## Creare un modelloinput = tfl.Input(shape=X.shape[1:])hidden1 = tfl.Dense(100,activation='relu')(input)hidden2 = tfl.Dense(100, activation='relu')(hidden1)hidden3 = tfl.Dense(100, activation='relu')(hidden2)hidden4 = tfl.Dense(100, activation='relu')(hidden3)output = tfl.Dense(10, activation='softmax')(hidden4)model = Model(inputs=[input], outputs=[output])## Compilare il modellomodel.compile(optimizer='adam',loss='sparse_categorical_crossentropy', metrics=['accuracy'])## Addestrare il modello utilizzando il set di addestramento e testhistory = model.fit(X_train, y_train, epochs=150, validation_data=(X_test, y_test))## Visualizzare l'accuratezza di addestramento e testplt.plot(history.history['accuracy'],color='red',label='accuratezza di addestramento')plt.plot(history.history['val_accuracy'],color='blue',label='accuratezza di test')plt.legend()plt.show()

Dopo aver osservato il grafico sopra, si può notare che lo spazio tra i due grafici si sta ampliando mano a mano che ci si sposta verso il lato sinistro (cioè aumentando gli epoch). Ciò significa che aumentando gli epoch per cui viene eseguito il training, l’accuratezza del training aumenta mentre l’accuratezza del test no. Questo tipo di situazione è considerato un overfitting. Questo tipo di modello non generalizza bene su test e su nuovi dati.
Dobbiamo allenare il modello in modo tale che fornisca un’accuratezza sufficientemente buona sia sui dati di training che sui dati di test. Questo modello si troverà sulla linea di mezzo tra underfitting e overfitting.
Spero che l’articolo ti piaccia. Se hai qualche pensiero sull’articolo, fammelo sapere. Ogni feedback costruttivo è molto apprezzato.
Collegati con me su LinkedIn.
Scrivimi a [email protected]
Buona giornata!