Crea, addestra ed esegui il deployment di un modello XGBoost su Cloud AI Platform

1. Panoramica

In questo lab, seguirai un flusso di lavoro ML completo su Google Cloud. Da un ambiente di Notebooks di Cloud AI Platform, importerai i dati da un set di dati pubblico BigQuery, creerai e addestrerai un modello XGBoost ed eseguirai il deployment del modello su 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 l'esecuzione di questo lab su Google Cloud è di circa $1.

2. Configura l'ambiente

Per eseguire questo codelab, è necessario un progetto Google Cloud con fatturazione abilitata. Per creare un progetto, segui le istruzioni riportate qui.

Passaggio 1: abilita l'API Cloud AI Platform Models

Vai alla sezione Modelli di AI Platform della console Cloud e fai clic su Abilita se non è già abilitata.

d0d38662851c6af3.png

Passaggio 2: abilita l'API Compute Engine

Passa 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 console Cloud e fai clic su Nuova istanza. Quindi seleziona il tipo di istanza Python più recente:

a81c82876c6c16f9.png

Utilizza le opzioni predefinite e fai clic su Crea. Una volta creata l'istanza, seleziona Apri JupyterLab:

Passaggio 4: installa XGBoost

Una volta aperta l'istanza JupyterLab, dovrai aggiungere il pacchetto XGBoost.

Per farlo, seleziona Terminale da Avvio app:

28dcf2790ce77c96.png

Poi esegui questo comando per installare la versione più recente di XGBoost supportata da AI Platform:

pip3 install xgboost==0.82

Al termine, apri un'istanza di blocco note Python 3 dall'Avvio app. Puoi iniziare a usare il tuo blocco note.

Passaggio 5: importa i pacchetti Python

Nella prima cella del blocco note, aggiungi le seguenti importazioni ed esegui la cella. Per eseguirlo, premi il pulsante Freccia destra nel menu in alto o premi 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 le tue esplorazioni. 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 le informazioni demografiche sui genitori del neonato. Utilizzeremo un sottoinsieme di queste caratteristiche per prevedere il peso di un neonato alla nascita.

Passaggio 1: scarica i dati di BigQuery nel blocco note

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 semplificare le cose,utilizzeremo solo 10.000 righe del set di dati.

Crea la query e visualizza l'anteprima del DataFrame risultante con il codice seguente. Qui otteniamo 4 caratteristiche dal set di dati originale, insieme al peso del neonato (quello previsto dal nostro modello). Il set di dati risale a molti anni fa, ma per questo modello utilizzeremo solo 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 caratteristiche numeriche nel nostro set di dati, esegui:

df.describe()

Mostra la media, la deviazione standard, il minimo e altre metriche per le colonne numeriche. Infine, prendiamo in considerazione alcuni dati sulla colonna booleana che indica il genere del neonato. Possiamo farlo con Pandas Metodo value_counts:

df['is_male'].value_counts()

Sembra che il set di dati sia quasi bilanciato 50/50 per genere.

4. Prepara i dati per l'addestramento

In questa sezione, divideremo i dati in set di addestramento e test per prepararli per l'addestramento del modello.

Passaggio 1: estrai la colonna dell'etichetta

Elimina prima le righe con valori null dal set di dati ed esegui lo shuffling dei dati:

df = df.dropna()
df = shuffle(df, random_state=2)

Quindi, estrai la colonna dell'etichetta in una variabile separata e crea un DataFrame con solo le nostre funzionalità:

labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])

Se visualizzi l'anteprima del 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, dobbiamo cambiare il modo in cui li rappresentiamo nella colonna is_male, che attualmente è impostata come stringhe Vero / Falso. Per farlo, cambia semplicemente il tipo di colonna:

data['is_male'] = data['is_male'].astype(int)

Passaggio 3: suddividi i dati in set di addestramento e test

Utilizzeremo l'utilità train_test_split di Scikit Learn, che abbiamo importato all'inizio del blocco note, per suddividere 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 siamo pronti per creare e addestrare il nostro modello.

