Creazione, addestramento e distribuzione di modelli di machine learning

con Amazon SageMaker

In questo tutorial scoprirai come utilizzare Amazon SageMaker per creare, addestrare e distribuire un modello di machine learning (ML). Ai fini di questo esercizio, useremo il popolare algoritmo XGBoost per ML. Amazon SageMaker è un servizio modulare di machine learning completamente gestito che consente a sviluppatori e data scientist di creare, addestrare e distribuire modelli ML su larga scala.

Portare i modelli ML dalla concettualizzazione alla produzione è in genere complesso e richiede tempo. È necessario gestire grandi quantità di dati e scegliere l'algoritmo migliore per addestrare il modello, gestire la capacità di calcolo durante l'addestramento e quindi distribuire il modello in un ambiente di produzione. Amazon SageMaker riduce questa complessità semplificando la creazione e la distribuzione di modelli ML. Dopo aver scelto gli algoritmi e i framework più adatti dalla vasta gamma di opzioni disponibili, esso gestisce tutta l'infrastruttura sottostante per addestrare il modello su scala petabyte e distribuirlo alla produzione.

In questo tutorial, assumerai il ruolo di uno sviluppatore di machine learning che lavora in una banca. Ti è stato chiesto di sviluppare un modello di machine learning per prevedere se un cliente aprirà un conto deposito (CD). Il modello verrà addestrato sul set di dati di marketing che contiene informazioni sui dati demografici dei clienti, risposte a eventi di marketing e fattori esterni.

I dati sono stati etichettati per comodità dell'utente e una colonna nel set di dati identifica se il cliente è censito per un prodotto offerto dalla banca. Una versione di questo set di dati è disponibile pubblicamente nel repository di ML a cura dell'Università della California, Irvine. Questo tutorial implementa un modello di machine learning supervisionato poiché i dati sono etichettati. Il machine learning non supervisionato si verifica quando i set di dati non sono etichettati.

In questo tutorial, scoprirai come:

  1. Creare un'istanza notebook
  2. Preparazione dei dati
  3. Addestrare il modello per apprendere dai dati
  4. Distribuzione del modello
  5. Valutare le prestazioni del modello ML
 
Le risorse create e utilizzate in questo tutorial sono idonee per il piano gratuito di AWS. Ricorda di completare la fase 7 e di arrestare le risorse. Se il tuo account è stato attivo con queste risorse per più di due mesi, ti verranno addebitati meno di 0,50 USD.
 

Questo tutorial richiede un account AWS

Le risorse create in questo tutorial sono idonee per il piano gratuito. 

Ulteriori informazioni sul piano gratuito >>


Fase 1. Accesso alla console di Amazon SageMaker

Navigazione nella console di Amazon SageMaker.


Facendo clic qui, la console di gestione AWS si aprirà in una nuova finestra del browser, in modo da poter tenere aperta questa guida dettagliata. Iniziare digitando SageMaker nella barra di ricerca e selezionare Amazon SageMaker per aprire la console del servizio.

build-train-deploy-machine-learning-model-sagemaker-1

(fai clic per ingrandire l'immagine)


Fase 2. Creazione di un'istanza notebook Amazon SageMaker

In questa fase, creerai un'istanza notebook Amazon SageMaker. 


2a. Dal pannello di controllo di Amazon SageMaker, selezionare Notebook instances (Istanze notebook)

build-train-deploy-machine-learning-model-sagemaker-2a

(fai clic per ingrandire l'immagine)


2b. Nella pagina Create notebook instance (Crea istanza notebook), inserire un nome nel campo Notebook instance name (Nome istanza notebook). In questo tutorial viene utilizzato MySageMakerInstance come nome dell'istanza, ma è possibile scegliere un nome diverso, se lo si desidera.

Ai fini di questo tutorial, è possibile mantenere ml.t2.medium come Notebook instance type (Tipo di istanza Notebook) predefinito.

Per consentire all'istanza notebook di accedere e caricare in modo sicuro i dati su Amazon S3, è necessario specificare un ruolo IAM. Nel campo IAM role (Ruolo IAM), scegliere Create a new role (Crea un nuovo ruolo) per consentire ad Amazon SageMaker di creare un ruolo con le autorizzazioni necessarie e assegnarlo all'istanza. In alternativa, per questo scopo puoi scegliere un ruolo IAM esistente nel tuo account.

build-train-deploy-machine-learning-model-sagemaker-2b

(fai clic per ingrandire l'immagine)


2c. Nella casella Create an IAM role (Crea un ruolo IAM), selezionare Any S3 bucket (Qualsiasi bucket S3). Ciò consente all'istanza Amazon SageMaker di accedere a tutti i bucket S3 nel tuo account. Più avanti in questo tutorial, creerai un nuovo bucket S3. Tuttavia, se si dispone di un bucket che si desidera utilizzare, selezionare Specific S3 buckets (Bucket S3 specifici) e specificare il nome del bucket.

Scegliere Create role (Crea ruolo).

build-train-deploy-machine-learning-model-sagemaker-2c

(fai clic per ingrandire l'immagine)


2d. Tieni presente che Amazon SageMaker ha creato per te un ruolo chiamato AmazonSageMaker-ExecutionRole-***.

Ai fini di questo tutorial, utilizzeremo i valori predefiniti per gli altri campi. Scegliere Create notebook instance (Crea istanza notebook).

build-train-deploy-machine-learning-model-sagemaker-2d

(fai clic per ingrandire l'immagine)


2e. Nella pagina Notebook instances (Istanze notebook), dovresti vedere la tua nuova istanza notebook MySageMakerInstance nello stato Pending (In sospeso).

L'istanza notebook dovrebbe passare dallo stato Pending (In sospeso) allo stato InService in meno di due minuti.

build-train-deploy-machine-learning-model-sagemaker-2e

(fai clic per ingrandire l'immagine)


Fase 3. Preparazione dei dati

In questa fase utilizzerai il notebook Amazon SageMaker per preelaborare i dati necessari per addestrare il modello di machine learning.


3a. Nella pagina Notebook instances (Istanze notebook), attendere fino a quando MySageMakerInstance è passata dallo stato Pending (In sospeso) allo stato InService.

Quando lo stato è InService, selezionare e aprire MySageMakerInstance utilizzando il menu a discesa Actions (Operazioni) o scegliendo Open Jupyter (Apri Jupyter) accanto allo stato InService.

build-train-deploy-machine-learning-model-sagemaker-3a

(fai clic per ingrandire l'immagine)

build-train-deploy-machine-learning-model-sagemaker-3a1

(fai clic per ingrandire l'immagine)


3b. Quando Jupyter ha aperto, dalla scheda Files (File), scegliere New (Nuovo) e quindi scegliere conda_python3

build-train-deploy-machine-learning-model-sagemaker-3b

(fai clic per ingrandire l'immagine)


3c. Per preparare i dati, addestrare il modello ML e distribuirlo, sarà necessario importare alcune librerie e definire alcune variabili di ambiente nell'ambiente del notebook Jupyter. Copiare il seguente codice nella cella del codice nella tua istanza e selezionare Run (Esegui).

Durante l'esecuzione del codice, tra parentesi quadre viene visualizzato un * come mostrato nella prima schermata a destra. Dopo alcuni secondi, l'esecuzione del codice verrà completata, l'asterisco * verrà sostituito con il numero 1 e verrà visualizzato un messaggio di successo come mostrato nella seconda schermata a destra. 

# import libraries
import boto3, re, sys, math, json, os, sagemaker, urllib.request
from sagemaker import get_execution_role
import numpy as np                                
import pandas as pd                               
import matplotlib.pyplot as plt                   
from IPython.display import Image                 
from IPython.display import display               
from time import gmtime, strftime                 
from sagemaker.predictor import csv_serializer   

# Define IAM role
role = get_execution_role()
prefix = 'sagemaker/DEMO-xgboost-dm'
containers = {'us-west-2': '433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest',
              'us-east-1': '811284229777.dkr.ecr.us-east-1.amazonaws.com/xgboost:latest',
              'us-east-2': '825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest',
              'eu-west-1': '685385470294.dkr.ecr.eu-west-1.amazonaws.com/xgboost:latest'} # each region has its XGBoost container
my_region = boto3.session.Session().region_name # set the region of the instance
print("Success - the MySageMakerInstance is in the " + my_region + " region. You will use the " + containers[my_region] + " container for your SageMaker endpoint.")
build-train-deploy-machine-learning-model-sagemaker-3c-1

(fai clic per ingrandire l'immagine)

build-train-deploy-machine-learning-model-sagemaker-3c-2

(fai clic per ingrandire l'immagine)


3d. In questa fase, viene creato un bucket S3 che memorizzerà i tuoi dati ai fini di questo tutorial.

Copiare il seguente codice nella cella di codice successiva nel tuo notebook e modificare il nome del bucket S3 per renderlo univoco. I nomi dei bucket S3 devono essere univoci a livello globale e avere alcune altre restrizioni e limitazioni.

Selezionare Run (Esegui). Se non ricevi un messaggio di successo, modifica il nome del bucket e riprova.

 

bucket_name = 'your-s3-bucket-name' # <--- CHANGE THIS VARIABLE TO A UNIQUE NAME FOR YOUR BUCKET
s3 = boto3.resource('s3')
try:
    if  my_region == 'us-east-1':
      s3.create_bucket(Bucket=bucket_name)
    else: 
      s3.create_bucket(Bucket=bucket_name, CreateBucketConfiguration={ 'LocationConstraint': my_region })
    print('S3 bucket created successfully')
except Exception as e:
    print('S3 error: ',e)
build-train-deploy-machine-learning-model-sagemaker-3d

(fai clic per ingrandire l'immagine)


3e. Successivamente, è necessario scaricare i dati nell'istanza Amazon SageMaker e caricarli in un frame di dati. Copiare ed eseguire il seguente codice selezionando Run (Esegui):

try:
  urllib.request.urlretrieve ("https://d1.awsstatic.com/tmt/build-train-deploy-machine-learning-model-sagemaker/bank_clean.27f01fbbdf43271788427f3682996ae29ceca05d.csv", "bank_clean.csv")
  print('Success: downloaded bank_clean.csv.')
except Exception as e:
  print('Data load error: ',e)

try:
  model_data = pd.read_csv('./bank_clean.csv',index_col=0)
  print('Success: Data loaded into dataframe.')
except Exception as e:
    print('Data load error: ',e)
build-train-deploy-machine-learning-model-sagemaker-3e

(fai clic per ingrandire l'immagine)


3f. Ora, mescoleremo i dati e li divideremo in dati di addestramento e dati di test.

I dati di addestramento (il 70% dei clienti) verranno utilizzati durante il ciclo di addestramento del modello. Useremo l'ottimizzazione basata sul gradiente per perfezionare in modo iterativo i parametri del modello. L'ottimizzazione basata sul gradiente è un modo per trovare i valori dei parametri del modello che riducono al minimo l'errore del modello, usando il gradiente della funzione di perdita del modello.

I dati di test (il restante 30% dei clienti) verranno utilizzati per valutare le prestazioni del modello e misurare quanto il modello addestrato si generalizza ai dati invisibili.

Copiare il codice seguente in una nuova cella di codice e selezionare Run (Esegui) per mescolare e dividere i dati:

train_data, test_data = np.split(model_data.sample(frac=1, random_state=1729), [int(0.7 * len(model_data))])
print(train_data.shape, test_data.shape)
build-train-deploy-machine-learning-model-sagemaker-3f

(fai clic per ingrandire l'immagine)


Fase 4. Addestramento del modello dai dati

In questa fase, il modello di machine learning verrà addestrato con il set di dati di addestramento. 


4a. Per utilizzare un modello XGBoost predefinito di Amazon SageMaker, dovrai riformattare l'intestazione e la prima colonna dei dati di addestramento e caricare i dati dal bucket S3.

Copiare il codice seguente in una nuova cella di codice e selezionare Run (Esegui) per riformattare e caricare i dati:

pd.concat([train_data['y_yes'], train_data.drop(['y_no', 'y_yes'], axis=1)], axis=1).to_csv('train.csv', index=False, header=False)
boto3.Session().resource('s3').Bucket(bucket_name).Object(os.path.join(prefix, 'train/train.csv')).upload_file('train.csv')
s3_input_train = sagemaker.s3_input(s3_data='s3://{}/{}/train'.format(bucket_name, prefix), content_type='csv')

4b. Successivamente, è necessario impostare la sessione Amazon SageMaker, creare un'istanza del modello XGBoost (uno stimatore) e definire gli iperparametri del modello. Copiare il codice seguente in una nuova cella di codice e selezionare Run (Esegui):

sess = sagemaker.Session()
xgb = sagemaker.estimator.Estimator(containers[my_region],role, train_instance_count=1, train_instance_type='ml.m4.xlarge',output_path='s3://{}/{}/output'.format(bucket_name, prefix),sagemaker_session=sess)
xgb.set_hyperparameters(max_depth=5,eta=0.2,gamma=4,min_child_weight=6,subsample=0.8,silent=0,objective='binary:logistic',num_round=100)

4c. Con i dati caricati e lo stimatore XGBoost impostato, addestrare il modello utilizzando l'ottimizzazione del gradiente su un'istanza ml.m4.xlarge copiando il codice seguente nella cella di codice successiva e selezionando Run (Esegui).

Dopo alcuni minuti, dovresti iniziare a vedere i log di addestramento generati.

xgb.fit({'train': s3_input_train})
build-train-deploy-machine-learning-model-sagemaker-4c

(fai clic per ingrandire l'immagine)


Fase 5. Distribuzione del modello

In questa fase, è necessario distribuire il modello addestrato su un endpoint, riformattare e caricare i dati CSV, quindi eseguire il modello per creare previsioni.


5a. Per distribuire il modello su un server e creare un endpoint a cui è possibile accedere, copiare il codice seguente nella cella di codice successiva e selezionare Run (Esegui):

xgb_predictor = xgb.deploy(initial_instance_count=1,instance_type='ml.m4.xlarge')
build-train-deploy-machine-learning-model-sagemaker-5a

(fai clic per ingrandire l'immagine)


5b. Per prevedere se i clienti nei dati di test sono stati censiti o meno per il prodotto bancario, copiare il codice seguente nella cella di codice successiva e selezionare Run (Esegui):

test_data_array = test_data.drop(['y_no', 'y_yes'], axis=1).values #load the data into an array
xgb_predictor.content_type = 'text/csv' # set the data type for an inference
xgb_predictor.serializer = csv_serializer # set the serializer type
predictions = xgb_predictor.predict(test_data_array).decode('utf-8') # predict!
predictions_array = np.fromstring(predictions[1:], sep=',') # and turn the prediction into an array
print(predictions_array.shape)
build-train-deploy-machine-learning-model-sagemaker-5b

(fai clic per ingrandire l'immagine)


Fase 6. Valutazione delle prestazioni del modello

In questa fase, valuterai le prestazioni e l'accuratezza del modello di machine learning.


6a. Copiare e incollare il codice seguente e selezionare Run (Esegui) per confrontare i valori effettivi con quelli previsti in una tabella chiamata matrice di confusione.

Sulla base della previsione, possiamo concludere che hai stimato che un cliente aprirà un conto deposito con una precisione del 90% per i clienti nei dati di test, con una precisione del 65% (278/429) per i clienti censiti e del 90% (10.785/11.928) per i clienti non censiti.

cm = pd.crosstab(index=test_data['y_yes'], columns=np.round(predictions_array), rownames=['Observed'], colnames=['Predicted'])
tn = cm.iloc[0,0]; fn = cm.iloc[1,0]; tp = cm.iloc[1,1]; fp = cm.iloc[0,1]; p = (tp+tn)/(tp+tn+fp+fn)*100
print("\n{0:<20}{1:<4.1f}%\n".format("Overall Classification Rate: ", p))
print("{0:<15}{1:<15}{2:>8}".format("Predicted", "No Purchase", "Purchase"))
print("Observed")
print("{0:<15}{1:<2.0f}% ({2:<}){3:>6.0f}% ({4:<})".format("No Purchase", tn/(tn+fn)*100,tn, fp/(tp+fp)*100, fp))
print("{0:<16}{1:<1.0f}% ({2:<}){3:>7.0f}% ({4:<}) \n".format("Purchase", fn/(tn+fn)*100,fn, tp/(tp+fp)*100, tp))
build-train-deploy-machine-learning-model-sagemaker-6a

(fai clic per ingrandire l'immagine)


Fase 7. Arresto delle risorse

In questa fase, eseguirai l'arresto delle risorse relative ad Amazon SageMaker.

Importante: l'arresto delle risorse che non vengono utilizzate attivamente consente di ridurre i costi e costituisce una best practice. Il mancato arresto delle risorse comporterà costi aggiuntivi.


7a. Per eliminare l'endpoint Amazon SageMaker e gli oggetti nel bucket S3, copiare, incollare e selezionare Run (Esegui) per eseguire il seguente codice:  

sagemaker.Session().delete_endpoint(xgb_predictor.endpoint)
bucket_to_delete = boto3.resource('s3').Bucket(bucket_name)
bucket_to_delete.objects.all().delete()
build-train-deploy-machine-learning-model-sagemaker-7a

(fai clic per ingrandire l'immagine)


Complimenti!

Hai imparato a utilizzare Amazon SageMaker per preparare, addestrare, distribuire e valutare un modello di machine learning. Amazon SageMaker semplifica la creazione di modelli ML fornendoti tutto il necessario per connetterti rapidamente ai dati di addestramento e selezionare l'algoritmo e il framework migliori per la tua applicazione, gestendo al contempo tutta l'infrastruttura sottostante, affinché tu possa addestrare modelli su scala petabyte.


 

Ulteriori informazioni

Amazon SageMaker viene fornito con algoritmi di machine learning predefiniti che possono essere utilizzati per vari casi d'uso. Ulteriori informazioni sull'uso degli algoritmi integrati forniti con Amazon SageMaker. 

Approfondisci

Puoi utilizzare il machine learning con l'ottimizzazione automatica dei modelli in Amazon SageMaker. Ciò consente di ottimizzare automaticamente gli iperparametri nei modelli per ottenere il miglior risultato possibile. Per approfondire questa funzionalità, consulta la documentazione circa l'ottimizzazione automatica dei modelli e il seguente post sul blog

Guardalo in azione

Amazon SageMaker ha vari notebook di esempio disponibili che affrontano molti casi d'uso comuni per il machine learning. Dai un'occhiata su GitHub!