Machine Learning mit Python, Teil 2

Einführung in Amazon SageMaker

| Autor / Redakteur: Thomas Drilling / Stephan Augsten

Mithilfe von Bildern, die handschriftlich niedergeschriebene Zahlen umfassen, trainieren wir das Machine-Learning-Modell.
Mithilfe von Bildern, die handschriftlich niedergeschriebene Zahlen umfassen, trainieren wir das Machine-Learning-Modell. (Bild: Drilling / Jupyter)

Amazon SageMaker ist ein von AWS vollständig verwalteter Service, der den gesamten Workflow von Machine Learning abdeckt. Anhand der SageMaker-Demo von AWS illustrieren wir die wichtigsten Zusammenhänge, Grundlagen und Funktionsprinzipien.

Für unsere ersten Experimente verwenden wir das MNIST-Dataset als Trainingsdaten. Bei der MNIST-Datenbank (Modified National Institute of Standards and Technology) handelt es sich um eine sehr große Datenbank handgeschriebener Ziffern, die üblicherweise zum Trainieren verschiedener Bildverarbeitungssysteme verwendet wird.

Die Datenbank wird auch häufig für Schulungen und Tests im Bereich des maschinellen Lernens (ML) verwendet. Erstellt wurde das Dataset durch „erneutes Mischen“ der Proben aus den ursprünglichen Datensätzen des NIST-Datasets.

Der Grund dafür ist, dass die Macher der Ansicht waren, dass der NIST-Trainingsdatensatz direkt nicht für Experimente mit maschinellem Lernen geeignet ist, weil er von Mitarbeitern des American Census Bureau und der Testdatensatz von amerikanischen Schülern stammt. In der MNIST-Datenbank wurden die Schwarzweißbilder des NIST auf eine Größe von 28 x 28 Pixeln mit Anti-Aliasing und Graustufenwerte normalisiert.

Die MNIST-Datenbank handschriftlicher Ziffern umfasst aktuell einen Trainingssatz von 50.000 Beispielen sowie einen Testsatz von 10.000 Beispielen, also eine Teilmenge des NIST-Datasets. Der MNIST-Datenfundus eignet sich damit gut, um Lerntechniken und Mustererkennungsmethoden mit nur minimalem Aufwand für Vorverarbeitung und Formatierung an reale Daten auszuprobieren.

Trainingsdaten

Wir laden also im Folgenden das MNIST-Dataset auf unsere Jupyter-Notebook-Instanz herunter, überprüfen die Daten, wandeln sie um und laden sie anschließend in unser S3-Bucket hoch. Das Umwandeln der Daten geschieht mit der numpy-Bibliothek für Python, indem wir das Format von numpy.array in durch Komma getrennte Werte (CSV) ändern.

Der zum Bewerten des Trainingsfortschritts verwendete XGBoost-Algorithmus erwartet eine Eingabe im CSV- oder LIBSVM- Format, wobei letztere eine Open-Source-Bibliothek für maschinelles Lernen ist. Wir benutzen im Folgenden aber das einfacher anwendbare CSV-Format. Beginnen wir also mit dem Herunterladen des Datasets. AWS stellt dazu folgenden Beispielcode zur Verfügung.

%%time
import pickle, gzip, urllib.request, json
import numpy as np

# Load the dataset
urllib.request.urlretrieve("http://deeplearning.net/data/mnist/mnist.pkl.gz", "mnist.pkl.gz")
with gzip.open('mnist.pkl.gz', 'rb') as f:
   train_set, valid_set, test_set = pickle.load(f, encoding='latin1')
   print(train_set[0].shape)

Die ML-Trainingsdaten wollen zunächst einmal in die Jupyter-Notebook-Instanz geladen werden.
Die ML-Trainingsdaten wollen zunächst einmal in die Jupyter-Notebook-Instanz geladen werden. (Bild: Drilling / Jupyter)

