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

1. Übersicht

In diesem Lab lernen Sie einen vollständigen ML-Workflow auf der GCP kennen. 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 die Vorhersage 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 das Lab in Google Cloud belaufen sich auf 1$.

2. Richten Sie Ihre Umgebung ein.

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

Schritt 1: Cloud AI Platform Models API aktivieren

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

d0d38662851c6af3.png

Schritt 2: Compute Engine API aktivieren

Gehen Sie zu Compute Engine und wählen Sie Aktivieren aus, falls dies noch nicht geschehen ist. Sie benötigen dies zum Erstellen Ihrer Notebookinstanz.

Schritt 3: AI Platform Notebooks-Instanz erstellen

Rufen Sie in der Cloud Console den Bereich AI Platform Notebooks 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 dann auf Erstellen. Nachdem die Instanz erstellt wurde, wählen Sie JupyterLab öffnen aus:

Schritt 4: XGBoost installieren

Nachdem die 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 anschließend eine Python 3-Notebookinstanz im Launcher. Jetzt können Sie in Ihrem Notizbuch 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 ihn ausführen, indem Sie im oberen Menü den Rechtspfeil oder Befehlstaste + 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

Mit BigQuery können Sie zahlreiche Datasets öffentlich analysieren. In diesem Lab verwenden wir das Dataset zur Geburtenrate (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 demografische Informationen über die Eltern des Babys. Wir verwenden eine Untergruppe dieser Funktionen, 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 sehen Sie sich eine Vorschau des resultierenden DataFrames mit dem folgenden Code an. Hier erhalten wir vier Merkmale aus dem ursprünglichen Dataset sowie das Babygewicht (das, was unser Modell vorhersagt). Das Dataset reicht viele Jahre zurück, aber für dieses Modell verwenden wir nur Daten aus der Zeit nach 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 die numerischen Spalten angezeigt. Zum Schluss rufen wir einige Daten in der booleschen Spalte ab, die das Geschlecht des Babys angeben. Mit dem Pandas-Tool value_counts-Methode:

df['is_male'].value_counts()

Sieht so aus, als wäre das Dataset zu 50:50 nach Geschlecht 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

Löschen Sie zuerst Zeilen mit Nullwerten aus dem Dataset und mischen die Daten nach dem Zufallsprinzip um:

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, der nur unsere Features enthält:

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

Wenn Sie jetzt eine Vorschau des Datasets mit data.head() ausführen, sollten Sie die vier Features sehen, die wir für das Training verwenden werden.

Schritt 2: Kategoriale Merkmale in Ganzzahlen umwandeln

Da bei XGBoost alle Daten numerisch sein müssen, müssen wir ändern, wie die Daten in der Spalte is_male dargestellt werden. Das sind aktuell die Strings „Wahr“ und „Falsch“. Dazu ändern wir einfach den Typ der Spalte:

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

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

Wir verwenden das Dienstprogramm train_test_split von Scikit Learn, das wir am Anfang des Notebooks importiert haben, um unsere Daten in Trainings- und Testsets 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. Eine 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 basierend auf dem Wert zusammengefasst, der den verschiedenen Blattknoten in einem Baum zugeordnet ist.

Das folgende Diagramm zeigt eine vereinfachte Visualisierung eines Ensemble-Baum-Netzwerks 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 traditionelle neuronale Netzwerke nachweislich am besten mit unstrukturierten Daten wie Bildern und Text funktionieren, funktionieren Entscheidungsbäume häufig sehr gut mit strukturierten Daten wie dem Hypotheken-Dataset, das wir in diesem Codelab verwenden werden.

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 XGBRegressor-Klasse, um das Modell zu erstellen, und müssen für unsere spezifische Aufgabe nur den richtigen objective-Parameter übergeben. Hier verwenden wir ein Regressionsmodell, da wir einen numerischen Wert (das Gewicht des Babys) vorhersagen. Würden wir stattdessen unsere Daten in Buckets gruppieren, um festzustellen, ob ein Baby mehr oder weniger als 1,8 kg 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

Jetzt können wir das trainierte Modell verwenden, um Vorhersagen für unsere Testdaten mit der Funktion predict() 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. Im Folgenden 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

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

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

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

Definieren wir zuerst einige Umgebungsvariablen, die wir im weiteren Codelab verwenden. 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 der XGBoost-Modelldatei erstellen. Cloud AI Platform verweist bei der Bereitstellung auf diese Datei.

Führen Sie den folgenden 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 in XGBoost gespeicherte Modelldatei nach Cloud Storage. Führen Sie den folgenden gsutil-Befehl aus:

!gsutil cp ./model.bst $MODEL_BUCKET

Prüfen Sie im Storage-Browser in der Cloud Console, ob die Datei kopiert wurde:

21e1727fa02721412.png

Schritt 3: Modell erstellen und bereitstellen

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

!gcloud ai-platform models create $MODEL_NAME

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

!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

Prüfen Sie während der Ausführung den Abschnitt „Modelle“ in der AI Platform Console. Dort sollte Ihre neue Version bereitgestellt werden:

a431661f9c3e6cb2.png

Wenn die Bereitstellung erfolgreich abgeschlossen wurde, wird an der Stelle, an der sich das Ladesymbol befindet, ein grünes Häkchen angezeigt. Die Bereitstellung dauert 2–3 Minuten.

Schritt 4: Bereitgestelltes Modell testen

Prüfen Sie, ob das bereitgestellte Modell funktioniert, indem Sie es mit gcloud testen, um eine Vorhersage zu treffen. Speichern Sie zunächst 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 sollten Sie die Vorhersage Ihres Modells sehen. Das tatsächliche Babygewicht beträgt in diesen beiden Beispielen 1,9 bzw. 8,1 Pfund.

8. Bereinigen

Wenn Sie dieses Notebook weiterverwenden möchten, empfehlen wir Ihnen, es bei Nichtgebrauch auszuschalten. Wählen Sie in der Notebooks-UI 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 Notebookinstanz, anstatt sie zu beenden.

Gehen Sie im Navigationsmenü der Cloud Console zu „Storage“ und löschen Sie beide Buckets, die Sie zum Speichern Ihrer Modell-Assets erstellt haben.