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. Aus 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 in AI Platform für Vorhersagen 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.

Sie benötigen ein Google Cloud Platform-Projekt mit aktivierter Abrechnung, um dieses Codelab auszuführen. Eine Anleitung zum Erstellen eines Projekts finden Sie hier.

Schritt 1: Cloud AI Platform Models API aktivieren

Rufen Sie den Bereich „AI Platform Models“ in der Cloud Console 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 sie, um Ihre Notebookinstanz zu erstellen.

Schritt 3: AI Platform Notebooks-Instanz erstellen

Rufen Sie den Bereich AI Platform Notebooks in der Cloud Console auf und klicken Sie auf Neue Instanz. Wählen Sie dann den neuesten Python-Instanztyp aus:

a81c82876c6c16f9.png

Verwenden Sie die Standardoptionen und klicken Sie auf Erstellen. Nachdem die Instanz erstellt wurde, wählen Sie JupyterLab öffnen aus:

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 Version von XGBoost zu installieren, die von AI Platform unterstützt wird:

pip3 install xgboost==0.82

Öffnen Sie danach im Launcher eine Python 3-Notebookinstanz. Sie können jetzt in 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 sie ausführen, indem Sie im oberen Menü auf die Rechtspfeiltaste oder 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. In diesem Lab verwenden wir das Dataset „natality“. Es 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 des Babys. 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. Um es einfach zu halten,verwenden wir nur 10.000 Zeilen aus dem Dataset.

Erstellen Sie die Abfrage und sehen Sie sich den resultierenden DataFrame mit dem folgenden Code an. Hier rufen wir vier Merkmale aus dem ursprünglichen Dataset sowie das Gewicht des Babys ab (das, was unser Modell vorhersagen soll). Das Dataset 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()

Führen Sie den folgenden Befehl aus, um eine Zusammenfassung der numerischen Merkmale in unserem Dataset zu erhalten:

df.describe()

Hier werden der Mittelwert, die Standardabweichung, das Minimum und andere Messwerte für unsere numerischen Spalten angezeigt. Zum Schluss rufen wir noch einige Daten zu unserer booleschen Spalte ab, die das Geschlecht des Babys angibt. Dazu können wir die Methode value_counts von Pandas verwenden:

df['is_male'].value_counts()

Das Dataset ist nach Geschlecht fast 50/50 ausgewogen.

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 Dataset 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 unseren Merkmalen:

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

Wenn Sie jetzt mit data.head() eine Vorschau unseres Datasets aufrufen, sollten die vier Merkmale zu sehen sein, die wir für das Training verwenden.

Schritt 2: Kategoriale Merkmale in Ganzzahlen umwandeln

Da XGBoost alle Daten in numerischer Form benötigt, müssen wir die Darstellung der Daten in der Spalte is_male ändern. Derzeit sind sie als „True“/„False“-Strings dargestellt. Dazu ändern wir einfach den Typ dieser Spalte:

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

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

Wir verwenden das Tool train_test_split 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 der Grundlage des Scores kombiniert, der mit verschiedenen Blattknoten in einem Baum verknüpft ist.

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 die besten Ergebnisse erzielen, schneiden Entscheidungsbäume oft bei strukturierten Daten wie dem Hypothekendatensatz, den wir in diesem Codelab verwenden, sehr gut ab.

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 Parameter objective für unsere spezifische Aufgabe übergeben. Hier verwenden wir ein Regressionsmodell, da wir einen numerischen Wert vorhersagen (Gewicht des Babys). Wenn wir stattdessen unsere Daten in Gruppen einteilen würden, um zu ermitteln, 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 unseres Modells.

Mit dem folgenden Code wird ein XGBoost-Modell erstellt:

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

Sie können das Modell mit einer Codezeile 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 jetzt unser trainiertes Modell verwenden, um mit der Funktion predict() Vorhersagen zu unseren Testdaten zu treffen:

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 geben wir das vorhergesagte Gewicht des Babys zusammen mit dem tatsächlichen Gewicht für jedes Testbeispiel aus:

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

Schritt 3: Modell speichern

Um das Modell bereitzustellen, führen Sie den folgenden Code aus, um es in einer lokalen Datei zu speichern:

model.save_model('model.bst')

7. Modell in Cloud AI Platform bereitstellen

Unser Modell funktioniert lokal, aber es wäre schön, wenn wir Vorhersagen von überall aus treffen könnten (nicht nur in diesem Notebook). In diesem Schritt stellen wir es in der Cloud bereit.

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

Definieren wir zuerst einige Umgebungsvariablen, die wir im Rest des Codelabs verwenden. Ersetzen Sie die Werte unten durch 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:

# 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 erstellen, um unsere XGBoost-Modelldatei zu speichern. 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 unsere 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-gcloud-Befehl wird ein neues Modell in Ihrem Projekt erstellt. Wir nennen es xgb_mortgage:

!gcloud ai-platform models create $MODEL_NAME

Jetzt ist es an der Zeit, das Modell bereitzustellen. Dazu verwenden wir diesen 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 der Ausführung können Sie den Bereich „Modelle“ in der AI Platform-Konsole aufrufen. Dort sollte die Bereitstellung Ihrer neuen Version zu sehen sein:

a431661f9c3e6cb2.png

Wenn die Bereitstellung abgeschlossen ist, wird das Wartesymbol durch ein grünes Häkchen ersetzt. Die Bereitstellung sollte 2–3 Minuten dauern.

Schritt 4: Bereitgestelltes Modell testen

Um zu prüfen, ob 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 Test-Dataset:

%%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 zu sehen sein. Das tatsächliche Gewicht der Babys für diese beiden Beispiele beträgt 1,9 bzw. 8,1 Pfund.

8. Bereinigen

Wenn Sie dieses Notebook weiterhin verwenden möchten, sollten Sie es ausschalten, wenn es nicht verwendet wird. Wählen Sie in der Notebooks-UI in der Cloud Console das Notebook aus und wählen Sie dann Beenden aus:

879147427150b6c7.png

Wenn Sie alle in diesem Lab erstellten Ressourcen löschen möchten, löschen Sie einfach die Notebookinstanz, anstatt sie zu beenden.

Rufen Sie im Navigationsmenü der Cloud Console „Storage“ auf und löschen Sie beide Buckets, die Sie zum Speichern Ihrer Modellassets erstellt haben.