5. Una breve introduzione a XGBoost

XGBoost è un framework di machine learning che utilizza alberi decisionali e incremento del gradiente per creare modelli predittivi. Funziona raggruppando più alberi decisionali in base al punteggio associato ai diversi nodi foglia in un albero.

Il diagramma seguente è una visualizzazione semplificata di una rete di insiemi di alberi per un modello che valuta se un gioco per computer specifico piace o meno a qualcuno (dai documenti di XGBoost):

fb061cd8c8f69999.png

Perché utilizziamo XGBoost per questo modello? Sebbene le reti neurali tradizionali abbiano prestazioni ottimali su dati non strutturati come immagini e testi, gli alberi decisionali spesso hanno un ottimo rendimento con i dati strutturati, come il set di dati dei mutui che utilizzeremo in questo codelab.

6. Creare, addestrare e valutare 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. Qui stiamo utilizzando un modello di regressione poiché stiamo prevedendo un valore numerico (il peso del bambino). Se invece dovessimo raggruppare i dati per determinare se un bambino pesava più o meno di 2 kg, useremmo un modello di classificazione.

In questo caso utilizzeremo reg:squarederror come scopo del modello.

Il codice seguente creerà un modello XGBoost:

model = xgb.XGBRegressor(
    objective='reg:linear'
)

Puoi addestrare il modello con una sola riga di codice, chiamando il metodo fit() e passandogli i dati e le etichette di addestramento.

model.fit(x_train, y_train)

Passaggio 2: valuta il modello sulla base dei dati di test

Ora possiamo utilizzare il nostro modello addestrato per generare previsioni sui dati di test con la funzione predict():

y_pred = model.predict(x_test)

Vediamo le prestazioni del modello sui primi 20 valori del set di test. Di seguito stamperemo il peso del neonato previsto insieme al peso effettivo del neonato 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 in Cloud AI Platform

Il nostro modello funziona in locale, ma sarebbe bello se potessimo fare previsioni da qualsiasi luogo (non solo da questo blocco note!). In questo passaggio ne eseguiremo il deployment nel cloud.

Passaggio 1: crea un bucket Cloud Storage per il nostro modello

Per prima cosa, definiamo alcune variabili di ambiente che utilizzeremo nel resto del codelab. Compila i valori seguenti 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 della 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 a creare un bucket di archiviazione in cui archiviare il file del modello XGBoost. Indicheremo Cloud AI Platform a questo file durante il deployment.

Esegui questo comando gsutil dal blocco note per creare un bucket:

!gsutil mb $MODEL_BUCKET

Passaggio 2: copia il file del modello in Cloud Storage

Ora copieremo il file del modello salvato di XGBoost in Cloud Storage. Esegui il seguente comando gsutil:

!gsutil cp ./model.bst $MODEL_BUCKET

Vai al browser Storage nella console Cloud per verificare che il file sia stato copiato:

31e2567fa0117214.png

Passaggio 3: crea ed esegui il deployment del modello

Il seguente comando gcloud di ai-platform creerà un nuovo modello nel 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

Mentre è in esecuzione, controlla la sezione dei modelli della console di AI Platform. Dovresti vedere il deployment della nuova versione qui:

a431661f9c3e6cb2.png

Una volta completato il deployment, vedrai un segno di spunta verde in corrispondenza della rotellina di caricamento. 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 tuo 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)

Nell'output dovresti vedere la previsione del modello. Il peso effettivo del neonato per questi due esempi è rispettivamente 1,9 e 8,1 libbre.

8. Esegui la pulizia

Se desideri continuare a utilizzare questo blocco note, ti consigliamo di disattivarlo quando non lo usi. Dall'interfaccia utente di Notebooks in Cloud Console, seleziona il blocco note, quindi seleziona Interrompi:

879147427150b6c7.png

Per eliminare tutte le risorse che hai creato in questo lab, elimina l'istanza del blocco note anziché arrestarla.

Utilizzando il menu di navigazione nella console Cloud, vai a Storage ed elimina i bucket creati per archiviare gli asset del modello.