Créer, entraîner et déployer un modèle de machine learning

avec Amazon SageMaker

Au terme de ce tutoriel, vous saurez comment utiliser Amazon SageMaker pour créer, entraîner et déployer un modèle de machine learning (ML). Pour les besoins de cet exercice, nous utiliserons l'algorithme de machine learning courant appelé XGBoost. Amazon SageMaker est un service de machine learning modulaire et entièrement géré qui permet aux développeurs et aux spécialistes des données de créer, d'entraîner et de déployer des modèles de ML à n'importe quelle échelle.

En règle générale, le processus qui va de la conceptualisation à la production des modèles de ML est complexe et chronophage. L'entraînement du modèle nécessite la gestion de grandes quantités de données, le choix du meilleur algorithme, la gestion de la capacité de calcul pendant l'entraînement, puis le déploiement du modèle dans un environnement de production. Amazon SageMaker allège cette complexité en facilitant la création et le déploiement de modèles de ML. Une fois que vous avez choisi les bons algorithmes et cadres parmi le large éventail de choix disponibles, Amazon SageMaker gère toute l'infrastructure sous-jacente pour entraîner votre modèle à l'échelle du pétaoctet et le déployer en production.

Dans ce tutoriel, vous jouerez le rôle d'un développeur de solutions à technologie machine learning au sein d'une banque. Mission vous été confiée de développer un modèle de machine learning pour prédire si un client va s'inscrire pour un certificat de dépôt (CD). Le modèle sera entraîné à partir d'un ensemble de données marketing qui contiennent des informations sur les caractéristiques sociodémographiques des clients, les réactions aux événements marketing et les facteurs externes.

Les données ont été étiquetées pour plus de commodité et une colonne dans l'ensemble de données indique si le client est inscrit pour un produit offert par la banque. Une version de cet ensemble de données est accessible au public sur le référentiel de ML de l'Université de Californie à Irvine. Ce tutoriel met en œuvre un modèle de machine learning supervisé étant donné que les données sont étiquetées. (Un apprentissage non supervisé a lieu lorsque les ensembles de données ne sont pas étiquetés.)

Dans ce tutoriel, vous allez :

  1. Créer une instance de bloc-notes
  2. Préparer les données
  3. Entraîner le modèle à apprendre à partir des données
  4. Déployer le modèle
  5. Évaluer la performance de votre modèle de ML
 
Les ressources créées et utilisées dans ce tutoriel sont éligibles à l'offre gratuite AWS. N'oubliez pas l'Étape 7 et supprimez vos ressources. Si votre compte utilise activement ces ressources pendant plus de deux mois, il sera débité de moins de 0,50 USD.
 

Un compte AWS est nécessaire pour accéder à ce tutoriel.

Les ressources que vous créez dans ce tutoriel sont éligibles à l'offre gratuite. 

En savoir plus sur l'offre gratuite >>


Étape 1. Se connecter à la console Amazon SageMaker

Naviguer vers la console Amazon SageMaker.


Lorsque vous cliquez ici, AWS Management Console s'ouvre dans une nouvelle fenêtre. Vous pouvez ainsi garder ce guide pas à pas ouvert. Commencez à saisir SageMaker dans la barre de recherche et sélectionnez Amazon SageMaker pour ouvrir la console de service.

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

(cliquez pour agrandir)


Étape 2. Créer une instance de bloc-notes Amazon SageMaker

Dans cette étape, vous allez créer une instance de bloc-notes Amazon SageMaker. 


2a. Sélectionnez des exemples d'instances de bloc-notes dans le tableau de bord d'Amazon SageMaker. 

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

(cliquez pour agrandir)


2b. Sur la page Créer une instance de bloc-notes, saisissez un nom dans le champ Nom d'instance de bloc-notes. Ce tutoriel utilise MySageMakerInstance comme nom d'instance. Vous pouvez toutefois choisir un autre nom si vous le souhaitez.

Pour les besoins de ce tutoriel, vous pouvez garder le type d'instance de bloc-notes par défaut qui est ml.t2.medium.

Vous devez spécifier un rôle IAM pour permettre à l'instance de bloc-notes d'accéder à Amazon S3 et d'y télécharger des données en toute sécurité. Dans le champ rôle IAM, choisissez Créer un nouveau rôle pour demander à Amazon SageMaker de créer un rôle avec les autorisations requises et de l'attribuer à votre instance. Vous pouvez également choisir un rôle IAM existant dans votre compte à cette fin.

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

(cliquez pour agrandir)


2c. Dans la boîte Créer un rôle IAM, sélectionnez N'importe quel compartiment S3. Cela permet à votre instance Amazon SageMaker d'accéder à tous les compartiments S3 de votre compte. Plus loin dans ce tutoriel, vous créerez un nouveau compartiment S3. Toutefois, si vous avez un compartiment que vous souhaitez utiliser, sélectionnez Compartiments S3 spécifiques et indiquez le nom du compartiment.

Sélectionnez Créer le rôle.

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

(cliquez pour agrandir)


2d. Notez qu'Amazon SageMaker a créé un rôle appelé AmazonSageMaker-ExecutionRole-*** pour vous.

Pour les besoins de ce tutoriel, nous utiliserons les valeurs par défaut des autres champs. Choisissez Créer une instance de bloc-notes.

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

(cliquez pour agrandir)


2e. Sur la page des Instances de bloc-notes, vous devriez voir votre nouvelle instance de bloc-notes MySageMakerInstance avec le statut En attente.

Votre instance de bloc-notes devrait passer du statut En attente au statut InService en moins de deux minutes.

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

(cliquez pour agrandir)


Étape 3. Préparer les données

Dans cette étape, vous utiliserez votre bloc-notes Amazon SageMaker pour prétraiter les données dont vous avez besoin pour entraîner votre modèle de machine learning.


3a. Sur la page Instances de bloc-notes, attendez jusqu'à l'aboutissement de la transition de MySageMakerInstance du statut En attente au statut InService.

Une fois le statut devenu InService, sélectionnez MySageMakerInstance et ouvrez-le depuis le menu déroulant Actions ou en choisissant Open Jupyter situé près du statut InService.

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

(cliquez pour agrandir)

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

(cliquez pour agrandir)


3b. Une fois Jupyter ouvert, allez dans l'onglet Fichiers et choisissez Nouveau, puis choisissez conda_python3

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

(cliquez pour agrandir)


3c. Pour préparer les données, puis entraîner et déployer le modèle de ML, vous devrez importer certaines bibliothèques et définir quelques variables d'environnement dans votre environnement Jupyter. Copiez le code suivant dans la cellule de code de votre instance et sélectionnez Exécuter.

Pendant que le code est en cours d'exécution, un astérisque (*) apparaît entre les crochets comme vous pouvez le voir sur la première capture d'écran à droite. Après quelques secondes, l'exécution du code sera terminée et l'astérisque (*) sera remplacé par le chiffre 1. Il s'affichera alors un message confirmant la réussite de l'opération comme illustrée dans la deuxième capture d'écran à droite. 

# 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
build-train-deploy-machine-learning-model-sagemaker-3c-1

(cliquez pour agrandir)

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

(cliquez pour agrandir)

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

3d. Dans cette étape, vous créez un compartiment S3 qui stockera vos données pour ce tutoriel.

Copiez le code suivant dans la prochaine cellule de code de votre bloc-notes et changez le nom du compartiment S3 pour le personnaliser. Les noms de compartiments S3 doivent être uniques au monde et comporter certaines autres restrictions et limitations.

Sélectionnez Exécuter. Si vous ne recevez pas de message de confirmation de réussite de l'opération, changez le nom du compartiment et réessayez.

 

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
build-train-deploy-machine-learning-model-sagemaker-3d

(cliquez pour agrandir)


3e. Ensuite, vous devez télécharger les données sur votre instance Amazon SageMaker et les charger dans une trame de données. Copiez et exécutez le code suivant :

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
build-train-deploy-machine-learning-model-sagemaker-3e

(cliquez pour agrandir)


3f. Nous allons à présent réorganiser les données et les diviser en données d'entraînement et en données de test.

Les données d'entraînement (70 % des clients) seront utilisées pendant la boucle d'entraînement du modèle. Nous utiliserons l'optimisation par gradient pour affiner itérativement les paramètres du modèle. L'optimisation par gradient est un moyen de trouver les valeurs des paramètres du modèle qui minimisent l'erreur du modèle, en utilisant le gradient de la fonction de perte du modèle.

Les données de test (30 % des clients restants) seront utilisées pour évaluer la performance du modèle et mesurer la mesure dans laquelle le modèle entraîné se généralise à des données invisibles.

Copiez le code suivant dans une nouvelle cellule de code et sélectionnez Exécuter pour réorganiser et diviser les données :

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
build-train-deploy-machine-learning-model-sagemaker-3f

