Robusta codifica One-Hot.  Codifica one-hot di livello produttivo… |  di Hans Christian Ekne |  Aprile 2024

 | Intelligenza-Artificiale

Il modo in cui costruiamo modelli tradizionali di machine learning consiste nell'addestrare prima i modelli su un “set di dati di addestramento” (tipicamente un set di dati di valori storici) e successivamente generare previsioni su un nuovo set di dati, il “set di dati di inferenza”. “Se le colonne del set di dati di addestramento e del set di dati di inferenza non corrispondono, l'algoritmo di machine learning in genere fallirà. Ciò è dovuto principalmente a livelli di fattore mancanti o nuovi nel set di dati di inferenza.

Il primo problema: fattori mancanti

Per gli esempi seguenti, presupponi di aver utilizzato il set di dati sopra per addestrare il tuo modello di machine learning. Hai codificato a caldo il set di dati in variabili fittizie e i tuoi dati di addestramento completamente trasformati appaiono come di seguito:

Set di dati di addestramento trasformato con pd.get_dummies / immagine per autore

Ora introduciamo il set di dati di inferenza, questo è ciò che utilizzeresti per fare previsioni. Diciamo che è dato come di seguito:

# Creating the inference_data DataFrame in Python
inference_data = pd.DataFrame({
'numerical_1': (11, 12, 13, 14, 15, 16, 17, 18),
'color_1_': ('black', 'blue', 'black', 'green',
'green', 'black', 'black', 'blue'),
'color_2_': ('orange', 'orange', 'black', 'orange',
'black', 'orange', 'orange', 'orange')
})
Dati di inferenza con 3 colonne/immagine per autore

Usando un'ingenua strategia di codifica one-hot come quella usata sopra (pd.get_dummies)

# Converting categorical columns in inference_data to 
# Dummy variables with integers
inference_data_dummies = pd.get_dummies(inference_data,
columns=('color_1_', 'color_2_')).astype(int)

Ciò trasformerebbe il tuo set di dati di inferenza nello stesso modo e otterrai il set di dati di seguito:

Set di dati di inferenza trasformato con pd.get_dummies / immagine per autore

Noti i problemi? Il primo problema è che nel set di dati di inferenza mancano le colonne:

missing_colmns =('color_1__red', 'color_2__pink', 
'color_2__blue', 'color_2__purple')

Se lo eseguissi in un modello addestrato con il “set di dati di addestramento”, di solito si bloccherebbe.

Il secondo problema: nuovi fattori

L'altro problema che può verificarsi con la codifica one-hot è se il set di dati di inferenza include fattori nuovi e invisibili. Consideriamo nuovamente gli stessi set di dati di cui sopra. Se esamini attentamente, vedi che il set di dati di inferenza ora ha una nuova colonna: color_2__orange.

Questo è il problema opposto a quello precedente e il nostro set di dati di inferenza contiene nuove colonne che il nostro set di dati di addestramento non aveva. Questo è in realtà un evento comune e può verificarsi se una delle variabili fattore ha subito modifiche. Ad esempio, se i colori sopra rappresentano i colori di un'auto e un produttore di automobili inizia improvvisamente a produrre auto arancioni, questi dati potrebbero non essere disponibili nei dati di addestramento, ma potrebbero comunque essere visualizzati nei dati di inferenza. In questo caso è necessario un modo efficace per affrontare il problema.

Si potrebbe obiettare: beh, perché non elenchi tutte le colonne nel set di dati di addestramento trasformato come colonne che sarebbero necessarie per il tuo set di dati di inferenza? Il problema qui è che spesso non sai in anticipo quali sono i livelli dei fattori nei dati di allenamento.

Ad esempio, potrebbero essere introdotti regolarmente nuovi livelli, il che potrebbe renderne difficile il mantenimento. Oltre a ciò arriva il processo di corrispondenza del set di dati di inferenza con i dati di addestramento, quindi dovresti controllare tutti i nomi di colonne effettivamente trasformate inserite nell'algoritmo di addestramento e quindi abbinarli al set di dati di inferenza trasformato. Se mancassero delle colonne, dovresti inserire nuove colonne con valori 0 e se avessi colonne extra, come il color_2__orange colonne sopra, queste dovrebbero essere cancellate. Questo è un modo piuttosto complicato per risolvere il problema e per fortuna sono disponibili opzioni migliori.

La soluzione a questo problema è piuttosto semplice, tuttavia molti dei pacchetti e delle librerie che tentano di semplificare il processo di creazione di modelli di previsione non riescono a implementarlo correttamente. La chiave sta nell'avere una funzione o classe che viene prima adattata ai dati di addestramento e quindi utilizzare la stessa istanza della funzione o classe per trasformare sia il set di dati di addestramento che il set di dati di inferenza. Di seguito esploriamo come ciò viene fatto utilizzando sia Python che R.

In Pitone

Python è senza dubbio uno dei migliori linguaggi di programmazione da utilizzare per l'apprendimento automatico, in gran parte grazie alla sua vasta rete di sviluppatori e librerie di pacchetti mature, nonché alla sua facilità d'uso, che promuove un rapido sviluppo.

Per quanto riguarda i problemi relativi alla codifica one-hot descritti sopra, essi possono essere mitigati utilizzando la libreria scikit-learn, ampiamente disponibile e testata, e più specificamente il sklearn.preprocessing.OneHotEncoder classe. Quindi, vediamo come possiamo utilizzarlo sui nostri set di dati di addestramento e inferenza per creare una solida codifica one-hot.

from sklearn.preprocessing import OneHotEncoder

# Initialize the encoder
enc = OneHotEncoder(handle_unknown='ignore')

# Define columns to transform
trans_columns = ('color_1_', 'color_2_')

# Fit and transform the data
enc_data = enc.fit_transform(training_data(trans_columns))

# Get feature names
feature_names = enc.get_feature_names_out(trans_columns)

# Convert to DataFrame
enc_df = pd.DataFrame(enc_data.toarray(),
columns=feature_names)

# Concatenate with the numerical data
final_df = pd.concat((training_data(('numerical_1')),
enc_df), axis=1)

Questo produce una finale DataFramedi valori trasformati come mostrato di seguito:

Set di dati di addestramento trasformato con sklearn/immagine per autore

Se analizziamo il codice sopra, vediamo che il primo passo è inizializzare l'istanza an della classe encoder. Usiamo l'opzione handle_unknown='ignore' in modo da evitare problemi con valori sconosciuti per le colonne quando utilizziamo il codificatore per trasformare il nostro set di dati di inferenza.

Successivamente, combiniamo un'azione di adattamento e trasformazione in un unico passaggio con il fit_transform metodo. Infine, creiamo un nuovo frame di dati dai dati codificati e lo concateniamo con il resto del set di dati originale.

Fonte: towardsdatascience.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *