AWS Germany – Amazon Web Services in Deutschland

Klassifizierung von Finanztransaktionen mit Amazon SageMaker Feature Store

von Maurits de Groot und Elina Lesyk

Einführung

Machine Learning (ML) wird in der Finanzdienstleistungsbranche umfangreich für Aufgaben wie Personalisierung, Anomalie- oder Betrugserkennung eingesetzt. Wie bei anderen ML-Anwendungsfällen sind qualitativ hochwertige Eingabedaten der Schlüssel für eine gute Leistung eines Modells. Um dem Modell mehr Kontext zu geben und seine Leistung zu verbessern, ist es üblich, Datensätze anzureichern und zusätzliche Features zu generieren.

Dieser Blogbeitrag zeigt, wie Amazon SageMaker verwendet wird, um Zahlungen durch die Vorhersage der Transaktionskategorie zu klassifizieren, z. B. „Haushalt“, „Elektronik“, „Bildung“ usw. Die Ergebnisse einer solchen Klassifizierung können das Kundenerlebnis durch einen Überblick über das Ausgabeverhalten der Verbraucher verbessern. Außerdem kann das trainierte Modell Teil komplexerer maschineller Lösungen sein und andere Modelle, die ähnliche Aufgaben erfüllen, ergänzen.

Um das Modell zu trainieren, werden wir Amazon SageMaker verwenden, einen vollständig verwalteten Service, der es Data Scientists ermöglicht, ML-Modelle zu trainieren, zu erstellen und einzusetzen. Er unterstützt den gesamten ML-Workflow von der Kennzeichnung Ihrer Daten bis zur Ausführung der Modelle in der Produktion, indem er Inferenzendpunkte bereitstellt.

Die Lösung im Überblick

In diesem Blogpost werden wir eine Reihe von Komponenten von Amazon SageMaker nutzen. Wir beginnen mit der Vorbereitung der Daten, indem wir sie sammeln, transformieren und im Amazon SageMaker Feature Store speichern. Der Feature Store fungiert als zentrales Repository für Metadaten und erstellte Features. Seine Grundeinheit ist eine Feature-Gruppe, die eine Feature-Sammlung umfasst, in der, ähnlich einer Datenbanktabelle, jede Spalte ein Feature darstellt, und jede Zeile einen eindeutigen Bezeichner, wie Name oder ID, hat.

Die Hauptvorteile des Feature Store sind wie folgt:

  1. Konsistenz zwischen Teams und Modellen durch Zugriff auf ein zentrales Feature-Repository
  2. Vermeidung von wiederholter Feature-Vorbereitung und -Erstellung
  3. Versionsverfolgung, um den Zugang zu Features auf dem neuesten Stand zu gewährleisten

Anschließend erstellen und trainieren wir das Modell. In diesem Beispiel wird der in SageMaker integrierte Extreme Gradient Boosting (XGBoost)-Algorithmus verwendet. Sie können jedoch das Modell Ihrer Wahl trainieren oder den Trainingscode des Modells anpassen. Weitere Informationen zu diesem Ansatz finden Sie in dem Blogbeitrag Bring your own model with Amazon SageMaker. Zum Trainieren des Modells verwenden wir einen Amazon SageMaker Training Job, der eine containerisierte End-to-End-Schnittstelle erzeugt, die für ein effizientes Modell-Training und -Validierung aufgerufen werden kann.

Nachdem wir das Modell trainiert haben, müssen wir es zur Verwendung bereitstellen. Die Inferenz kann in Echtzeit oder im Batch-Modus durchgeführt werden. Wir haben uns für einen Echtzeit-Inferenz-Endpunkt entschieden, da dieser Endpunkt eine Latenzzeit von Millisekunden bietet. Er ist beständig, so dass er für künftige Vorhersagen wiederverwendet werden kann.

Die Lösung im Detail

Die in diesem Blogpost vorgestellte Lösung wird von ausführbarem Code in Form eines Jupyter Notebooks begleitet, den Sie im Amazon SageMaker-Beispiel-Repository auf GitHub finden. Diesem Blog können Sie auch folgen, ohne auf das Code-Beispiel zuzugreifen. Wir empfehlen Ihnen aber, sich den Code für einen vollständigeren Überblick unserer Lösung anzusehen.

Der Code bietet ein Beispiel dafür, wie die Klassifizierung von Finanztransaktionen zur Anreicherung Ihres Datensatzes verwendet werden kann. Außerdem können Sie das Notebook an Ihren eigenen Anwendungsfall anpassen. Bei dem verwendeten Datensatz handelt es sich um synthetische Daten, die für diesen Blogbeitrag generiert wurden. Es wird nicht empfohlen, den Datensatz zum Trainieren eines in der Produktion verwendeten Modells zu verwenden.

In dieser Schritt-für-Schritt-Anleitung behandeln wir die folgenden Punkte:

  • Den Datensatz von Amazon S3 abrufen
  • SageMaker Feature Store erstellen und Schema definieren
  • Modell erstellen
  • SageMaker Endpoint bereitstellen
  • Aufräumen.

Voraussetzungen

Um diese Schritte erfolgreich durchzuführen, stellen Sie sicher, dass Sie über ein AWS-Konto mit einer Amazon SageMaker Studio-Domäne verfügen. Wenn Sie Hilfe bei der Erstellung der Amazon SageMaker-Domäne benötigen, werden die Schnell- oder Standardeinrichtungen hier beschrieben. Diese Lösung besteht aus einem Jupyter Notebook, das Sie in Ihrer Domäne ausführen können.

Datensatz von Amazon S3 abrufen

Für dieses Beispiel verwenden wir einen synthetisch erzeugten Datensatz. Um den Datensatz aus dem öffentlichen S3-Bucket sagemaker-sample-files abzurufen, verwenden wir das AWS-Befehlszeilenschnittstelle (CLI). Der folgende Befehl kopiert die Daten aus dem S3-Bucket:

!aws s3 cp s3://sagemaker-sample-files/datasets/tabular/synthetic_financial/financial_transactions_mini.csv

Wir verwenden die Python-Bibliothek pandas zur Vorverarbeitung des abgerufenen Datensatzes. In diesem Fall umfasst der Vorverarbeitungsschritt die Extraktion von Tag, Monat, Jahr und Sekunde, Minute und Stunde aus dem Zeitstempel. Außerdem ersetzen wir die Transaktionskategorie durch einen numerischen Wert, z. B. 1 für „Unterhaltung“, 3 für „Einkaufen“, 6 für „Essen und Trinken“, 10 für „Auto und Transport“.

data = pd.read_csv(
    "financial_transactions_mini.csv",
    parse_dates=["timestamp"],
    infer_datetime_format=True,
    dtype={"transaction_category": "string"},
)

Nach dem Laden des Beispieldatensatzes und der Vorverarbeitung sieht das Ergebnis wie folgt aus:

transaction_category receiver_id sender_id amount year month day hour minute second
10 4754811985421361 4385369672020654 160.16 2021 1 25 14 53 37
1 4303021633278488 4786022312794320 37.93 2021 2 10 20 7 12
3 4802038307784456 4934000867624630 100.89 2021 4 12 23 4 55
6 4486178141236447 4833768798260318 104.65 2021 2 6 15 32 19
6 4563254037187733 4757905939295660 76.2 2021 4 7 20 13 41

SageMaker Feature Store erstellen und Schema definieren

Wir verwenden SageMaker Feature Store, um den Durchschnittswert des Transaktionsbetrags pro Kategorie zu speichern. Mit diesen Informationen können wir zusätzliche Features erstellen, wie z.B. die Differenz zwischen dem Transaktionsbetrag und dem Durchschnitt pro Transaktionskategorie. Mit dem SageMaker Feature Store können wir ein zentrales Feature-Repository erstellen, das für mehrere Modelle wiederverwendet werden kann.

Beim Erstellen des Feature Stores beginnen wir mit der Definition unserer feature_group. Dies ist eine Ressource, die die Metadaten für alle in SageMaker Feature Store gespeicherten Daten enthält. Um diese feature_group zu erstellen, benötigen wir einen feature_group_name und die sagemaker_session. Die SageMaker Session verwaltet die Interaktionen mit der SageMaker API oder anderen AWS Services.

feature_group = FeatureGroup(
    name = "MyFeatureGroupName",
    sagemaker_session = sagemaker_session
)

Nachdem wir unsere Feature-Gruppe definiert haben, müssen wir die Feature-Definitionen festlegen. Diese Definitionen bestehen aus dem Namen und dem Datentyp des Features. Feature-Definitionen sind vergleichbar mit dem Schema, das in einer Datenbank verwendet wird. Die folgenden vier Features werden wir in unserem Feature Store erstellen und regelmäßig aktualisieren.

  1. Das Feld mean_amount wird benötigt, um die Differenz zwischen dem Durchschnitt pro Kategorie und dem aktuellen Betrag zu berechnen.
  2. Die Angabe count gibt an, wie viele Transaktionen wir zur Berechnung des durchschnittlichen Betrags verwendet haben. Dies ist notwendig, um den Durchschnittsbetrag zu aktualisieren.
  3. Das Feld EventTime gibt an, wann die Zeile das letzte Mal aktualisiert wurde und stellt die Zeitstempel im Unix-Zeitformat dar.
  4. Die Angabe identifier entspricht dem numerischen Wert der Transaktionskategorie.

Für unser Beispiel sieht der DataFrame feature_store_data mit diesen 4 Features wie folgt aus:

mean_amount count identifier EventTime
494.77333 466 0 1663320000
51.20585 14513 1 1663320000
850.01101 745 2 1663320000
100.91453 33954 3 1663320000

Wir setzen die Feature-Group-Definitionen, indem wir die Funktion load_feature_definitions und einen Pandas DataFrame aufrufen. Darüber hinaus leitet SageMaker die Datentypen aus dem DataFrame ab.

feature_group.load_feature_definitions(data_frame=feature_store_data)

Nachdem wir nun ein Objekt definiert haben, können wir einen API-Aufruf tätigen, um eine Gruppe im Feature Store zu erstellen und alle Ressourcen bereitzustellen. Zu diesem Zweck müssen wir eine Reihe von Parametern festlegen. Die s3_uri definiert den Pfad des Offline-Speichers, d. h. den Ort, an dem historische Daten gespeichert werden. Mit record_identifier_name können Sie den Namen des identifizierenden Features angeben. In ähnlicher Weise wird die letzte Aktualisierung des Feature Store durch event_time_feature_name definiert. Um ausreichende Berechtigungen sicherzustellen, wird in role_arn eine AWS Identity and Access Management (IAM) Rolle angenommen. Schließlich wird enable_online_store auf True gesetzt, um den Online-Speicher zu aktivieren. Der Online-Speicher bietet sofortigen Zugriff auf die neuesten Werte der Features und eignet sich daher für Vorhersage- und Inferenzszenarien in Echtzeit. Dieser API-Aufruf kann bis zu ein paar Minuten dauern.

feature_group.create(
    s3_uri=f"s3://{s3_bucket}/{bucket_prefix}",
    record_identifier_name=record_identifier_feature_name,
    event_time_feature_name="EventTime",
    role_arn=role,
    enable_online_store=True,
)

So haben wir die berechneten Durchschnittsbeträge pro Transaktion in einem DataFrame namens feature_store_data gespeichert. Die Werte aus feature_store_data werden in die feature_group aufgenommen, sobald die feature_group verfügbar ist.

feature_group.ingest(data_frame=feature_store_data, max_workers=3, wait=True)

Mit den Daten, die nun in der Feature Group gespeichert sind, können wir unseren aktuellen Datensatz sowie zukünftige Datensätze anreichern.

Modell erstellen

In diesem Anwendungsfall haben wir uns entschieden, das SageMaker-Image für den Extreme Gradient Boosting (XGBoost)-Algorithmus zu verwenden. Wir haben uns für dieses Modell aufgrund seiner relativ kurzen Trainingszeit und seiner erklärbaren Vorhersagen entschieden. Alternativ zu XGBoost können Sie auch andere eingebaute Amazon SageMaker-Algorithmen verwenden oder ein eigenes Modell einbringen.

container = sagemaker.image_uris.retrieve(
    region=region, # for example "eu-west-1"
    framework="xgboost",
    version="1.2-2"
)

Nach der Auswahl eines Containers wird der SageMaker-Estimator für das Modelltraining verwendet. Dieser Estimator benötigt den Container, um den Algorithmus auszuführen. Des Weiteren definieren wir eine IAM-Rolle, welche die notwendigen Berechtigungen beinhaltet. Die Angabe instance_count definiert die Anzahl der Maschinen, die für die Ausführung des Containers verwendet werden. Der Typ der Instanz kann durch die Angabe von instance_type definiert werden. In unserem Fall wählen wir eine ml.m4.xlarge-Instanz , basierend auf dem verfügbaren Speicher und der Rechenleistung, die für unseren Datensatz und das Modell erforderlich sind. Wir speichern die Ausgabe des Modells in dem in der Variable output_path gewählten Pfad.

xgb = sagemaker.estimator.Estimator(
    container,
    role,
    instance_count=1,
    instance_type="ml.m4.xlarge",
    output_path="s3://{}/{}/output".format(s3_bucket, bucket_prefix),
    sagemaker_session=sagemaker_session,
)

Nachdem wir das Modell definiert haben, verwenden wir die Funktion fit, um das Modell-Training zu starten. Diese Funktion benötigt die Pfadangaben der Trainings- und Validierungsdaten. Die Definition der Eingabedaten erfolgt durch s3_input_train und s3_input_validation, beides sind SageMaker Inputs.

xgb.fit({"train": s3_input_train, "validation": s3_input_validation})

Um die Leistung des Modells zu verbessern, können Sie SageMaker Experiments verwenden, um verschiedene Modelle und (Hyper)Parameterkonfigurationen zu vergleichen.

Bereitstellung des Amazon SageMaker-Endpunkts

Um das nun trainierte Modell zu verwenden, müssen wir zunächst einen Endpunkt bereitstellen. Mit diesem Endpunkt lassen sich Vorhersagen für ungesehene Daten erstellen. In unserem Fall werden wir dafür einen Testdatensatz hernehmen. Ein Endpunkt kann mit Hilfe der Deployment-Funktion des Estimators erstellt werden. Zur Definition der Anzahl an Instanzen für diesen Endpunkt müssen wir nun das Feld initial_instance_count setzen. Wie beim Training muss auch hier der instance_type festgelegt werden, wobei es sich um einen anderen Instanztyp handeln kann. Um die Daten für den Inferenz-Endpunkt zu kodieren, kann mit der Variable serializer ein Serializer gesetzt werden. Da wir tabellarische Daten im CSV-Format verwenden, wird der Serializer auf sagemaker.serializers.CSVSerializer() gesetzt.

xgb_predictor = xgb.deploy(
     initial_instance_count=1,
     instance_type="ml.m4.xlarge",
     serializer=sagemaker.serializers.CSVSerializer(),
)

Für Demonstrationszwecke ist ein Inferenzendpunkt mit einer einzigen Instanz ausreichend. Bei der Verwendung in einer Produktionsumgebung kann sich diese Anforderung ändern. Um Inferenzen in großem Umfang auszuführen, können die Endpunkte so konfiguriert werden, dass sie automatisch mit der Nachfrage skalieren. Eine weitere Option ist der Einsatz von serverlosen Inferenzendpunkten, die eine einfachere Bereitstellung und Skalierung von Workloads ermöglichen und die Kaltstarts verringern. Da wir für diesen Blogpost generierte Daten verwenden, werden wir nicht näher auf die Ergebnisse unseres trainierten Modells eingehen.

Aufräumen

Im Notebook können die erstellte SageMaker Feature Store Gruppe und der SageMaker Endpunkt mit folgendem Code entfernt werden.

feature_group.delete()
xgb_predictor.delete_endpoint(delete_endpoint_config=True)

Um zukünftige Gebühren zu vermeiden, empfehlen wir, die Ressourcen, einschließlich Notebooks, Terminals, Kernels und Instanzen, zu löschen.

Schlussfolgerung

In diesem Blogbeitrag haben wir gezeigt, wie man von Grund auf ein ML-Klassifizierungsmodell mit Finanzzahlungsdaten erstellt. Wir haben SageMaker Studio in Kombination mit SageMaker Feature Store verwendet, um die Konsistenz der Daten und die Wiederverwendbarkeit der Datenvorverarbeitungsschritte für andere Modelle innerhalb verschiedener ML-Teams zu gewährleisten. Ein bestehendes Modell kann erweitert und in anderen ML-Anwendungsfällen und Workflows über SageMaker Endpoints verwendet werden.

Mit Hilfe von SageMaker Studio haben wir die Kategorie der Finanztransaktionen vorhergesagt und die Finanzdaten der Kunden angereichert. SageMaker Studio bietet vollständige Kontrolle und Transparenz für jeden Schritt im Entwicklungsworkflow zum Trainieren, Erstellen und Bereitstellen von Modellen. Dies kann sowohl zu Experimentierzwecken als auch in einer groß angelegten Produktionsumgebung erfolgen.

Weitere Beispiele für die Anwendung von ML in der Finanzdienstleistungsbranche finden Sie in diesem Artikel. Er beschreibt die Anwendung von Amazon SageMaker Notebooks in verschiedenen Anwendungsfällen für Finanzdienstleistungen. Entdecken Sie außerdem in diesem umfangreichen Repository weitere Amazon SageMaker-Beispiele für verschiedenste Lösungen.

Über die Autoren

Maurits de Groot Maurits de Groot ist Solutions Architect bei Amazon Web Services mit Sitz in Amsterdam. Er arbeitet gerne an Themen rund um maschinelles Lernen und hat eine Vorliebe für Startups. In seiner Freizeit fährt er gerne Ski und spielt Squash.
Elina Lesyk Elina Lesyk ist Solutions Architect mit Sitz in München. Ihr Fokus liegt auf Unternehmenskunden aus der Finanzdienstleistungsbranche. In ihrer Freizeit lernt Elina gerne Gitarrentheorie auf Spanisch, um ihre Kenntnisse zu vertiefen, und geht joggen.