(cliquez pour agrandir)


Étape 4. Entraîner le modèle à partir des données

Au cours de cette étape, vous entraînerez votre modèle de machine learning à l'aide de l'ensemble des données d'entraînement. 


4a. Pour utiliser un modèle XGBoost précréé par Amazon SageMaker, vous devrez reformater l'en-tête et la première colonne des données d'entraînement et charger les données du compartiment S3.

Copiez le code suivant dans une nouvelle cellule de code et sélectionnez Exécuter pour reformater et charger les données :

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. Vous devez ensuite configurer la séance Amazon SageMaker, créer une instance du modèle XGBoost (un estimateur), et définir les hyperparamètres du modèle. Copiez le code suivant dans une nouvelle cellule de code et sélectionnez Exécuter :

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. Une fois les données chargées et l'estimateur XGBoost configuré, entraînez le modèle avec l'optimisation de gradient sur une instance ml.m4.xlarge en copiant le code suivant dans la prochaine cellule de code et en sélectionnant Exécuter.

Au bout de quelques minutes, vous devriez commencer à voir les journaux de l'entraînement qui sont générés.

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

(cliquez pour agrandir)


Étape 5. Déployer le modèle

Dans cette étape, vous allez déployer le modèle entraîné sur un point de terminaison, le reformater, charger les données CSV, puis l'exécuter pour créer des prédictions.


5a. Pour déployer le modèle sur un serveur et créer un point de terminaison auquel vous pouvez accéder, copiez le code suivant dans la prochaine cellule de code et sélectionnez Exécuter :

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

(cliquez pour agrandir)


5b. Pour prévoir si les clients dans les données de test se sont inscrits pour le produit bancaire ou non, copiez le code suivant dans la prochaine cellule de code et sélectionnez Exécuter :

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
build-train-deploy-machine-learning-model-sagemaker-5b

(cliquez pour agrandir)


Étape 6. Évaluer la performance du modèle

Dans cette étape, vous évaluerez la performance et la précision du modèle de machine learning.


6a. Copiez et collez le code ci-dessous et sélectionnez Exécuter pour comparer les valeurs réelles et prédites dans un tableau appelé matrice de confusion.

Sur la base de cette prédiction, nous pouvons conclure que vous avez prédit qu'un client s'inscrira pour un certificat de dépôt avec une précision de 90 % dans les données de test, avec une précision de 65 % (278/429) pour les inscrits et 90 % (10 785/11 928) pour les non inscrits.

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
build-train-deploy-machine-learning-model-sagemaker-6a

(cliquez pour agrandir)


Étape 7. Supprimer vos ressources

Dans cette étape, vous supprimerez vos ressources liées à Amazon SageMaker.

Important : il est conseillé de supprimer les ressources qui ne sont pas utilisées de façon active, afin de réduire les coûts. La non-suppression de ressources peut entraîner des frais.


7a. Copiez, collez et exécutez le code suivant pour supprimer le point de terminaison Amazon SageMaker et les objets dans votre compartiment S3 :  

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
build-train-deploy-machine-learning-model-sagemaker-7a

(cliquez pour agrandir)


Félicitations !

Vous savez désormais comment utiliser Amazon SageMaker pour préparer, entraîner, déployer et évaluer un modèle de machine learning. Amazon SageMaker facilite la création de modèles de ML en fournissant tout ce dont vous avez besoin pour vous connecter rapidement à vos données d'entraînement et sélectionner le meilleur algorithme et le meilleur cadre pour votre application, le tout en gérant toute l'infrastructure sous-jacente, afin que vous puissiez entraîner des modèles à l'échelle du pétaoctet.


 

En savoir plus

Amazon SageMaker comprend des algorithmes de machine learning intégrés qui peuvent être utilisés pour différents cas d'utilisation. En savoir plus sur l'utilisation des algorithmes intégrés fournis avec Amazon SageMaker. 

Aller plus loin

Vous pouvez utiliser le machine learning avec Réglage de modèle automatique dans Amazon SageMaker. Cela vous permet de régler automatiquement les hyperparamètres dans vos modèles afin d'obtenir le meilleur résultat possible. Consultez la documentation sur le Réglage de modèle automatique et ce billet de blog pour aller plus dans la compréhension de cette fonction. 

Voir Amazon SageMaker à l'œuvre

Amazon SageMaker dispose d'un certain nombre d'exemples de bloc-notes qui traitent de nombreux cas d'utilisation courante pour le machine learning. Découvrez-les sur GitHub !