Der Code importiert u.a. zunächst die numpy-Bibliothek unter der Kurzbezeichnung „np“, eine typische Konvention unter Python-Programmierern. Dann lädt er das MNIST-Dataset (mnist.pkl.gz) als gepacktes Archiv von der MNIST-Datenbank-Website auf das Notebook herunter, entpackt die Datei und liest die Datasets „trains_set“, „valid_set“ und „test_set“ in den Arbeitsspeicher des Notebooks ein.

Das „train_set“ enthält Bilder mit handschriftlichen Zahlen zum Trainieren eines Modells. Das „valid_set“ verwendet die Bilder um mit Hilfe des o. e. XGBoost-Algorithmus den Trainingsfortschritt des Modells zu bewerten. Das „test_set“ wird später benutzt, um „Inferenzen“ zum Testen des bereitgestellten Modells abzurufen. In der Praxis würde man nun die Schulungsdaten analysieren, um festzustellen, welche Art Bereinigungen und Transformationen notwendig sind, um die Modell-Training noch zu verbessern.

Mithilfe von Bildern, die handschriftlich niedergeschriebene Zahlen umfassen, trainieren wir das Machine-Learning-Modell.
Mithilfe von Bildern, die handschriftlich niedergeschriebene Zahlen umfassen, trainieren wir das Machine-Learning-Modell. (Bild: Drilling / Jupyter)

Das vorbereitete MNIST-Dataset muss allerdings nicht weiter bereinigt werden, da es für eben solche Zwecke entworfen wurde. Trotzdem könnten wir nun beispielsweise die ersten fünf Bilder des „train_set“ wie folgt anzeigen lassen, wozu wir z. B. in Python das Modul „pyplot“ aus der Bibliothek „matplotlib“ verwenden und „train_set“ aus den beiden Strukturen „train_set[0]“ für die eigentlichen Bilder und „train_set[1]“ für die Labels/ Bezeichnungen besteht.

Wie oben erwähnt, verwenden wir für das Transformieren des Trainings-Datasets und das Hochladen auf S3 den XGBoost-Algorithmus. Dieser erwartet für die Trainings-Eingabe Komma separierte Werte (CSV). Das Format der Trainings-Datasets ist numpy.array. Folgender Code wandelt das Dataset aus dem numpy.array-Format in ein CSV-Format um und lädt es auf das oben erzeugte S3-Bucket hoch.

%%time
import struct
import io
import csv
import boto3

def convert_data():
   data_partitions = [('train', train_set), ('validation', valid_set), ('test', test_set)]
   for data_partition_name, data_partition in data_partitions:
      print('{}: {} {}'.format(data_partition_name, data_partition[0].shape, data_partition[1].shape))
   labels = [t.tolist() for t in data_partition[1]]
   features = [t.tolist() for t in data_partition[0]]
   if data_partition_name != 'test':
      examples = np.insert(features, 0, labels, axis=1)
   else:
      examples = features

   #print(examples[50000,:])
   np.savetxt('data.csv', examples, delimiter=',')
   key = "{}/{}/examples".format(prefix,data_partition_name)
   url = 's3n://{}/{}'.format(bucket, key)
   boto3.Session().resource('s3').Bucket(bucket).Object(key).upload_file('data.csv')
   print('Done writing to {}'.format(url))
convert_data()

Die Trainings- und Testdaten wurden ins Amazon-S3-Bucket hochgeladen.
Die Trainings- und Testdaten wurden ins Amazon-S3-Bucket hochgeladen. (Bild: Drilling / Jupyter)

Bei Erfolg sollte der Ausgabe zu entnehmen sein, dass 50.000 Trainings-Datensätze, 10.000 Validierungs-Datensätze und 10.000 Test-Datensätze mit einer Größe von jeweils 784 (28x28 Pixel) oder „Neuronen“ (das neuromale Netz interpretiert die 784 Helligkeitswerte des Bildes als „Eingänge“ für den Input-Layer) erfolgreich auf das angegebene S3-Bucket hochgeladen wurden.

Trainieren eines Modells

Für das Trainieren, Bereitstellen und Validieren eines Modells in Amazon SageMaker können Nutzer wahlweise das Amazon SageMaker-Python-SDK oder das AWS SDK für Python (Boto3) benutzen. Optional klappt das natürlich auch direkt an der Python-Konsole, wir verwenden aber der Einfachheit halber wieder eine Notebook-Instance und eines der genannten SDKs.

Für den Anfang ist das Verwenden des SageMaker-Python-SDK von Amazon besser verständlich, da es eine Reihe von Implementierungsdetails abstrahiert und einfacher zu verwenden ist. Ob ein neuronales Netz überhaupt in der Lage ist, Vorhersagen zu machen und von welcher Güte diese sind, hängt von Trainieren des Modells mit geeigneten Trainingsdaten und Machine-Learning-Algorithmus ab.

Jeder ML-Algorithmus erstellt anhand von Beispieldaten eine allgemeine Lösung, die auch als „Modell“ bezeichnet wird. Diese muss möglichst gut zur zu beantwortenden Frage passen. Hat der Entwickler mithilfe von Beispieldaten ein Modell entwickelt, kann er dieses benutzen, um die gleiche Frage mit einem anderen (quasi „neuen“) Satz von Daten zu beantworten. Dieser Vorgang wird auch als Abrufen von Inferenzen (Schlussfolgern) bezeichnet.

Amazon SageMaker bringt bereits zahlreiche MachineLearning-Algorithmen, die man allgemeine für eine große Zahl von typischen Problemarten benutzen kann, wie z. B. Bildklassifikation, DeepAR-Prognosen, Factorization Machines, semantische Segmentierung oder den erwähnten XGBoost-Algorithmus

Allgemein lässt sich aber sagen, dass man das mittels eines Modells zu lösende Problem gut verstehen muss, denn das „Format“ Antwort wirkt sich auf den verwendeten Algorithmus aus. Möchte man etwa eine Mailing-Kampagne zur Gewinnung neuer Kunden mit Hilfe eines neuronalen Netzes steuern, muss man sich überlegen, welche Art von Antwort man anstrebt.

Denkbar sind z. B. Antworten, die in eine diskrete Kategorie passen wie „Hat der Kunde schon früher auf Marketing-Kampagnen geantwortet“ oder „Zu welchen Kundensegment gehört der Kunde“. Ein Algorithmus der sich gut für die diskrete Klassifikation eignet wäre dann entweder der erwähne XGBoost-Algorithmus oder der Algorithmus für lineares Lernen.

Im ersten Fall würde man z. B. für den XGBoost-Algorithmus den „objective“-Parameter auf „logistic“ setzen. Es sind aber auch quantitative Antworten denkbar wie „Was ist der zu erwartende ROI dieses Kunden in Bezug auf den ROI aus dem letzten Mailing. Hierzu könnte man ebenfalls den XGBoost-Algorithmus, allerdings mit dem objective-Parameter „linear“ verwenden.

Im nächsten Teil dieses Workshops befassen wir uns konkret mit dem Trainieren, Bereitstellen und Validieren eines Modells mit Hilfe von Amazon SageMaker.

Kommentare werden geladen....

Kommentar zu diesem Artikel

Der Kommentar wird durch einen Redakteur geprüft und in Kürze freigeschaltet.

Anonym mitdiskutieren oder einloggen Anmelden

Avatar
Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
  1. Avatar
    Avatar
    Bearbeitet von am
    Bearbeitet von am
    1. Avatar
      Avatar
      Bearbeitet von am
      Bearbeitet von am

Kommentare werden geladen....

Kommentar melden

Melden Sie diesen Kommentar, wenn dieser nicht den Richtlinien entspricht.

Kommentar Freigeben

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

Freigabe entfernen

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Kontaktieren Sie uns über: support.vogel.de/ (ID: 46129019 / Programmiersprachen)