Klassifizierungsmodell anhand von Volkszählungsdaten erstellen und verwenden


In dieser Anleitung verwenden Sie ein binäres logistisches Regressionsmodell in BigQuery ML, um den Einkommensbereich von Personen anhand ihrer demografischen Daten vorherzusagen. Ein binäres logistisches Regressionsmodell sagt vorher, ob ein Wert in eine von zwei Kategorien fällt. In diesem Fall, ob das jährliche Einkommen einer Person über oder unter 50.000 $ fällt.

In dieser Anleitung wird das Dataset bigquery-public-data.ml_datasets.census_adult_income verwendet. Dieses Dataset enthält demografische und einkommensbezogene Informationen von US-Bürgern aus den Jahren 2000 und 2010.

Ziele

Aufgaben in dieser Anleitung:

  • Logistisches Regressionsmodell erstellen
  • Modell bewerten
  • Vorhersagen mithilfe des Modells treffen.
  • Die vom Modell generierten Ergebnisse erklären.

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten von Google Cloudverwendet, darunter:

  • BigQuery
  • BigQuery ML

Weitere Informationen zu den Kosten für BigQuery finden Sie auf der Seite BigQuery-Preise.

Weitere Informationen zu den Kosten für BigQuery ML finden Sie unter BigQuery ML-Preise.

Hinweise

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery API.

    Enable the API

Erforderliche Berechtigungen

Zum Erstellen des Modells mit BigQuery ML benötigen Sie die folgenden IAM-Berechtigungen:

  • bigquery.jobs.create
  • bigquery.models.create
  • bigquery.models.getData
  • bigquery.models.updateData
  • bigquery.models.updateMetadata

Zum Ausführen von Inferenzen benötigen Sie die folgenden Berechtigungen:

  • bigquery.models.getData für das Modell
  • bigquery.jobs.create

Einführung

Eine häufige Aufgabe beim maschinellen Lernen besteht darin, Daten einem von zwei Typen zuzuordnen, den sogenannten Labels. Beispielsweise wäre es für einen Einzelhändler interessant, anhand von bestimmten Informationen zu einem Kunden vorherzusagen, ob dieser Kunde ein neues Produkt kauft. In diesem Fall könnten die beiden Labels will buy und won't buy lauten. Der Einzelhändler kann ein Dataset so erstellen, dass eine Spalte beide Labels darstellt und außerdem Kundeninformationen wie den Standort des Kunden, seine vorherigen Einkäufe und die gemeldeten Präferenzen enthält. Der Einzelhändler kann dann ein binäres logistisches Regressionsmodell verwenden, das anhand dieser Kundeninformationen vorhersagt, welches Label den jeweiligen Kunden am besten repräsentiert.

In dieser Anleitung erstellen Sie ein binäres logistisches Regressionsmodell, das anhand der demografischen Attribute eines Befragten bei der US-Volkszählung vorhersagt, ob sein Einkommen in einen von zwei Bereichen fällt.

Dataset erstellen

Erstellen Sie ein BigQuery-Dataset zum Speichern Ihres Modells:

  1. Rufen Sie in der Google Cloud Console die Seite BigQuery auf.

    BigQuery aufrufen

  2. Klicken Sie im Bereich Explorer auf den Namen Ihres Projekts.

  3. Klicken Sie auf Aktionen ansehen > Dataset erstellen.

  4. Führen Sie auf der Seite Dataset erstellen die folgenden Schritte aus:

    • Geben Sie unter Dataset-ID census ein.

    • Wählen Sie als Standorttyp die Option Multiregional und dann USA (mehrere Regionen in den USA) aus.

      Die öffentlichen Datasets sind am multiregionalen Standort US gespeichert. Der Einfachheit halber sollten Sie Ihr Dataset am selben Standort speichern.

    • Übernehmen Sie die verbleibenden Standardeinstellungen und klicken Sie auf Dataset erstellen.

Sehen Sie sich die Daten an

Untersuchen Sie das Dataset und ermitteln Sie, welche Spalten als Trainingsdaten für das logistische Regressionsmodell verwendet werden sollen. Wählen Sie 100 Zeilen aus der Tabelle census_adult_income aus:

SQL

  1. Rufen Sie in der Google Cloud Console die Seite BigQuery auf.

    BigQuery aufrufen

  2. Führen Sie im Abfrageeditor die folgende GoogleSQL-Abfrage aus:

    SELECT
    age,
    workclass,
    marital_status,
    education_num,
    occupation,
    hours_per_week,
    income_bracket,
    functional_weight
    FROM
    `bigquery-public-data.ml_datasets.census_adult_income`
    LIMIT
    100;
  3. Die Ergebnisse sehen in etwa so aus:

    Volkszählungsdaten

BigQuery DataFrames

Bevor Sie dieses Beispiel ausprobieren, folgen Sie den Schritten zur Einrichtung von BigQuery DataFrames in der BigQuery-Kurzanleitung: BigQuery DataFrames verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zu BigQuery DataFrames.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter ADC für eine lokale Entwicklungsumgebung einrichten.

import bigframes.pandas as bpd

df = bpd.read_gbq(
    "bigquery-public-data.ml_datasets.census_adult_income",
    columns=(
        "age",
        "workclass",
        "marital_status",
        "education_num",
        "occupation",
        "hours_per_week",
        "income_bracket",
        "functional_weight",
    ),
    max_results=100,
)
df.peek()
# Output:
# age      workclass       marital_status  education_num          occupation  hours_per_week income_bracket  functional_weight
#  47      Local-gov   Married-civ-spouse             13      Prof-specialty              40           >50K             198660
#  56        Private        Never-married              9        Adm-clerical              40          <=50K              85018
#  40        Private   Married-civ-spouse             12        Tech-support              40           >50K             285787
#  34   Self-emp-inc   Married-civ-spouse              9        Craft-repair              54           >50K             207668
#  23        Private   Married-civ-spouse             10   Handlers-cleaners              40          <=50K              40060

In den Abfrageergebnissen sehen Sie, dass die Spalte income_bracket der Tabelle census_adult_income nur einen von zwei Werten enthält: <=50K oder >50K.

Beispieldaten vorbereiten

In dieser Anleitung sagen Sie das Einkommen der Befragten bei der Volkszählung anhand der Werte der folgenden Spalten in der Tabelle census_adult_income vorher:

  • age: Das Alter des Befragten.
  • workclass: Art der ausgeführten Arbeit. Beispiele: Kommunalverwaltung, privat oder selbstständig.
  • marital_status
  • education_num: Das höchste Bildungsniveau des Befragten.
  • occupation
  • hours_per_week: Arbeitsstunden pro Woche.

Sie schließen Spalten aus, die doppelte Daten enthalten. Beispielsweise die Spalte education, da die Spaltenwerte education und education_num dieselben Daten in verschiedenen Formaten ausdrücken.

Die Spalte functional_weight gibt die Anzahl der Personen an, die nach Ansicht der Volkszählungs-Organisationdurch eine bestimmte Zeile repräsentiert wird. Da der Wert dieser Spalte für eine bestimmte Zeile nicht mit dem Wert von income_bracket zusammenhängt, verwenden Sie den Wert in dieser Spalte, um die Daten in Trainings-, Auswertungs- und Vorhersage-Sets aufzuteilen. Dazu erstellen Sie eine neue dataframe-Spalte, die von der functional_weight-Spalte abgeleitet wird. Sie weisen 80% der Daten dem Training des Modells, 10% der Daten der Bewertung und 10% der Daten der Vorhersage zu.

SQL

Erstellen Sie eine Ansicht mit den Beispieldaten. Diese Ansicht wird später in dieser Anleitung von der CREATE MODEL-Anweisung verwendet.

