XGBoost-Modell in der Cloud AI Platform erstellen, trainieren und bereitstellen

1. Übersicht

In diesem Lab durchlaufen Sie einen vollständigen ML-Workflow in der GCP. In einer Cloud AI Platform Notebooks-Umgebung nehmen Sie Daten aus einem öffentlichen BigQuery-Dataset auf, erstellen und trainieren ein XGBoost-Modell und stellen das Modell für Vorhersagen in AI Platform bereit.

Lerninhalte

Die folgenden Themen werden behandelt:

  • BigQuery-Dataset in AI Platform Notebooks aufnehmen und analysieren
  • XGBoost-Modell erstellen
  • XGBoost-Modell in AI Platform bereitstellen und Vorhersagen abrufen

Die Gesamtkosten für die Ausführung dieses Labs in Google Cloud betragen etwa 1$.

2. Richten Sie Ihre Umgebung ein.

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: Cloud AI Platform Models API aktivieren

Rufen Sie in der Cloud Console den Abschnitt „AI Platform-Modelle“ auf und klicken Sie auf „Aktivieren“, falls die API noch nicht aktiviert ist.

d0d38662851c6af3.png

Schritt 2: Compute Engine API aktivieren

Rufen Sie Compute Engine auf und wählen Sie Aktivieren aus, falls die API noch nicht aktiviert ist. Sie benötigen diese, um Ihre Notebook-Instanz zu erstellen.

Schritt 3: 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 neuesten Python-Instanztyp aus:

a81c82876c6c16f9.png

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

Schritt 4: XGBoost installieren

Nachdem Ihre JupyterLab-Instanz geöffnet wurde, müssen Sie das XGBoost-Paket hinzufügen.

Wählen Sie dazu im Launcher „Terminal“ aus:

28dcf2790ce77c96.png

Führen Sie dann den folgenden Befehl aus, um die neueste von AI Platform unterstützte Version von XGBoost zu installieren:

pip3 install xgboost==0.82

Öffnen Sie nach Abschluss des Vorgangs über den Launcher eine Python 3-Notebook-Instanz. Sie können jetzt mit Ihrem Notebook loslegen.

Schritt 5: 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 pandas as pd
import xgboost as xgb
import numpy as np

from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from google.cloud import bigquery

3. BigQuery-Dataset untersuchen

In BigQuery sind viele Datasets öffentlich verfügbar, damit Sie sie analysieren können. In diesem Lab verwenden wir das Dataset „Natality“ (Geburtenrate). Sie enthält Daten zu fast jeder Geburt in den USA über einen Zeitraum von 40 Jahren, einschließlich des Geburtsgewichts des Kindes und demografischer Informationen zu den Eltern. Wir verwenden eine Teilmenge der Merkmale, um das Geburtsgewicht eines Babys vorherzusagen.

Schritt 1: BigQuery-Daten in unser Notebook herunterladen

Wir verwenden die Python-Clientbibliothek für BigQuery, um die Daten in einen Pandas-DataFrame herunterzuladen. Das ursprüngliche Dataset ist 21 GB groß und enthält 123 Millionen Zeilen. Der Einfachheit halber verwenden wir nur 10.000 Zeilen aus dem Dataset.

Erstellen Sie die Abfrage und rufen Sie mit dem folgenden Code eine Vorschau des resultierenden DataFrames auf. Hier erhalten wir vier Merkmale aus dem ursprünglichen Dataset sowie das Gewicht des Babys (das unser Modell vorhersagen wird). Der Datensatz reicht viele Jahre zurück, aber für dieses Modell verwenden wir nur Daten ab dem Jahr 2000:

query="""
SELECT
  weight_pounds,
  is_male,
  mother_age,
  plurality,
  gestation_weeks
FROM
  publicdata.samples.natality
WHERE year > 2000
LIMIT 10000
"""
df = bigquery.Client().query(query).to_dataframe()
df.head()

Um eine Zusammenfassung der numerischen Features in unserem Dataset zu erhalten, führen Sie Folgendes aus:

df.describe()

Hier sehen wir den Mittelwert, die Standardabweichung, das Minimum und andere Messwerte für unsere numerischen Spalten. Zum Schluss holen wir noch einige Daten zur booleschen Spalte ab, die das Geschlecht des Babys angibt. Dazu können wir die Pandas-Methode value_counts verwenden:

df['is_male'].value_counts()

Das Dataset ist anscheinend nach Geschlecht fast 50/50 aufgeteilt.

4. Daten für das Training vorbereiten

In diesem Abschnitt teilen wir die Daten in Trainings- und Test-Datasets auf, um sie für das Training unseres Modells vorzubereiten.

Schritt 1: Labelspalte extrahieren

Entfernen Sie zuerst Zeilen mit Nullwerten aus dem Datensatz und mischen Sie die Daten:

df = df.dropna()
df = shuffle(df, random_state=2)

Extrahieren Sie als Nächstes die Labelspalte in eine separate Variable und erstellen Sie einen DataFrame mit nur den Features:

labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])

Wenn Sie das Dataset jetzt mit data.head() in der Vorschau ansehen, sollten die vier Features angezeigt werden, die wir für das Training verwenden.

Schritt 2: Kategoriale Merkmale in Ganzzahlen umwandeln

Da für XGBoost alle Daten numerisch sein müssen, müssen wir die Darstellung der Daten in der Spalte is_male ändern. Derzeit sind sie als „True“-/„False“-Strings angegeben. Das ist ganz einfach möglich, indem wir den Typ der Spalte ändern:

data['is_male'] = data['is_male'].astype(int)

Schritt 3: Daten in Trainings- und Test-Datasets aufteilen

Wir verwenden das train_test_split-Dienstprogramm von Scikit-Learn, das wir am Anfang des Notebooks importiert haben, um unsere Daten in Trainings- und Test-Datasets aufzuteilen:

x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)

Jetzt können wir unser Modell erstellen und trainieren.

5. Kurze Einführung in XGBoost

XGBoost ist ein Framework für maschinelles Lernen, das Entscheidungsbäume und Gradient Boosting verwendet, um Vorhersagemodelle zu erstellen. Dabei werden mehrere Entscheidungsbäume auf Grundlage des Scores, der mit verschiedenen Blattknoten in einem Baum verknüpft ist, zusammengefasst.

Das folgende Diagramm ist eine vereinfachte Visualisierung eines Ensemble-Baumnetzwerks für ein Modell, das bewertet, ob jemand ein bestimmtes Computerspiel mag oder nicht (aus der XGBoost-Dokumentation):

fb061cd8c8f69999.png

Warum verwenden wir XGBoost für dieses Modell? Während herkömmliche neuronale Netze bei unstrukturierten Daten wie Bildern und Texten am besten abschneiden, sind Entscheidungsbäume oft sehr gut für strukturierte Daten wie das Hypothekendataset geeignet, das wir in diesem Codelab verwenden.

6. XGBoost-Modell erstellen, trainieren und bewerten

Schritt 1: XGBoost-Modell definieren und trainieren

Das Erstellen eines Modells in XGBoost ist einfach. Wir verwenden die Klasse XGBRegressor, um das Modell zu erstellen, und müssen nur den richtigen objective-Parameter für unsere spezielle Aufgabe übergeben. Da wir einen numerischen Wert (Gewicht des Babys) vorhersagen möchten, verwenden wir ein Regressionsmodell. Wenn wir unsere Daten stattdessen in Gruppen einteilen würden, um festzustellen, ob ein Baby mehr oder weniger als 6 Pfund wiegt, würden wir ein Klassifizierungsmodell verwenden.

In diesem Fall verwenden wir reg:squarederror als Ziel des Modells.

Mit dem folgenden Code wird ein XGBoost-Modell erstellt:

model = xgb.XGBRegressor(
    objective='reg:linear'
)

Sie können das Modell mit einer Zeile Code trainieren, indem Sie die Methode fit() aufrufen und ihr die Trainingsdaten und Labels übergeben.

model.fit(x_train, y_train)

Schritt 2: Modell anhand von Testdaten bewerten

Wir können unser trainiertes Modell jetzt verwenden, um mit der Funktion predict() Vorhersagen für unsere Testdaten zu generieren:

y_pred = model.predict(x_test)

Sehen wir uns an, wie das Modell bei den ersten 20 Werten aus unserem Test-Dataset abgeschnitten hat. Unten sehen Sie das vorhergesagte und das tatsächliche Gewicht des Babys für jedes Testbeispiel:

for i in range(20):
    print('Predicted weight: ', y_pred[i])
    print('Actual weight: ', y_test.iloc[i])
    print()

Schritt 3: Modell speichern

Führen Sie den folgenden Code aus, um das Modell bereitzustellen und in einer lokalen Datei zu speichern:

model.save_model('model.bst')

7. Modell in Cloud AI Platform bereitstellen

Wir haben unser Modell lokal zum Laufen gebracht, aber es wäre schön, wenn wir von überall aus Vorhersagen treffen könnten (nicht nur in diesem Notebook). In diesem Schritt stellen wir sie in der Cloud bereit.

Schritt 1: Cloud Storage-Bucket für das Modell erstellen

Definieren wir zuerst einige Umgebungsvariablen, die wir im restlichen Codelab verwenden werden. Geben Sie unten den Namen Ihres Google Cloud-Projekts, den Namen des Cloud Storage-Buckets, den Sie erstellen möchten (muss global eindeutig sein), und den Versionsnamen für die erste Version Ihres Modells ein:

# Update these to your own GCP project, model, and version names
GCP_PROJECT = 'your-gcp-project'
MODEL_BUCKET = 'gs://storage_bucket_name'
VERSION_NAME = 'v1'
MODEL_NAME = 'baby_weight'

Jetzt können wir einen Storage-Bucket zum Speichern unserer XGBoost-Modelldatei erstellen. Wir verweisen Cloud AI Platform bei der Bereitstellung auf diese Datei.

Führen Sie diesen gsutil-Befehl in Ihrem Notebook aus, um einen Bucket zu erstellen:

!gsutil mb $MODEL_BUCKET

Schritt 2: Modelldatei in Cloud Storage kopieren

Als Nächstes kopieren wir die gespeicherte XGBoost-Modelldatei in Cloud Storage. Führen Sie den folgenden gsutil-Befehl aus:

!gsutil cp ./model.bst $MODEL_BUCKET

Rufen Sie den Storage-Browser in der Cloud Console auf, um zu prüfen, ob die Datei kopiert wurde:

31e2567fa0117214.png

Schritt 3: Modell erstellen und bereitstellen

Mit dem folgenden ai-platform-Befehl von gcloud wird ein neues Modell in Ihrem Projekt erstellt. Wir nennen sie xgb_mortgage:

!gcloud ai-platform models create $MODEL_NAME

Jetzt ist es an der Zeit, das Modell bereitzustellen. Dazu verwenden wir den folgenden gcloud-Befehl:

!gcloud ai-platform versions create $VERSION_NAME \
--model=$MODEL_NAME \
--framework='XGBOOST' \
--runtime-version=1.15 \
--origin=$MODEL_BUCKET \
--python-version=3.7 \
--project=$GCP_PROJECT

Während die Pipeline ausgeführt wird, können Sie den Abschnitt „Modelle“ in der AI Platform Console aufrufen. Dort sollte die Bereitstellung Ihrer neuen Version angezeigt werden:

a431661f9c3e6cb2.png

Wenn die Bereitstellung erfolgreich abgeschlossen ist, wird anstelle des rotierenden Ladesymbols ein grünes Häkchen angezeigt. Die Bereitstellung sollte 2 bis 3 Minuten dauern.

Schritt 4: Bereitgestelltes Modell testen

Um sicherzugehen, dass Ihr bereitgestelltes Modell funktioniert, testen Sie es mit gcloud, um eine Vorhersage zu treffen. Speichern Sie zuerst eine JSON-Datei mit zwei Beispielen aus unserem Testsatz:

%%writefile predictions.json
[0.0, 33.0, 1.0, 27.0]
[1.0, 26.0, 1.0, 40.0]

Testen Sie Ihr Modell, indem Sie die Ausgabe des folgenden gcloud-Befehls in einer Variablen speichern und ausgeben:

prediction = !gcloud ai-platform predict --model=$MODEL_NAME --json-instances=predictions.json --version=$VERSION_NAME
print(prediction.s)

In der Ausgabe sollte die Vorhersage Ihres Modells angezeigt werden. Das tatsächliche Gewicht des Babys beträgt in diesen beiden Beispielen 1,9 bzw. 8,1 Pfund.

8. 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:

879147427150b6c7.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.