Mit TensorFlow Enterprise und BigQuery ein Betrugserkennungsmodell auf der Cloud AI Platform erstellen

1. Übersicht

In diesem Lab nehmen Sie ein BigQuery-Dataset direkt auf und trainieren ein Modell zur Betrugserkennung mit TensorFlow Enterprise auf der Google Cloud AI Platform.

Lerninhalte

Die folgenden Themen werden behandelt:

  • Daten in BigQuery analysieren
  • Daten mit dem BigQuery-Connector in TensorFlow Enterprise aufnehmen
  • Deep-Learning-Modell zum Erkennen von Betrug mit einem unausgewogenen Dataset erstellen

2. Daten in BigQuery analysieren

Für dieses Codelab benötigen Sie ein Google Cloud Platform-Projekt mit aktivierter Abrechnung. Folgen Sie dieser Anleitung, um ein Projekt zu erstellen.

Schritt 1: Auf das öffentliche BigQuery-Dataset zugreifen

Über diesen Link können Sie in der Google Cloud Console auf öffentliche BigQuery-Datasets zugreifen.

Im Ressourcenbaum unten links sehen Sie eine Liste von Datasets. Suchen Sie in den verfügbaren Datasets nach ml-datasets und wählen Sie dann die Tabelle ulb-fraud-detection aus:

d5e78261514a90ef.png

Klicken Sie auf die einzelnen Tabs, um mehr über den Datensatz zu erfahren:

  • Auf dem Tab Schema werden die Datentypen beschrieben.
  • Auf dem Tab Details wird erläutert,dass es sich um einen unausgewogenen Datensatz mit 284.407 Transaktionen handelt, von denen 492 betrügerisch sind.
  • Auf dem Tab Vorschau werden Datensätze aus dem Dataset angezeigt.

Schritt 2: Tabelle abfragen

Auf dem Tab „Details“ finden wir folgende Informationen zu den Daten:

  • Zeit ist die Anzahl der Sekunden zwischen der ersten Transaktion im Dataset und der Zeit der ausgewählten Transaktion.
  • V1–V28 sind Spalten, die mithilfe einer Dimensionsreduktionstechnik namens PCA transformiert wurden, wodurch die Daten anonymisiert wurden.
  • Betrag ist der Transaktionsbetrag.

Klicken Sie auf Tabelle abfragen, um eine Abfrage auszuführen:

581e596426a98383.png

Aktualisieren Sie die Anweisung, um ein Sternchen (*) hinzuzufügen, damit alle Spalten angezeigt werden, und klicken Sie auf Ausführen.

SELECT * FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection` LIMIT 1000

Schritt 3: Daten analysieren

BigQuery bietet eine Reihe von statistischen Funktionen. Sehen wir uns an, wie die Daten mit der Zielvariablen Class korrelieren.

SELECT CORR(Time,Class) as TimeCorr, CORR(V1,Class) as V1Corr, CORR(V2,Class) as V2Corr, CORR(Amount,Class) as AmountCorr FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`

e1e98a8315b62e9e.png

Die Korrelation reicht von -1 (negativ korreliert) bis 1 (positiv korreliert). Bei 0 sind die Variablen unabhängig.

V1 und V2 weisen eine geringe Korrelation mit unserer Zielvariablen auf (etwa -0,1 bzw. 0,1).

Wir sehen keine große Korrelation mit Zeit. Eine leicht negative Korrelation könnte darauf hindeuten, dass im Laufe der Zeit weniger betrügerische Transaktionen im Datensatz vorhanden sind.

Der Betrag weist eine noch geringere Korrelation auf, was darauf hindeutet, dass betrügerische Transaktionen bei höheren Transaktionsbeträgen nur sehr geringfügig wahrscheinlicher sind.

Schritt 4: Mittelwerte für die Merkmalskalierung berechnen

Durch die Normalisierung von Feature-Werten kann ein neuronales Netzwerk schneller konvergieren. Ein gängiges Verfahren besteht darin, Werte mit einer Standardabweichung von 1 um 0 zu zentrieren. Mit der folgenden Abfrage werden die Mittelwerte abgerufen. Das Ergebnis muss nicht gespeichert werden, da wir später ein Code-Snippet dafür haben.

Die Abfrage enthält auch eine interessante WHERE-Klausel. Das wird im nächsten Abschnitt beschrieben, in dem es darum geht, wie die Daten in Trainings- und Testsets aufgeteilt werden.

SELECT
   AVG(Time), AVG(V1), AVG(V2), AVG(V3), AVG(V4), AVG(V5), AVG(V6), AVG(V7), AVG(V8),
   AVG(V9), AVG(V10),AVG(V11), AVG(V12), AVG(V13), AVG(V14), AVG(V15), AVG(V16),
   AVG(V17), AVG(V18), AVG(V19), AVG(V20), AVG(V21), AVG(V22), AVG(V23), AVG(V24),
   AVG(V25), AVG(V26), AVG(V27),AVG(V28), AVG(Amount)
FROM
   `bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE
   MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),
   SAFE_CAST(Amount AS STRING)))),10) < 8

Schritt 5: Daten aufteilen

Beim Erstellen eines Modells für maschinelles Lernen werden in der Regel 3 Datasets verwendet:

  • Training: Wird verwendet, um das Modell durch iteratives Anpassen von Parametern zu erstellen.
  • Validierung: Wird verwendet, um zu prüfen, ob das Modell überangepasst ist. Dazu werden während des Trainingsprozesses unabhängige Daten verwendet.
  • Test: Wird nach der Erstellung des Modells verwendet, um die Genauigkeit zu bewerten.

In diesem Codelab verwenden wir eine 80/10/10-Aufteilung für Training, Validierung und Tests.

Jedes Dataset wird in einer eigenen Tabelle in BigQuery gespeichert. Im ersten Schritt erstellen Sie ein BigQuery-Dataset, das als Container für zugehörige Tabellen dient. Wählen Sie Dataset erstellen aus, während Ihr Projekt ausgewählt ist.

1084d9f5edbf760b.png

Erstellen Sie dann ein Dataset mit dem Namen tfe_codelab, das die Trainings-, Validierungs- und Testtabellen enthält.

e5b8646ebdf5f272.png

Nun führen wir drei Abfragen für Training, Test und Validierung aus und speichern die Daten im neuen Dataset tfe_codelab.

Führen Sie im Abfrageeditor eine Abfrage aus, um die Trainingsdaten zu generieren:

SELECT *
FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),SAFE_CAST(Amount AS STRING)))),10) < 8

Wenn die Abfrage abgeschlossen ist, speichern Sie die Ergebnisse in einer BigQuery-Tabelle.

49d20c9b4b62f6a7.png

Geben Sie der Tabelle im Dataset tfe_codelab, das Sie gerade erstellt haben, den Namen ulb_fraud_detection_train und speichern Sie die Daten.

6d83cf113a0682e1.png

In der WHERE-Klausel werden die Daten zuerst aufgeteilt, indem ein Hash für einige Spalten berechnet wird. Anschließend werden Zeilen ausgewählt, in denen der Rest des Hashs bei Division durch 10 unter 80 liegt. Das entspricht 80%.

Wiederholen Sie nun denselben Vorgang für Validierungs- und Testsets mit ähnlichen Abfragen, mit denen jeweils 10% der Daten ausgewählt werden.

Validation

SELECT *
FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),SAFE_CAST(Amount AS STRING)))),10) = 8

Speichern Sie die Ergebnisse dieser Abfrage in einer Tabelle mit dem Namen ulb_fraud_detection_val.

Test

SELECT *
FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),SAFE_CAST(Amount AS STRING)))),10) = 9

Speichern Sie die Ergebnisse dieser Abfrage in einer Tabelle mit dem Namen ulb_fraud_detection_test.

3. Notebook-Umgebung einrichten

Nachdem wir uns die Daten kurz angesehen haben, richten wir nun unsere Umgebung für die Modellentwicklung ein.

Schritt 1: APIs aktivieren

Der BigQuery-Connector verwendet die BigQuery Storage API. Suchen Sie in der Konsole nach der BigQuery Storage API und aktivieren Sie sie, falls sie derzeit deaktiviert ist.

9895a2fd3cdf8f8c.png

Schritt 2: AI Platform Notebooks-Instanz erstellen

Rufen Sie in der Cloud Console den Abschnitt „AI Platform Notebooks“ auf und klicken Sie auf Neue Instanz. Wählen Sie dann den aktuellen Instanztyp TensorFlow Enterprise 1.x ohne GPUs aus:

35301141e9fd3f44.png

Übernehmen Sie die Standardoptionen und klicken Sie auf Erstellen. Nachdem die Instanz erstellt wurde, klicken Sie auf JupyterLab öffnen:

3b801f8ff3db0f2f.png

Erstellen Sie dann ein Python 3-Notebook in JupyterLab:

58523671a252b95a.png

4. Datensätze aus BigQuery aufnehmen

Schritt 1: Python-Pakete importieren

Fügen Sie in der ersten Zelle Ihres Notebooks die folgenden Importe hinzu und führen Sie die Zelle aus. Sie können es ausführen, indem Sie im oberen Menü auf die Rechtspfeiltaste oder auf die Tastenkombination „Befehl + Eingabetaste“ drücken:

import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers as layers

from tensorflow_io.bigquery import BigQueryClient

import functools

tf.enable_eager_execution()

Schritt 2: Konstanten definieren

Als Nächstes definieren wir einige Konstanten für die Verwendung im Projekt. Ersetzen Sie GCP_PROJECT_ID durch die tatsächliche Projekt-ID, die Sie verwenden. Führen Sie neue Zellen aus, sobald Sie sie erstellen.

GCP_PROJECT_ID = '<YOUR_PROJECT_ID>'
DATASET_GCP_PROJECT_ID = GCP_PROJECT_ID # A copy of the data is saved in the user project
DATASET_ID = 'tfe_codelab'
TRAIN_TABLE_ID = 'ulb_fraud_detection_train'
VAL_TABLE_ID = 'ulb_fraud_detection_val'
TEST_TABLE_ID = 'ulb_fraud_detection_test'

FEATURES = ['Time','V1','V2','V3','V4','V5','V6','V7','V8','V9','V10','V11','V12','V13','V14','V15','V16','V17','V18','V19','V20','V21','V22','V23','V24','V25','V26','V27','V28','Amount']
LABEL='Class'
DTYPES=[tf.float64] * len(FEATURES) + [tf.int64]

Schritt 3: Hilfsfunktionen definieren

Definieren wir nun einige Funktionen. Mit read_session() werden Daten aus einer BigQuery-Tabelle gelesen. extract_labels() ist eine Hilfsfunktion, mit der die Labelspalte vom Rest getrennt wird, sodass das Dataset später das von keras.model_fit() erwartete Format hat.

client = BigQueryClient()

def read_session(TABLE_ID):
    return client.read_session(
        "projects/" + GCP_PROJECT_ID, DATASET_GCP_PROJECT_ID, TABLE_ID, DATASET_ID,
        FEATURES + [LABEL], DTYPES, requested_streams=2
)

def extract_labels(input_dict):
  features = dict(input_dict)
  label = tf.cast(features.pop(LABEL), tf.float64)
  return (features, label)

Schritt 4: Daten aufnehmen

Erstellen wir nun die einzelnen Datasets und geben dann den ersten Batch aus dem Trainingsdataset aus. Wir haben eine BATCH_SIZE von 32 definiert. Dieser Parameter ist wichtig, da er sich auf die Geschwindigkeit und Genauigkeit des Trainings auswirkt.

BATCH_SIZE = 32

raw_train_data = read_session(TRAIN_TABLE_ID).parallel_read_rows().map(extract_labels).batch(BATCH_SIZE)
raw_val_data = read_session(VAL_TABLE_ID).parallel_read_rows().map(extract_labels).batch(BATCH_SIZE)
raw_test_data = read_session(TEST_TABLE_ID).parallel_read_rows().map(extract_labels).batch(BATCH_SIZE)

next(iter(raw_train_data)) # Print first batch

5. Modell erstellen

Schritt 1: Daten vorverarbeiten

Erstellen wir Feature-Spalten für jedes Feature im Dataset. In diesem Dataset sind alle Spalten vom Typ numeric_column, es gibt aber auch eine Reihe anderer Spaltentypen,z.B. „categorical_column“.

Wie bereits erwähnt, werden wir die Daten auch normieren, sodass sie um null zentriert sind. Dadurch konvergiert das Netzwerk schneller. Wir haben die Mittelwerte der einzelnen Funktionen für diese Berechnung vorab berechnet.

MEANS = [94816.7387536405, 0.0011219465482001268, -0.0021445914636999603, -0.002317402958335562,
         -0.002525792169927835, -0.002136576923287782, -3.7586818983702984, 8.135919975738768E-4,
         -0.0015535579268265718, 0.001436137140461279, -0.0012193712736681508, -4.5364970422902533E-4,
         -4.6175444671576083E-4, 9.92177789685366E-4, 0.002366229151475428, 6.710217226762278E-4,
         0.0010325807119864225, 2.557260815835395E-4, -2.0804190062322664E-4, -5.057391100818653E-4,
         -3.452114767842334E-6, 1.0145936326270006E-4, 3.839214074518535E-4, 2.2061197469126577E-4,
         -1.5601580596677608E-4, -8.235017846415852E-4, -7.298316615408554E-4, -6.898459943652376E-5,
         4.724125688297753E-5, 88.73235686453587]

def norm_data(mean, data):
  data = tf.cast(data, tf.float32) * 1/(2*mean)
  return tf.reshape(data, [-1, 1])

numeric_columns = []

for i, feature in enumerate(FEATURES):
  num_col = tf.feature_column.numeric_column(feature, normalizer_fn=functools.partial(norm_data, MEANS[i]))
  numeric_columns.append(num_col)

numeric_columns

Schritt 2: Modell erstellen

Jetzt können wir ein Modell erstellen. Die Spalten, die wir gerade erstellt haben, werden in das Netzwerk eingespeist. Dann kompilieren wir das Modell. Wir fügen die Precision/Recall-AUC-Messwerte ein, die für unausgewogene Datasets nützlich sind.

model = keras.Sequential([
    tf.keras.layers.DenseFeatures(numeric_columns),
    layers.Dense(64, activation='relu'),
    layers.Dense(64, activation='relu'),
    layers.Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy', tf.keras.metrics.AUC(curve='PR')])

Schritt 3: Modell trainieren

Es gibt verschiedene Verfahren zum Umgang mit unausgewogenen Daten, darunter Oversampling (Generieren neuer Daten in der Minderheitenklasse) und Undersampling (Reduzieren der Daten in der Mehrheitsklasse).

In diesem Codelab verwenden wir eine Technik, bei der der Verlust bei einer Falschklassifizierung der Minderheitsklasse übergewichtet wird. Wir geben beim Training einen „class_weight“-Parameter an und gewichten „1“ (Betrug) höher, da er viel seltener vorkommt.

In diesem Lab verwenden wir drei Epochen (Durchläufe durch die Daten), damit das Training schneller geht. In der Praxis würden wir den Vorgang so lange ausführen, bis die Genauigkeit des Validierungssets nicht mehr steigt.

CLASS_WEIGHT = {
    0: 1,
    1: 100
}
EPOCHS = 3

train_data = raw_train_data.shuffle(10000)
val_data = raw_val_data
test_data = raw_test_data

model.fit(train_data, validation_data=val_data, class_weight=CLASS_WEIGHT, epochs=EPOCHS)

Schritt 4: Modell bewerten

Die Funktion „evaluate()“ kann auf Testdaten angewendet werden, die dem Modell noch nie präsentiert wurden, um eine objektive Bewertung zu ermöglichen. Glücklicherweise haben wir Testdaten genau für diesen Zweck reserviert.

model.evaluate(test_data)

Schritt 5: Untersuchung

In diesem Lab haben wir gezeigt, wie Sie ein großes Dataset aus BigQuery direkt in ein TensorFlow Keras-Modell aufnehmen. Außerdem haben wir alle Schritte zum Erstellen eines Modells durchlaufen. Zuletzt haben wir etwas darüber gelernt, wie wir mit unausgewogenen Klassifizierungsproblemen umgehen.

Sie können ruhig mit verschiedenen Architekturen und Ansätzen für den unausgewogenen Datensatz experimentieren, um zu sehen, ob Sie die Genauigkeit verbessern können.

6. Bereinigen

Wenn Sie dieses Notebook weiterhin verwenden möchten, empfehlen wir, es auszuschalten, wenn Sie es nicht verwenden. Wählen Sie in der Notebooks-Benutzeroberfläche in der Cloud Console das Notebook und dann Beenden aus:

57213ef2edad9257.png

Wenn Sie alle Ressourcen löschen möchten, die Sie in diesem Lab erstellt haben, löschen Sie einfach die Notebook-Instanz, anstatt sie zu beenden.

Rufen Sie in der Cloud Console über das Navigationsmenü „Storage“ auf und löschen Sie die beiden Buckets, die Sie zum Speichern Ihrer Modell-Assets erstellt haben.