Führen Sie die Abfrage aus, mit der die Beispieldaten vorbereitet werden:

  1. Rufen Sie in der Google Cloud Console die Seite BigQuery auf.

    BigQuery aufrufen

  2. Führen Sie im Abfrageeditor folgende Abfrage aus:

    CREATE OR REPLACE VIEW
    `census.input_data` AS
    SELECT
    age,
    workclass,
    marital_status,
    education_num,
    occupation,
    hours_per_week,
    income_bracket,
    CASE
      WHEN MOD(functional_weight, 10) < 8 THEN 'training'
      WHEN MOD(functional_weight, 10) = 8 THEN 'evaluation'
      WHEN MOD(functional_weight, 10) = 9 THEN 'prediction'
    END AS dataframe
    FROM
    `bigquery-public-data.ml_datasets.census_adult_income`;
  3. Beispieldaten ansehen:

    SELECT * FROM `census.input_data`;

BigQuery DataFrames

Erstellen Sie einen DataFrame mit dem Namen input_data. input_data wird später in dieser Anleitung verwendet, um das Modell zu trainieren, zu bewerten und Vorhersagen zu treffen.

Bevor Sie dieses Beispiel ausprobieren, folgen Sie den Schritten zur Einrichtung von BigQuery DataFrames in der BigQuery-Kurzanleitung: BigQuery DataFrames verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zu BigQuery DataFrames.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter ADC für eine lokale Entwicklungsumgebung einrichten.

import bigframes.pandas as bpd

input_data = bpd.read_gbq(
    "bigquery-public-data.ml_datasets.census_adult_income",
    columns=(
        "age",
        "workclass",
        "marital_status",
        "education_num",
        "occupation",
        "hours_per_week",
        "income_bracket",
        "functional_weight",
    ),
)
input_data["dataframe"] = bpd.Series("training", index=input_data.index,).case_when(
    [
        (((input_data["functional_weight"] % 10) == 8), "evaluation"),
        (((input_data["functional_weight"] % 10) == 9), "prediction"),
    ]
)
del input_data["functional_weight"]

Logistisches Regressionsmodell erstellen

Erstellen Sie ein logistisches Regressionsmodell mit den Trainingsdaten, die Sie im vorherigen Abschnitt mit Labels versehen haben.

SQL

Verwenden Sie die Anweisung CREATE MODEL und geben Sie LOGISTIC_REG als Modelltyp an.

Im Folgenden finden Sie nützliche Informationen zur CREATE MODEL-Anweisung:

  • Die Option input_label_cols gibt an, welche Spalte in der SELECT-Anweisung als Labelspalte verwendet werden soll. Hier ist die Labelspalte income_bracket, sodass das Modell anhand der anderen in jeder Zeile vorhandenen Werte lernt, welcher der beiden Werte von income_bracket am wahrscheinlichsten ist.

  • Sie müssen nicht angeben, ob ein logistisches Regressionsmodell binär oder mehrklassig ist. BigQuery ML bestimmt anhand der Anzahl der eindeutigen Werte in der Labelspalte, welcher Modelltyp trainiert werden soll.

  • Die Option auto_class_weights ist auf TRUE festgelegt, um die Klassenlabels in den Trainingsdaten auszugleichen. Standardmäßig sind die Trainingsdaten ungewichtet. Wenn die Labels in den Trainingsdaten nicht ausgewogen sind, lernt das Modell unter Umständen, bei der Vorhersage die häufigste Labelklasse zu stark einzubeziehen. In diesem Fall befinden sich die meisten Befragten im Dataset in der unteren Einkommensklasse. Dies kann zu einem Modell führen, in dem bei der Vorhersage die untere Einkommensklasse zu stark berücksichtigt wird. Mit Klassengewichtungen werden die Klassenlabels ausgeglichen. Dazu werden für jede Klasse die Gewichtungen im umgekehrten Verhältnis zur Häufigkeit dieser Klasse berechnet.

  • Die Option enable_global_explain ist auf TRUE festgelegt, damit Sie die Funktion ML.GLOBAL_EXPLAIN für das Modell verwenden können.

  • Mit der SELECT-Anweisung wird die Ansicht input_data abgefragt, die die Beispieldaten enthält. Die Klausel WHERE filtert die Zeilen so, dass nur die Zeilen, die als Trainingsdaten gekennzeichnet sind, zum Trainieren des Modells verwendet werden.

Führen Sie die Abfrage aus, mit der Ihr logistisches Regressionsmodell erstellt wird:

  1. Rufen Sie in der Google Cloud Console die Seite BigQuery auf.

    BigQuery aufrufen

  2. Führen Sie im Abfrageeditor folgende Abfrage aus:

    CREATE OR REPLACE MODEL
    `census.census_model`
    OPTIONS
    ( model_type='LOGISTIC_REG',
      auto_class_weights=TRUE,
      enable_global_explain=TRUE,
      data_split_method='NO_SPLIT',
      input_label_cols=['income_bracket'],
      max_iterations=15) AS
    SELECT * EXCEPT(dataframe)
    FROM
    `census.input_data`
    WHERE
    dataframe = 'training'
  3. Klicken Sie im Bereich Explorer auf Datasets.

  4. Klicken Sie im Bereich Datasets auf census.

  5. Klicken Sie auf den Bereich Modelle.

  6. Klicken Sie auf census_model.

  7. Auf dem Tab Details werden die Attribute aufgeführt, die BigQuery ML zur Durchführung der logistischen Regression verwendet hat.

BigQuery DataFrames

Verwenden Sie die Methode fit, um das Modell zu trainieren, und die Methode to_gbq, um es in Ihrem Dataset zu speichern.

Bevor Sie dieses Beispiel ausprobieren, folgen Sie den Schritten zur Einrichtung von BigQuery DataFrames in der BigQuery-Kurzanleitung: BigQuery DataFrames verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zu BigQuery DataFrames.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter ADC für eine lokale Entwicklungsumgebung einrichten.

import bigframes.ml.linear_model

# input_data is defined in an earlier step.
training_data = input_data[input_data["dataframe"] == "training"]
X = training_data.drop(columns=["income_bracket", "dataframe"])
y = training_data["income_bracket"]

census_model = bigframes.ml.linear_model.LogisticRegression(
    # Balance the class labels in the training data by setting
    # class_weight="balanced".
    #
    # By default, the training data is unweighted. If the labels
    # in the training data are imbalanced, the model may learn to
    # predict the most popular class of labels more heavily. In
    # this case, most of the respondents in the dataset are in the
    # lower income bracket. This may lead to a model that predicts
    # the lower income bracket too heavily. Class weights balance
    # the class labels by calculating the weights for each class in
    # inverse proportion to the frequency of that class.
    class_weight="balanced",
    max_iterations=15,
)
census_model.fit(X, y)

census_model.to_gbq(
    your_model_id,  # For example: "your-project.census.census_model"
    replace=True,
)

Modellleistung bewerten

Nachdem Sie das Modell erstellt haben, können Sie die Leistung des Modells anhand der Bewertungsdaten bewerten.

SQL

Die Funktion ML.EVALUATE-Funktion wertet die vom Modell generierten vorhergesagten Werte anhand der Bewertungsdaten aus.

Als Eingabe verwendet die Funktion ML.EVALUATE das trainierte Modell und die Zeilen aus der Ansicht input_data, für die evaluation als Spaltenwert dataframe festgelegt ist. Die Funktion gibt eine einzelne Zeile mit Statistiken zum Modell zurück.

Führen Sie die ML.EVALUATE-Abfrage aus:

  1. Rufen Sie in der Google Cloud Console die Seite BigQuery auf.

    BigQuery aufrufen

  2. Führen Sie im Abfrageeditor folgende Abfrage aus:

    SELECT
    *
    FROM
    ML.EVALUATE (MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'evaluation'
      )
    );
  3. Die Ergebnisse sehen in etwa so aus:

    Ausgabe von ML.EVALUATE

BigQuery DataFrames

Verwenden Sie die Methode score, um das Modell anhand der tatsächlichen Daten zu bewerten.

Bevor Sie dieses Beispiel ausprobieren, folgen Sie den Schritten zur Einrichtung von BigQuery DataFrames in der BigQuery-Kurzanleitung: BigQuery DataFrames verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zu BigQuery DataFrames.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter ADC für eine lokale Entwicklungsumgebung einrichten.

# Select model you'll use for predictions. `read_gbq_model` loads model
# data from BigQuery, but you could also use the `census_model` object
# from previous steps.
census_model = bpd.read_gbq_model(
    your_model_id,  # For example: "your-project.census.census_model"
)

# input_data is defined in an earlier step.
evaluation_data = input_data[input_data["dataframe"] == "evaluation"]
X = evaluation_data.drop(columns=["income_bracket", "dataframe"])
y = evaluation_data["income_bracket"]

# The score() method evaluates how the model performs compared to the
# actual data. Output DataFrame matches that of ML.EVALUATE().
score = census_model.score(X, y)
score.peek()
# Output:
#    precision    recall  accuracy  f1_score  log_loss   roc_auc
# 0   0.685764  0.536685   0.83819  0.602134  0.350417  0.882953

Sie können auch den Bereich Bewertung des Modells in der Google Cloud Console aufrufen, um die während des Trainings berechneten Bewertungsmesswerte aufzurufen:

Ausgabe von ML.EVALUATE

Einkommensklasse vorhersagen

Verwenden Sie das Modell, um die wahrscheinlichste Einkommensklasse für jeden Befragten vorherzusagen.

SQL

Verwenden Sie die ML.PREDICT-Funktion, um Vorhersagen zur wahrscheinlichen Einkommensklasse zu treffen. Als Eingabe verwendet die Funktion ML.PREDICT das trainierte Modell und die Zeilen aus der Ansicht input_data, für die prediction als Spaltenwert dataframe festgelegt ist.

Führen Sie die ML.PREDICT-Abfrage aus:

  1. Rufen Sie in der Google Cloud Console die Seite BigQuery auf.

    BigQuery aufrufen

  2. Führen Sie im Abfrageeditor folgende Abfrage aus:

    SELECT
    *
    FROM
    ML.PREDICT (MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'prediction'
      )
    );
  3. Die Ergebnisse sehen in etwa so aus:

    Ergebnisse von ML.PREDICT

Die Spalte predicted_income_bracket enthält die prognostizierte Einkommensklasse für den Befragten.

BigQuery DataFrames

Verwenden Sie die Methode predict, um Vorhersagen zur wahrscheinlichen Einkommensklasse zu treffen.

Bevor Sie dieses Beispiel ausprobieren, folgen Sie den Schritten zur Einrichtung von BigQuery DataFrames in der BigQuery-Kurzanleitung: BigQuery DataFrames verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zu BigQuery DataFrames.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter ADC für eine lokale Entwicklungsumgebung einrichten.

# Select model you'll use for predictions. `read_gbq_model` loads model
# data from BigQuery, but you could also use the `census_model` object
# from previous steps.
census_model = bpd.read_gbq_model(
    your_model_id,  # For example: "your-project.census.census_model"
)

# input_data is defined in an earlier step.
prediction_data = input_data[input_data["dataframe"] == "prediction"]

predictions = census_model.predict(prediction_data)
predictions.peek()
# Output:
#           predicted_income_bracket                     predicted_income_bracket_probs  age workclass  ... occupation  hours_per_week income_bracket   dataframe
# 18004                    <=50K  [{'label': ' >50K', 'prob': 0.0763305999358786...   75         ?  ...          ?               6          <=50K  prediction
# 18886                    <=50K  [{'label': ' >50K', 'prob': 0.0448866871906495...   73         ?  ...          ?              22           >50K  prediction
# 31024                    <=50K  [{'label': ' >50K', 'prob': 0.0362982319421936...   69         ?  ...          ?               1          <=50K  prediction
# 31022                    <=50K  [{'label': ' >50K', 'prob': 0.0787836112058324...   75         ?  ...          ?               5          <=50K  prediction
# 23295                    <=50K  [{'label': ' >50K', 'prob': 0.3385373037905673...   78         ?  ...          ?              32          <=50K  prediction

Vorhersageergebnisse erklären

Mit der Funktion ML.EXPLAIN_PREDICT können Sie ermitteln, warum das Modell diese Vorhersageergebnisse generiert.

ML.EXPLAIN_PREDICT ist eine erweiterte Version der Funktion ML.PREDICT. ML.EXPLAIN_PREDICT gibt nicht nur Vorhersageergebnisse aus, sondern gibt auch zusätzliche Spalten aus, um die Vorhersageergebnisse zu erklären. Weitere Informationen zur Erklärbarkeit finden Sie in der Übersicht zu BigQuery ML Explainable AI.

Führen Sie die ML.EXPLAIN_PREDICT-Abfrage aus:

  1. Rufen Sie in der Google Cloud Console die Seite BigQuery auf.

    BigQuery aufrufen

  2. Führen Sie im Abfrageeditor folgende Abfrage aus:

    SELECT
    *
    FROM
    ML.EXPLAIN_PREDICT(MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'evaluation'),
      STRUCT(3 as top_k_features));
  3. Die Ergebnisse sehen in etwa so aus:

    Ausgabe von ML.EXPLAIN_PREDICT

Bei logistischen Regressionsmodellen werden Shapley-Werte verwendet, um die relative Feature-Attribution für jedes Feature im Modell zu ermitteln. Da die Option top_k_features in der Abfrage auf 3 gesetzt wurde, gibt ML.EXPLAIN_PREDICT die drei wichtigsten Featureattributionen für jede Zeile der Ansicht input_data aus. Diese Zuordnungen werden in absteigender Reihenfolge nach dem absoluten Wert der Attribution angezeigt.

Modell global erklären

Mit der Funktion ML.GLOBAL_EXPLAIN können Sie ermitteln, welche Features am wichtigsten sind, um die Einkommensklasse zu bestimmen.

Globale Erläuterungen für das Modell abrufen:

  1. Rufen Sie in der Google Cloud Console die Seite BigQuery auf.

    BigQuery aufrufen

  2. Führen Sie im Abfrageeditor die folgende Abfrage aus, um globale Erläuterungen zu erhalten:

    SELECT
      *
    FROM
      ML.GLOBAL_EXPLAIN(MODEL `census.census_model`)
  3. Die Ergebnisse sehen in etwa so aus:

    Ausgabe von ML.GLOBAL_EXPLAIN

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Dataset löschen

Wenn Sie Ihr Projekt löschen, werden alle Datasets und Tabellen entfernt. Wenn Sie das Projekt wieder verwenden möchten, können Sie das in dieser Anleitung erstellte Dataset löschen:

  1. Rufen Sie, falls erforderlich, die Seite „BigQuery“ in derGoogle Cloud Console auf.

    Zur Seite „BigQuery“

  2. Klicken Sie im Navigationsbereich auf das Dataset census, das Sie erstellt haben.

  3. Klicken Sie rechts im Fenster auf Dataset löschen. Dadurch werden das Dataset und das Modell gelöscht.

  4. Bestätigen Sie im Dialogfeld Dataset löschen den Löschbefehl. Geben Sie dazu den Namen des Datasets (census) ein und klicken Sie auf Löschen.

Projekt löschen

So löschen Sie das Projekt:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Nächste Schritte