Erstellen, Trainieren und Bereitstellen eines Machine-Learning-Modells

mit Amazon SageMaker

In diesem Tutorial erfahren Sie, wie Sie ein ML-Modell (Machine Learning) mit Amazon SageMaker erstellen, trainieren und bereitstellen. Dazu verwenden wir den gängigen XGBoost ML-Algorithmus. Amazon SageMaker ist ein vollständig verwalteter modularer Machine-Learning-Service, mit dem Entwickler und Daten-Wissenschaftler Machine-Learning-Modelle jeder Größe erstellen, trainieren und bereitstellen können.

Die Entwicklung eines ML-Modells vom Konzept zum Produktiveinsatz ist in der Regel komplex und zeitaufwändig. Wenn Sie große Datenmengen verwalten müssen, um das Modell zu trainieren, müssen Sie den für das Training am besten geeigneten Algorithmus auswählen, während des Trainings die Datenverarbeitungsleistung optimieren und anschließend das Modell in einer Produktivumgebung bereitstellen. Mit Amazon SageMaker werden diese komplexen Abläufe vereinfacht, sodass ML-Modelle mit deutlich geringerem Aufwand erstellt und bereitgestellt werden können. Nachdem Sie aus der breiten Palette verfügbarer Lösungen die für Ihre Zwecke am besten geeigneten Algorithmen und Frameworks ausgewählt haben, übernimmt der Service die Verwaltung der zugrunde liegenden Infrastruktur, um das Modell mit Petabytes an Daten zu trainieren und in der Produktivumgebung bereitzustellen.

In diesem Tutorial übernehmen Sie die Rolle eines Machine-Learning-Entwicklers, der für eine Bank tätig ist. Sie wurden gebeten, ein Machine-Learning-Modell zu entwickeln, mit dem vorhergesagt werden kann, ob ein Kunde ein Einlagenzertifikat zeichnen wird. Zum Trainieren des Modells wird der Marketingdatensatz verwendet, der Informationen zur Demographie des Kunden, seine Reaktionen auf Marketinginitiativen und externe Faktoren enthält.

Die Daten wurden für Sie bereits mit Kennzeichnungen versehen und in einer Spalte im Datensatz ist angegeben, ob der Kunde bereits ein von der Bank angebotenes Produkt gezeichnet hat. Eine Version dieses Datensatzes ist in dem von der University of California in Irvine (USA) zusammengestellten ML-Repository öffentlich verfügbar. In diesem Tutorial implementieren Sie ein überwachtes (supervised) Machine-Learning-Modell, da die Daten bereits über Kennzeichnungen verfügen. (Wenn Datensätze keine Kennzeichnungen aufweisen, handelt es sich um nicht überwachtes Lernen oder Unsupervised Learning.)

In diesem Tutorial werden Sie:

  1. Eine Notebook-Instance erstellen
  2. Die Daten vorbereiten
  3. Das Modell anhand der Daten trainieren
  4. Das Modell bereitstellen
  5. Die Leistung Ihres ML-Modells beurteilen
 
Die in diesem Tutorial erstellten und verwendeten Ressourcen können im Rahmen des kostenlosen AWS-Kontingents genutzt werden. Denken Sie daran, Schritt 7 abzuschließen und Ihre Ressourcen zu beenden. Wenn diese Ressourcen länger als zwei Monate in Ihrem Konto aktiv sind, werden Ihnen weniger als 0,50 USD berechnet.
 

Für dieses Tutorial ist ein AWS-Konto erforderlich.

Die in diesem Tutorial erstellten Ressourcen können im Rahmen des kostenlosen Kontingents genutzt werden. 

Weitere Informationen zum kostenlosen Kontingent >>


Schritt 1: Bei der Amazon SageMaker-Konsole anmelden

Rufen Sie die Amazon SageMaker-Konsole auf.


Wenn Sie hier klicken, wird die AWS-Managementkonsole in einem neuen Browserfenster geöffnet, sodass Sie diese Schritt-für-Schritt-Anleitung geöffnet lassen können. Geben Sie dann in der Suchleiste SageMaker ein und wählen Sie Amazon SageMaker, um die Servicekonsole zu öffnen.

(Zum Vergrößern klicken)


Schritt 2: Eine Amazon SageMaker-Notebook-Instance erstellen

In diesem Schritt werden Sie eine Amazon SageMaker-Notebook-Instance erstellen. 


2a. Wählen Sie auf dem Amazon SageMaker-Dashboard die Option Notebook-Instances

(Zum Vergrößern klicken)


2b. Geben Sie auf der Seite Notebook-Instance erstellen in das Feld Name der Notebook-Instance einen Namen ein. Wir verwenden zum Zweck dieses Tutorials den Namen MySageMakerInstance. Sie können jedoch wahlweise einen anderen Namen festlegen.

Für dieses Tutorial können Sie als Typ der Notebook-Instance den Standardtyp ml.t2.medium beibehalten.

Um die Notebook-Instance zu aktivieren und Daten in Amazon S3 abzurufen und sicher hochzuladen, müssen Sie eine IAM-Rolle angeben. Wählen Sie in dem Feld IAM-Rolle die Option Neue Rolle erstellen aus. Daraufhin wird von Amazon SageMaker eine Rolle mit den benötigten Berechtigungen erstellt und Ihrer Instance zu gewiesen. Alternativ können Sie für dieses Tutorial eine in Ihrem Konto bereits vorhandene IAM-Rolle auswählen.

(Zum Vergrößern klicken)


2c. Wählen Sie im Dialogfeld IAM-Rolle erstellen die Option Beliebiger S3-Bucket aus. Dadurch kann Ihre Amazon SageMaker-Instance auf alle Amazon S3-Buckets in Ihrem Konto zugreifen. Später in diesem Tutorial werden Sie einen neuen S3-Bucket erstellen. Falls Sie bereits über einen Bucket verfügen, den Sie stattdessen verwenden möchten, wählen Sie Spezifische S3-Buckets aus und geben Sie den Namen des Buckets an.

Wählen Sie Rolle erstellen.

(Zum Vergrößern klicken)


2d. Wie Sie sehen, wurde von Amazon SageMaker für Sie die Rolle AmazonSageMaker-ExecutionRole-*** erstellt.

In diesem Tutorial werden wir für die restlichen Felder die Standardwerte verwenden. Wählen Sie Notebook-Instance erstellen.

(Zum Vergrößern klicken)


2e. Auf der Seite Notebook-Instances sollte nun Ihre neue Notebook-Instance mit dem Namen MySageMakerInstance und dem Status Ausstehend angezeigt werden.

Nach spätestens zwei Minuten sollte der Status von Ausstehend zu InBetrieb wechseln.

(Zum Vergrößern klicken)


Schritt 3: Die Daten vorbereiten

In diesem Schritt werden Sie mithilfe Ihrer Amazon SageMaker-Notebook-Instance die Daten vorbereiten, die Sie zum Trainieren Ihres Machine-Learning-Modells benötigen.


3a. Warten Sie, bis auf der Seite Notebook-Instances der Status der MySageMakerInstance von Ausstehend zu InBetrieb gewechselt ist.

Wenn sie den Status InBetrieb aufweist, wählen Sie MySageMakerInstance aus. Öffnen Sie sie entweder mithilfe des Dropdown-Menüs Aktionen oder indem Sie neben dem Status InBetrieb auf Jupyter öffnen klicken.

(Zum Vergrößern klicken)

(Zum Vergrößern klicken)


3b. Nachdem Jupyter geöffnet wurde, wählen Sie auf der Registerkarte Dateien die Option Neu und dann conda_python3

(Zum Vergrößern klicken)


3c. Um die Daten vorzubereiten, das ML-Modell zu trainieren und bereitzustellen, müssen Sie verschiedene Bibliotheken importieren und bestimmte Umgebungsvariablen in Ihrer Jupyter-Notebook-Umgebung definieren. Kopieren Sie den folgenden Code in die Codezelle Ihrer Instance und wählen Sie Ausführen:

Während der Code ausgeführt wird, erscheint in den eckigen Klammern das Symbol * (siehe erster Screenshot auf der rechten Seite). Die Ausführung des Codes ist nach wenigen Sekunden abgeschlossen. Das *-Symbol wird durch die Zahl 1 ersetzt und es wird die im zweiten Screenshot auf der rechten Seite abgebildete Erfolgsmeldung angezeigt. 

# 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.")

(Zum Vergrößern klicken)

(Zum Vergrößern klicken)


3d. In diesem Schritt erstellen Sie einen S3-Bucket, in dem Sie die Daten für dieses Tutorial speichern.

Kopieren Sie den folgenden Code in die nächste Codezelle Ihrer Notebook-Instance und ersetzen Sie den Namen des S3-Buckets durch einen eindeutigen neuen Namen. Namen von S3-Buckets müssen weltweit eindeutig sein und bestimmte Kriterien und Anforderungen erfüllen.

Wählen Sie Ausführen. Wenn keine Erfolgsmeldung angezeigt wird, ändern Sie den Namen des Buckets und versuchen Sie es erneut.

 

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)

(Zum Vergrößern klicken)


3e. Als Nächstes müssen Sie die Daten in Ihre Amazon SageMaker-Instance herunterladen und in einen DataFrame laden. Kopieren Sie den folgenden Code und führen Sie ihn aus:

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)

(Zum Vergrößern klicken)


3f. Nun werden wir die Daten zufällig mischen und in Trainingsdaten und Testdaten aufteilen.

Die Trainingsdaten (70 % der Kunden) werden während der Trainingsschleife verwendet. Die Modellparameter werden mithilfe des Gradientenverfahrens optimiert und iterativ verfeinert. Durch die gradientenbasierte Optimierung können die Parameterwerte ermittelt werden, mit denen Fehler im Modell minimiert werden. Dazu wird der Gradient der Modell-Verlustfunktion berechnet.

Die Testdaten (die restlichen 30 % der Kunden) werden genutzt, um die Leistung des Modells zu beurteilen und festzustellen, wie gut das trainierte Modell unbekannte Daten verallgemeinern kann.

Kopieren Sie den folgenden Code in eine neue Codezelle und wählen Sie Ausführen, um die Daten zu zufällig mischen und aufzuteilen:

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)

(Zum Vergrößern klicken)


Schritt 4: Das Modell anhand der Daten trainieren

In diesem Schritt werden Sie das Machine-Learning-Modell anhand der Daten aus dem Trainingssatz trainieren. 


4a. Um ein von Amazon SageMaker vorkonfiguriertes XGBoost-Modell verwenden zu können, müssen Sie die Kopfzeile und die erste Zeile der Trainingsdaten neu formatieren und die Daten aus dem S3-Bucket laden.

Kopieren Sie den folgenden Code in eine neue Codezelle und wählen Sie Ausführen, um die Daten neu zu formatieren und zu laden:

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. Im nächsten Schritt müssen Sie die Amazon SageMaker-Sitzung einrichten, eine Instance des XGBoost-Modells (einen Kalkulator) erstellen und die Hyperparameter des Modells festlegen. Kopieren Sie den folgenden Code in eine neue Codezelle und wählen Sie Ausführen:

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. Nachdem die Daten geladen wurden und der XGBoost-Kalkulator eingerichtet wurde, können Sie das Modell mithilfe der gradientenbasierten Optimierung auf einer ml.m4.xlarge-Instance trainieren. Kopieren Sie dafür den Code in die nächste Codezelle und wählen Sie Ausführen.

Nach wenigen Minuten sollten Sie sehen, wie die ersten Trainingsprotokolle erstellt werden.

xgb.fit({'train': s3_input_train})

(Zum Vergrößern klicken)


Schritt 5: Das Modell bereitstellen

In diesem Schritt werden Sie das trainierte Modell auf einem Endpunkt bereitstellen, die CSV-Daten neu formatieren und laden und anschließend das Modell zum Erstellen von Prognosen ausführen.


5a. Kopieren Sie den folgenden Code in die nächste Codezelle und wählen Sie Ausführen, um das Modell auf einem Server bereitzustellen und einen Endpunkt zu erstellen, auf den Sie zugreifen können:

xgb_predictor = xgb.deploy(initial_instance_count=1,instance_type='ml.m4.xlarge')

(Zum Vergrößern klicken)


5b. Kopieren Sie den folgenden Code in die nächste Codezelle und wählen Sie Ausführen, um eine Vorhersage darüber zu treffen, ob Kunden in den Testdaten das Produkt der Bank gezeichnet haben:

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)

(Zum Vergrößern klicken)


Schritt 6. Die Leistung des Modells beurteilen

In diesem Schritt beurteilen Sie die Leistung und die Genauigkeit des Machine-Learning-Modells.


6a. Kopieren Sie den Code und fügen Sie ihn unten ein. Wählen Sie dann Ausführen, um die tatsächlichen mit den prognostizierten Werten in der Tabelle confusion matrix zu vergleichen.

Aus der Vorhersage lässt sich schließen, dass das Modell für 90 % der Kunden in den Testdaten präzise vorhersagen konnte, ob ein Kunde ein Einlagenzertifikat zeichnen würde oder nicht. Dabei lag die Genauigkeit für Kunden, die das Zertifikat zeichneten, bei 65 % (278/429) und für Kunden, die es nicht zeichneten, bei 90 % (10 785/11 928).

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))

(Zum Vergrößern klicken)


Schritt 7: Ihre Ressourcen beenden

In diesem Schritt beenden Sie Ihre in Verbindung mit Amazon SageMaker verwendeten Ressourcen.

Wichtig: Die Beendigung von Ressourcen, die nicht aktiv genutzt werden, ist eine bewährte Methode zur Senkung der Kosten. Wenn Sie Ihre Ressourcen nicht beenden, fallen Gebühren an.


7a. Kopieren Sie den folgenden Code, fügen Sie ihn ein und wählen Sie Ausführen, um den Amazon SageMaker-Endpunkt und die Objekte in Ihrem S3-Bucket zu löschen:  

sagemaker.Session().delete_endpoint(xgb_predictor.endpoint)
bucket_to_delete = boto3.resource('s3').Bucket(bucket_name)
bucket_to_delete.objects.all().delete()

(Zum Vergrößern klicken)


Herzlichen Glückwunsch!

Sie wissen nun, wie Sie mit Amazon SageMaker ein Machine-Learning-Modell erstellen, trainieren, bereitstellen und seine Leistung beurteilen. Mit Amazon SageMaker ist es ganz einfach, ML-Modelle zu erstellen. Der Service bietet alles, was Sie benötigen, um schnell auf Trainingsdaten zuzugreifen und den besten Algorithmus und das beste Framework für Ihre Anwendung auszuwählen. Dabei übernimmt der Service die Verwaltung der zugrunde liegenden Infrastruktur, damit Sie das Modell mit Petabytes von Daten trainieren können.


 

Weitere Informationen

Amazon SageMaker bietet einen vorkonfigurierten Machine-Learning-Algorithmus, der für verschiedene Anwendungsfälle eingesetzt werden kann. Beschäftigen Sie sich eingehender mit den in Amazon SageMaker integrierten Algorithmen

Detaillierte Informationen

Sie können Machine Learning in Kombination mit der automatischen Modelloptimierung in Amazon SageMaker verwenden. Auf diese Weise werden die Hyperparameter Ihres Modells automatisch optimiert, um das bestmögliche Ergebnis zu erzielen. Ausführlichere Informationen über diese Funktion finden Sie in der Dokumentation über die automatische Modelloptimierung sowie in diesem Blog-Beitrag

In Aktion erleben

Amazon SageMaker verfügt über eine Reihe von Beispiel-Notebook-Instances, die viele gängige Anwendungsfälle für Machine Learning abdecken. Sie finden sie auf GitHub!