
Molte esercitazioni di apprendimento automatico si concentrano su elementi specifici del flusso di lavoro come la pulizia dei dati, la formazione dei modelli o l’ottimizzazione dell’algoritmo.
Tuttavia, quando si è all’inizio degli studi dell’apprendimento automatico, può essere difficile cogliere appieno questi meccanismi senza una semplice spiegazione o procedura dettagliata.
Nel seguente post, fornirò un tutorial molto semplice per lo sviluppo di un modello di machine learning supervisionato in Python.
Per questa comprensione è necessaria solo una conoscenza di base della programmazione Python (puoi scaricare l’ebook gratuito per imparare le basi di python qua) e che tu abbia già installato alcune delle librerie di data science più comuni.
Vediamo prima cosa si intende per modello di machine learning.
Cos’è un modello di machine learning?
Un modello di machine learning rappresenta l’output di un algoritmo di apprendimento automatico eseguito sui dati.
Mostra ciò che è stato appreso da un algoritmo di apprendimento automatico, quindi le regole, i numeri e qualsiasi altra struttura di dati specifica dell’algoritmo necessaria per fare previsioni.
Ad esempio, dato un problema di regressione lineare, abbiamo l’algoritmo di regressione lineare e il modello finale. Quest’ultimo comprende un vettore di coefficienti che vengono moltiplicati e sommati con una riga di nuovi dati, presi come input per effettuare una previsione.
Solitamente quando si crea un modello di machine learning si salvano i dati per un utilizzo successivo.
Prerequisiti e Obiettivo
Per questa spiegazione ci avvaliamo dell’iris dataset, un set di dati molto semplice e reale che contiene 4 differenti misurazioni per i 3 gruppi di pianta iris: lunghezza sepale, larghezza sepale, lunghezza del petalo e larghezza del petalo.
A seconda del risultato di queste quattro misurazioni, il nostro obiettivo è quello di determinare a quale gruppo appartiene ogni fiore iris analizzato.
Per farlo cercheremo di prevedere il valore della classe del fiore, che può assumere valore 0 (se si tratta del fiore Setosa), valore 1 (se si tratta del fiore Versicolor) o 2 (se abbiamo a che fare con il fiore Virginica).
Anziché importare i dati da file, utilizzeremo il modulo datasets di Sklearn e la sua funzione load_iris() per importare più facilmente il dataset.
Definiremo le features, quindi le caratteristiche o le variabili indipendenti X, e la response o variabile dipendente y, che rappresenta la classe di fiore che vogliamo prevedere.
Viene richiamato anche il metodo train_test_split che permette di suddividere il dataset in precedenza importato in due set di dati, quello di train (detto anche di addestramento) e quello di test (per valutare il modello di machine learning).
Il primo set di dati rappresenta il 70% delle osservazioni dell’intero dataset, mentre il set di test il 30% (per come si è deciso di suddividerlo).
Queste operazioni vengono salvate dentro un modulo di nome Iris_model.py, e reimportato successivamente per la creazione del modello. L’immagine seguente spiega in linguaggio python quello che si è descritto brevemente qui a parole:
Arrivati a questo punto è possibile iniziare a costruire un semplice modello di machine learning.
1) Importare lo stimatore
Il primo passo per la creazione di un modello di machine learning risulta quello di importare lo stimatore.
Esso permette di scegliere il modello di dati “migliore”, o molto probabilmente accurato, basato sulle osservazioni dei dati di input e tramite la loro valutazione ci consente di darne una stima. Può essere un algoritmo di classificazione, regressione o clustering o un trasformatore che estrae o filtra funzionalità utili da dati grezzi.
Solitamente in Scikit-Learn esso è salvato sotto forma di modulo e viene importato dalla libreria Sklearn come visto per il dataset o il train_test_split. In questa sede decidiamo di utilizzare come stimatore il LinearSVC, una tipologia di Support Vector Machine, a cui rimando all’articolo per maggiori informazioni.
Il codice python per importare lo stimatore è di seguito rappresentato:
Ogni stimatore è composto da diversi parametri che permettono di definirlo e che ci spiegano come l’istanza del modello andrà ad apprendere durante il processo di adattamento.
2) Creare l’istanza del modello
Dopo aver importato la nostra classe stimatore, dobbiamo crearne un’istanza.
In linea generale nella programmazione, la creazione di un’istanza rappresenta la creazione di un oggetto all’interno di una classe, dandogli un nome e posizionandolo in un luogo fisico.
Per capire meglio, possiamo pensare alla classe come a uno schizzo (prototipo) di una casa. Contiene tutti i dettagli sui pavimenti, porte, finestre ecc. e sulla base di queste descrizioni costruiamo la casa.
La costruzione finale della casa rappresenta invece l’oggetto. Poiché molte case simili possono essere realizzate dallo stesso progetto, possiamo creare molti oggetti da una classe.
In python, un oggetto è anche chiamato istanza di una classe e il processo di creazione di questo oggetto è chiamato istanziazione.
L’istanza viene creata richiamando lo stimatore importato e aggiungendo le parentesi tonde di seguito. Nell’esempio successivo viene anche aggiunto il parametro di massimo numero di iterazioni (max_iter pari a 10000, anziché a 1000 di default) per evitare di incorrere nel messaggio di warning, dove viene consigliato di aumentare il numero delle iterazioni.
Generalmente l’istanza non necessita, come in questo caso, del numero massimo di iterazioni da processare.
In aggiunta, questa istanza non sarà ancora in grado di fare previsioni poiché non ha ancora appreso dai dati, ed è la principale differenza tra un’istanza dello stimatore e un modello reale.
3) Adattamento o fitting del modello di machine learning
Ora abbiamo un’istanza del nostro stimatore. Per usarlo come mezzo di previsione, dobbiamo addestrarlo sui dati di allenamento. Questo passaggio è noto come adattamento.
Per le classi in Scikit-learn, il metodo di adattamento accetta (almeno) due parametri, indicati con X e y.
X è il set di addestramento che coinvolge tutti i dati ad eccezione della variabile di risposta (di solito un Pandas DataFrame).
y è la variabile di risposta contenuta nel set di addestramento (di solito una serie Pandas o un array Numpy).
Questa è la parte del codice che spesso richiede più tempo per essere eseguita, poiché è qui che l’algoritmo di machine learning sottostante lo stimatore ricava i parametri del modello (tramite alcuni metodi che si prefiggono di minimizzare una funzione di costo usando un algoritmo di ottimizzazione come la discesa del gradiente).
Si noti che nel nostro semplice caso d’uso ci sono pochissimi dati, quindi questo passaggio è in realtà piuttosto rapido.
Poiché nella nostra base di codice i dati su cui inseriremo il nostro classificatore sono stati importati (e suddivisi) nel modulo Iris_model.py, dobbiamo renderli disponibili nel file python dove stiamo creando il modello.
Avendo già definito il set di training come train_x e train_y, possiamo importarli usando il metodo fit seguito dall’istanza del modello creata al precedente punto:
4) Test del modello di machine learning creato
Ora che il modello è stato adattato, possiamo testare le sue prestazioni con il metodo score(). Ciascuno stimatore ha una metrica di punteggio predefinita: in questo caso determina l’accuratezza del nostro modello.
Come per il metodo di adattamento della sezione precedente, il punteggio assume sempre (almeno) due valori: X e y. Questa volta utilizzeremo invece i nostri set di dati test_x e test_y.
Possiamo quindi utilizzare questa metrica di precisione per darci qualche indicazione sul fatto che abbiamo un buon modello o meno.
Se giudichiamo che il punteggio di precisione non è abbastanza buono, allora possiamo cambiare il nostro modello. Questo potrebbe essere fatto selezionando diverse funzionalità di input, pulendo e aggregando le funzionalità in un modo diverso, istanziando il nostro stimatore con diversi iperparametri, o in altro modo.
Usando il nostro set di dati di esempio, vediamo che questa precisione ottiene un’accuratezza media del 97,78%!
Questo valore è molto elevato per la prima volta, quasi come se questo set di dati fosse stato esplicitamente progettato per questo esercizio. Dopotutto non è un caso se questo dataset è spesso utilizzato per scopi analoghi.
5) Previsione
Ora che il nostro modello è stato adattato e le sue prestazioni sono state testate, possiamo usarlo per fare previsioni. Qui normalmente inseriamo nuovi dati per i quali vogliamo ottenere i valori previsti (separati dai set di training e test).
Tuttavia, poiché i nostri dati di esempio non hanno queste informazioni, riutilizziamo il nostro set di test solo per dimostrare la funzionalità del metodo predict.
L’output del metodo predict, come mostrato dall’immagine seguente, è un array contenente una previsione per ciascuna voce di riga del set di dati di input.
2 significa che il primo valore del test set previsto appartiene alla classe Virginica, 2 significa che il secondo valore del test set previsto è Virginica, 1 significa che il terzo valore del test set previsto è Versicolor (e così via fino a prevedere tutto il test set per tutte le 45 previsioni. Il dataset è di 150 record e il test set è composto dai 3/10 delle rilevazioni).
Ora abbiamo ottenuto con successo previsioni usando il nostro modello!
Si noti che durante la fase di test, oltre a utilizzare il metodo score, avremmo potuto utilizzare altre metriche (come la convalida incrociata ad esempio, o la matrice di confusione) per ulteriori test e analisi.
Ciò può essere utile per determinare come viene valutato il modello quando si prevedono risultati specifici, come i valori delle risposte più comuni in un’attività di classificazione multinomiale.
Se il modello costruito prevede correttamente solo i risultati più comuni, mentre fallisce completamente su quelli meno comuni, dovremmo chiederci se questo è davvero un modello adeguato per raggiungere i nostri obiettivi. In tal caso, il modello potrebbe semplicemente scegliere il valore modale per ogni previsione, quasi perspicace.
Conclusione
Siamo giunti al termine di questo breve tutorial.
Finora abbiamo visto come poter creare un modello di machine learning utilizzando di fatto 5 step. Dopo aver importato i dati, e suddiviso le caratteristiche dalla variabile target è possibile creare un modello di machine learning tramite:
- L’importazione dello stimatore dalla libreria Sklearn;
- La creazione di un’istanza della classe dello stimatore, per avere un oggetto della classe stimatore;
- L’adattamento, in cui l’istanza dello stimatore apprende dai dati, creando un modello parametrizzato;
- Il metodo score, che verifica se il modello raggiunge la precisione richiesta;
- La previsione, al fine di utilizzare il modello per fare previsioni su nuovi dati.