API di stima

Funzionamento API di stima scikit-learn

In questa nuova lezione andiamo a capire che cosa sono le API di stima in maniera completa. Nel paragrafo precedente abbiamo utilizzato la classe Imputer per trasformare i dati a causa della sua appartenenza alle classi transformer di scikit-learn

I due metodi più utilizzati quando trattiamo con questi estimatori sono fit e transform. Il primo viene usato per apprendere i parametri dai dati di addestramento, mentre l’altro utilizza questi parametri per trasformare i dati. Ogni array di dati che deve essere trasformato deve avere lo stesso numero di caratteristiche dell’array di dati che è stato utilizzato per preparare il modello. 

I classificatori che abbiamo utilizzato negli articoli precedenti, appartengono ai cosiddetti stimatori di scikit-learn con un’API che, concettualmente, è molto simile alla classe transformer. Essi hanno un metodo predict, ma possono avere anche il metodo transform oltre che al più che utilizzato metodo fit. Esso viene utilizzato, come ricorderemo, per imparare i parametri di un modello quando abbiamo addestrato tali estimatori per la classificazione. Inoltre, quando trattiamo con metodi di apprendimento con supervisione, forniamo le etichette delle classi per la configurazione del modello, utilizzate per eseguire previsioni sui nuovi campioni di dati tramite il metodo predict

API di stima
API di stima

Gestione di dati categorici

Nel corso del nostro studio teorico del Machine Learning abbiamo sempre utilizzato valori numerici. Ma è abbastanza comune che i dataset del mondo reale contengano uno o più colonne di caratteristiche categorie. Dobbiamo distinguere fra caratteristiche nominali e ordinali. Molto semplice, quelle nominali non prevedono alcun ordine, un esempio con le t-shirt color, il rosso non domina sul blu perchè esso non può essere trattato come un valore numerico o di confronto con dati oggettivi. Mentre per le caratteristiche ordinali, sempre con esempio delle t-shirt size, è giusto dire che la taglia XL è maggiore di L e L maggiore di M. 

Proviamo ad esporre il problema attraverso del codice di programmazione:

				
					import pandas as pd 
df = pd.DataFrame([['green', 'M', 10.1, 'class1'],
                   ['red', 'L', 13.5, 'class2'],
                   ['blue', 'XL', 15.3, 'class1']])

df.columns = ['color', 'size', 'price', 'classlabel']
df
				
			
API di stima

Come possiamo notare, il nostro DataFrame appena creato contiene una caratteristica nominale (color), una ordinale (size) e una numerica (price). Le etichette delle classi sono presenti nell’ultima colonna. Gli algoritmi che tratteremo non utilizzano informazioni ordinali nelle etichette delle classi.

Mappaggio di caratteristiche ordinali

Parlando di API di stima, dobbiamo introdurre anche il concetto di mappaggio delle caratteristiche ordinali appena trattate. Per far si che gli algoritmi di apprendimento riescano ad interpretare correttamente le caratteristiche ordinali, occorre convertire i valori stringa categorici in valori interi. Per fare ciò abbiamo bisogno di definire il mappaggio in modo manuale, supponendo di conoscere la differenza tra le caratteristiche ( XL=L+1=M+1 ):

				
					size_mapping = {'XL': 3,
                'L': 2,
                'M': 1}
df['size'] = df['size'].map(size_mapping)
df
				
			
API di stima

Inoltre, per quanto riguarda la programmazione, in caso volessimo ritrasformare i valori interi nella loro rappresentazione a stringa originale, possiamo semplicemente definire un dizionario di mappaggio inverso:

				
					inv_size_mapping = {v: k for k, v in size_mapping.items()}
df['size'].map(inv_size_mapping)
				
			

che può essere utilizzato tramite metodo map di pandas sulla colonna della caratteristica trasformata, un pò come nel caso del dizionario size_mapping che abbiamo utilizzato in precedenza.

Codifica delle etichette delle classi su API di stima

Molte librerie di scikit-learn richiedono che le etichette delle classi siano codificate come valori interi. Infatti, è considerata buona norma fornire le etichette delle classi come array di interi per evitare incomprensioni tecniche. Per codificare le etichette delle classi con API di stima, possiamo utilizzare un approccio simile a quello utilizzato per il mappaggio delle caratteristiche ordinali. Per semplificare il processo, decidiamo di numerare le etichette delle classi a partire da 0:

				
					import numpy as np

class_mapping = {label: idx for idx, label in enumerate(np.unique(df['classlabel']))}
class_mapping
				
			
				
					>>{'class1': 0, 'class2': 1}
				
			

Successivamente, possiamo usare il dizionario di mappaggio per trasformare le etichette delle classi in valori interi: 

				
					df['classlabel'] = df['classlabel'].map(class_mapping)
df
				
			
API di stima

Possiamo invertire le coppie chiave-valore nel dizionario di mappaggio nel seguente modo per mappare le etichette (convertite) delle classi, di nuovo nella loro rappresentazione a stringa:

				
					inv_class_mapping = {v: k for k, v in class_mapping.items()}
df['classlabel'] = df['classlabel'].map(inv_class_mapping)
df
				
			
API di stima

Scikit-learn ci viene incontro implementando una classe LabelEncoder, che svolge la stessa operazione:

				
					from sklearn.preprocessing import LabelEncoder

class_le = LabelEncoder()
y = class_le.fit_transform(df['classlabel'].values)
y
				
			
				
					>> array([0, 1, 0])
				
			

Il metodo fit_transorm non è altro che un’abbreviazione alle due chiamate dei metodi fit e transform. Con il metodo inverse_transform possiamo trasformare i numeri interi, corrispondenti alle etichette delle classi, di nuovo nella loro rappresentazione originale a stringa:

				
					class_le.inverse_transform(y)
				
			
				
					>> array(['class1', 'class2', 'class1'], dtype=object)
				
			

Condividi il post

Condividi su facebook
Condividi su google
Condividi su twitter
Condividi su email
Condividi su whatsapp