1. Panoramica
In questo lab, esaminerai un flusso di lavoro di ML completo su GCP. Da un ambiente Cloud AI Platform Notebooks, importerai i dati da un set di dati pubblici BigQuery, creerai e addestrerai un modello XGBoost e lo implementerai in AI Platform per la previsione.
Cosa imparerai
Al termine del corso sarai in grado di:
- Importa e analizza un set di dati BigQuery in AI Platform Notebooks
- Crea un modello XGBoost
- Esegui il deployment del modello XGBoost su AI Platform e ottieni previsioni
Il costo totale per eseguire questo lab su Google Cloud è di circa 1$.
2. Configura l'ambiente
Per eseguire questo codelab, devi avere un progetto Google Cloud Platform con la fatturazione abilitata. Per creare un progetto, segui le istruzioni riportate qui.
Passaggio 1: attiva l'API Cloud AI Platform Models
Vai alla sezione Modelli AI Platform della console Cloud e fai clic su Abilita se non è già abilitata.

Passaggio 2: abilita l'API Compute Engine
Vai a Compute Engine e seleziona Abilita se non è già abilitato. Ne avrai bisogno per creare la tua istanza di blocco note.
Passaggio 3: crea un'istanza di AI Platform Notebooks
Vai alla sezione AI Platform Notebooks della tua console Cloud e fai clic su Nuova istanza. Poi seleziona il tipo di istanza Python più recente:

Utilizza le opzioni predefinite e poi fai clic su Crea. Una volta creata l'istanza, seleziona Apri JupyterLab:
Passaggio 4: installa XGBoost
Una volta aperta l'istanza di JupyterLab, devi aggiungere il pacchetto XGBoost.
Per farlo, seleziona Terminale da Avvio app:

Quindi, esegui questo comando per installare l'ultima versione di XGBoost supportata da AI Platform:
pip3 install xgboost==0.82
Al termine, apri un'istanza di blocco note Python 3 dal launcher. Ora puoi iniziare a usare il tuo notebook.
Passaggio 5: importa i pacchetti Python
Nella prima cella del notebook, aggiungi le seguenti importazioni ed esegui la cella. Puoi eseguirlo premendo il pulsante Freccia destra nel menu in alto o premendo Comando-Invio:
import pandas as pd
import xgboost as xgb
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from google.cloud import bigquery
3. Esplorazione del set di dati BigQuery
BigQuery ha reso disponibili pubblicamente molti set di dati per la tua esplorazione. Per questo lab, utilizzeremo il set di dati sulla natalità. Contiene dati su quasi tutte le nascite negli Stati Uniti in un periodo di 40 anni, tra cui il peso alla nascita del bambino e informazioni demografiche sui genitori. Utilizzeremo un sottoinsieme delle funzionalità per prevedere il peso di un bambino alla nascita.
Passaggio 1: scarica i dati BigQuery nel notebook
Utilizzeremo la libreria client Python per BigQuery per scaricare i dati in un DataFrame Pandas. Il set di dati originale è di 21 GB e contiene 123 milioni di righe. Per semplicità,utilizzeremo solo 10.000 righe del set di dati.
Costruisci la query e visualizza l'anteprima del DataFrame risultante con il seguente codice. Qui otteniamo quattro caratteristiche dal set di dati originale, insieme al peso del bambino (la variabile che il nostro modello prevede). Il set di dati risale a molti anni fa, ma per questo modello utilizzeremo solo i dati successivi al 2000:
query="""
SELECT
weight_pounds,
is_male,
mother_age,
plurality,
gestation_weeks
FROM
publicdata.samples.natality
WHERE year > 2000
LIMIT 10000
"""
df = bigquery.Client().query(query).to_dataframe()
df.head()
Per ottenere un riepilogo delle funzionalità numeriche nel nostro set di dati, esegui:
df.describe()
Mostra la media, la deviazione standard, il minimo e altre metriche per le nostre colonne numeriche. Infine, otteniamo alcuni dati sulla colonna booleana che indica il sesso del bambino. Possiamo farlo con il metodo value_counts di Pandas:
df['is_male'].value_counts()
Sembra che il set di dati sia quasi bilanciato al 50/50 per genere.
4. Preparare i dati per l'addestramento
In questa sezione, divideremo i dati in set di addestramento e test per prepararli all'addestramento del modello.
Passaggio 1: estrai la colonna delle etichette
Innanzitutto, elimina dal set di dati le righe con valori null e rimescola i dati:
df = df.dropna()
df = shuffle(df, random_state=2)
Successivamente, estrai la colonna delle etichette in una variabile separata e crea un DataFrame con solo le nostre funzionalità:
labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])
Ora, se visualizzi l'anteprima del nostro set di dati eseguendo data.head(), dovresti vedere le quattro funzionalità che utilizzeremo per l'addestramento.
Passaggio 2: converti le caratteristiche categoriche in numeri interi
Poiché XGBoost richiede che tutti i dati siano numerici, dovremo modificare il modo in cui rappresentiamo i dati nella colonna is_male, che attualmente sono stringhe True / False. Possiamo farlo semplicemente modificando il tipo di colonna:
data['is_male'] = data['is_male'].astype(int)
Passaggio 3: dividi i dati in set di addestramento e test
Utilizzeremo l'utilità train_test_split di Scikit Learn, che abbiamo importato all'inizio del notebook, per dividere i dati in set di addestramento e test:
x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)
Ora è tutto pronto per creare e addestrare il modello.
5. Una breve introduzione a XGBoost
XGBoost è un framework di machine learning che utilizza alberi decisionali e gradient boosting per creare modelli predittivi. Funziona combinando più alberi decisionali in base al punteggio associato a diversi nodi foglia di un albero.
Il diagramma seguente è una visualizzazione semplificata di una rete di alberi di ensemble per un modello che valuta se una persona apprezzerà o meno un gioco per computer specifico (tratto dalla documentazione di XGBoost):

Perché utilizziamo XGBoost per questo modello? Sebbene le reti neurali tradizionali abbiano dimostrato di funzionare meglio con dati non strutturati come immagini e testo, gli alberi decisionali spesso funzionano molto bene con dati strutturati come il set di dati sui mutui che utilizzeremo in questo codelab.
6. Crea, addestra e valuta un modello XGBoost
Passaggio 1: definisci e addestra il modello XGBoost
Creare un modello in XGBoost è semplice. Utilizzeremo la classe XGBRegressor per creare il modello e dobbiamo solo passare il parametro objective corretto per la nostra attività specifica. In questo caso utilizziamo un modello di regressione perché prevediamo un valore numerico (il peso del bambino). Se invece raggruppassimo i dati per determinare se un bambino pesa più o meno di 3 kg, utilizzeremmo un modello di classificazione.
In questo caso, utilizzeremo reg:squarederror come obiettivo del modello.
Il seguente codice creerà un modello XGBoost:
model = xgb.XGBRegressor(
objective='reg:linear'
)
Puoi addestrare il modello con una riga di codice, chiamando il metodo fit() e passando i dati di addestramento e le etichette.
model.fit(x_train, y_train)
Passaggio 2: valuta il modello sui dati di test
Ora possiamo utilizzare il modello addestrato per generare previsioni sui dati di test con la funzione predict():
y_pred = model.predict(x_test)
Vediamo il rendimento del modello sui primi 20 valori del nostro set di test. Di seguito stampiamo il peso del bambino previsto insieme al peso effettivo del bambino per ogni esempio di test:
for i in range(20):
print('Predicted weight: ', y_pred[i])
print('Actual weight: ', y_test.iloc[i])
print()
Passaggio 3: salva il modello
Per eseguire il deployment del modello, esegui questo codice per salvarlo in un file locale:
model.save_model('model.bst')
7. Esegui il deployment del modello su Cloud AI Platform
Il nostro modello funziona localmente, ma sarebbe bello poter fare previsioni ovunque (non solo in questo blocco note). In questo passaggio, eseguiremo il deployment nel cloud.
Passaggio 1: crea un bucket Cloud Storage per il modello
Definiamo innanzitutto alcune variabili di ambiente che utilizzeremo per il resto del codelab. Compila i valori riportati di seguito con il nome del tuo progetto Google Cloud, il nome del bucket Cloud Storage che vuoi creare (deve essere univoco a livello globale) e il nome della versione per la prima versione del modello:
# Update these to your own GCP project, model, and version names
GCP_PROJECT = 'your-gcp-project'
MODEL_BUCKET = 'gs://storage_bucket_name'
VERSION_NAME = 'v1'
MODEL_NAME = 'baby_weight'
Ora siamo pronti per creare un bucket di archiviazione per archiviare il file del modello XGBoost. Quando eseguiamo il deployment, Cloud AI Platform punta a questo file.
Esegui questo comando gsutil dal notebook per creare un bucket:
!gsutil mb $MODEL_BUCKET
Passaggio 2: copia il file del modello in Cloud Storage
Successivamente, copieremo il file del modello salvato XGBoost in Cloud Storage. Esegui questo comando gsutil:
!gsutil cp ./model.bst $MODEL_BUCKET
Vai al browser di archiviazione nella console Cloud per verificare che il file sia stato copiato:

Passaggio 3: crea ed esegui il deployment del modello
Il seguente comando gcloud ai-platform creerà un nuovo modello nel tuo progetto. Lo chiameremo xgb_mortgage:
!gcloud ai-platform models create $MODEL_NAME
Ora è il momento di eseguire il deployment del modello. Possiamo farlo con questo comando gcloud:
!gcloud ai-platform versions create $VERSION_NAME \
--model=$MODEL_NAME \
--framework='XGBOOST' \
--runtime-version=1.15 \
--origin=$MODEL_BUCKET \
--python-version=3.7 \
--project=$GCP_PROJECT
Durante l'esecuzione, controlla la sezione dei modelli della console AI Platform. Dovresti visualizzare la nuova versione in fase di deployment:

Al termine del deployment, al posto della rotellina di caricamento vedrai un segno di spunta verde. Il deployment dovrebbe richiedere 2-3 minuti.
Passaggio 4: testa il modello di cui è stato eseguito il deployment
Per assicurarti che il modello di cui hai eseguito il deployment funzioni, testalo utilizzando gcloud per fare una previsione. Innanzitutto, salva un file JSON con due esempi del nostro set di test:
%%writefile predictions.json
[0.0, 33.0, 1.0, 27.0]
[1.0, 26.0, 1.0, 40.0]
Testa il modello salvando l'output del seguente comando gcloud in una variabile e stampandolo:
prediction = !gcloud ai-platform predict --model=$MODEL_NAME --json-instances=predictions.json --version=$VERSION_NAME
print(prediction.s)
Dovresti vedere la previsione del modello nell'output. Il peso effettivo del bambino per questi due esempi è rispettivamente di 1,9 e 8,1 libbre.
8. Esegui la pulizia
Se vuoi continuare a utilizzare questo notebook, ti consigliamo di disattivarlo quando non lo usi. Dall'interfaccia utente di Notebooks nella console Cloud, seleziona il notebook, quindi seleziona Interrompi:

Se vuoi eliminare tutte le risorse che hai creato in questo lab, elimina semplicemente l'istanza del notebook anziché arrestarla.
Utilizzando il menu di navigazione della console Cloud, vai a Storage ed elimina entrambi i bucket creati per archiviare gli asset del modello.