Creare e utilizzare un modello di classificazione sui dati di un censimento


In questo tutorial, utilizzerai un modello di regressione logistica binario in BigQuery ML per prevedere la fascia di reddito degli individui in base ai loro dati demografici. Un modello di regressione logistica binaria prevede se un valore rientra in una di due categorie, in questo caso se il reddito annuale di un privato è superiore o inferiore a 50.000 $.

Questo tutorial utilizza il set di dati bigquery-public-data.ml_datasets.census_adult_income. Questo set di dati contiene i dati demografici e sul reddito dei residenti negli Stati Uniti del 2000 e del 2010.

Obiettivi

In questo tutorial imparerai a:

  • Creare un modello di regressione logistica.
  • Valutare il modello.
  • Effettuare previsioni utilizzando il modello.
  • Spiegare i risultati prodotti dal modello.

Costi

Questo tutorial utilizza i componenti fatturabili di Google Cloud, tra cui:

  • BigQuery
  • BigQuery ML

Per ulteriori informazioni sui costi di BigQuery, consulta la pagina Prezzi di BigQuery.

Per ulteriori informazioni sui costi di BigQuery ML, consulta Prezzi di BigQuery ML.

Prima di iniziare

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

    Go to project selector

  2. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  3. Attiva l'API BigQuery.

    Abilita l'API

Autorizzazioni obbligatorie

Per creare il modello utilizzando BigQuery ML, devi disporre delle seguenti autorizzazioni IAM:

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

Per eseguire l'inferenza, devi disporre delle seguenti autorizzazioni:

  • bigquery.models.getData sul modello
  • bigquery.jobs.create

Introduzione

Un'attività comune nel machine learning è classificare i dati in uno di due tipi, noti come etichette. Ad esempio, un rivenditore potrebbe voler prevedere se un determinato cliente acquisterà un nuovo prodotto in base ad altre informazioni su quel cliente. In questo caso, le due etichette potrebbero essere will buy e won't buy. Il rivenditore può creare un set di dati in modo che una colonna rappresenti entrambe le etichette e contenga anche informazioni sul cliente quali la sua posizione, gli acquisti precedenti e le preferenze segnalate. Il rivenditore può quindi utilizzare un modello di regressione logistica binaria che utilizza le informazioni del cliente per prevedere quale etichetta rappresenta meglio ciascun cliente.

In questo tutorial, creerai un modello di regressione logistica binaria che prevede se il reddito di un intervistato negli Stati Uniti rientra in uno di due intervalli in base agli attributi demografici dell'intervistato.

crea un set di dati

Crea un set di dati BigQuery per archiviare il tuo modello:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro Explorer, fai clic sul nome del tuo progetto.

  3. Fai clic su Visualizza azioni > Crea set di dati.

    Crea il set di dati.

  4. Nella pagina Crea set di dati, segui questi passaggi:

    • In ID set di dati, inserisci census.

    • In Tipo di località, seleziona Più regioni, quindi seleziona Stati Uniti (più regioni negli Stati Uniti).

      I set di dati pubblici vengono archiviati in US più regioni. Per semplificare, archivia il set di dati nella stessa località.

    • Lascia invariate le restanti impostazioni predefinite e fai clic su Crea set di dati.

Esamina i dati

Esamina il set di dati e identifica le colonne da utilizzare come dati di addestramento per il modello di regressione logistica. Seleziona 100 righe dalla tabella census_adult_income:

SQL

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor query, esegui questa query GoogleSQL:

    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. I risultati sono simili ai seguenti:

    Dati del censimento

DataFrame BigQuery

Prima di provare questo esempio, segui le istruzioni per la configurazione di BigQuery DataFrames nella guida rapida di BigQuery sull'utilizzo di BigQuery DataFrames. Per maggiori informazioni, consulta la documentazione di riferimento di BigQuery DataFrames.

Per eseguire l'autenticazione su BigQuery, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configurare l'autenticazione per un ambiente di sviluppo locale.

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

I risultati della query mostrano che la colonna income_bracket della tabella census_adult_income ha solo uno di due valori: <=50K o >50K. La colonna functional_weight indica il numero di persone che l'organizzazione censita ritiene rappresenti una determinata riga. I valori di questa colonna non sono correlati al valore income_bracket per una determinata riga.

Prepara i dati di esempio

In questo tutorial, prevedi il reddito degli intervistati in base ai seguenti attributi:

  • Età
  • Tipo di lavoro svolto
  • Stato civile
  • Livello di istruzione
  • Professione
  • Ore lavorate a settimana

Per creare questa previsione, dovrai estrarre informazioni dai dati sugli intervistati del censimento nella tabella census_adult_income. Seleziona le colonne delle caratteristiche, tra cui:

  • education_num, che rappresenta il livello di istruzione della persona intervistata
  • workclass, che rappresenta il tipo di lavoro svolto dall'intervistato

Escludi le colonne che contengono dati duplicati. Ad esempio:

  • education, perché education e education_num esprimono gli stessi dati in formati diversi

Separa i dati in set di addestramento, valutazione e previsione creando una nuova colonna dataframe derivata dalla colonna functional_weight. Etichetta l'80% dell'origine dati per l'addestramento del modello e prenota il restante 20% dei dati per la valutazione e la previsione.

SQL

Per preparare i dati di esempio, crea una vista per contenere i dati di addestramento. Questa visualizzazione viene utilizzata dall'istruzione CREATE MODEL più avanti in questo tutorial.

Esegui la query che prepara i dati di esempio:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor query, esegui questa query:

    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. Nel riquadro Explorer, espandi il set di dati census e individua la visualizzazione input_data.

  4. Fai clic sul nome della vista per aprire il riquadro delle informazioni. Lo schema della visualizzazione viene visualizzato nella scheda Schema.

Risultati delle query

DataFrame BigQuery

Crea un DataFrame denominato input_data. Più avanti in questo tutorial userai input_data per addestrare il modello, valutarlo ed eseguire previsioni.

Prima di provare questo esempio, segui le istruzioni per la configurazione di BigQuery DataFrames nella guida rapida di BigQuery sull'utilizzo di BigQuery DataFrames. Per maggiori informazioni, consulta la documentazione di riferimento di BigQuery DataFrames.

Per eseguire l'autenticazione su BigQuery, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configurare l'autenticazione per un ambiente di sviluppo locale.

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"]

Creare un modello di regressione logistica

Crea un modello di regressione logistica con i dati di addestramento che hai etichettato nella sezione precedente.

SQL

Utilizza l'istruzione CREATE MODEL e specifica LOGISTIC_REG per il tipo di modello

Di seguito sono riportate informazioni utili in merito all'istruzione CREATE MODEL:

  • L'opzione input_label_cols specifica quale colonna dell'istruzione SELECT utilizzare come colonna dell'etichetta. In questo caso, la colonna dell'etichetta è income_bracket, quindi il modello apprende quale dei due valori di income_bracket è più probabile per una determinata riga in base agli altri valori presenti nella stessa riga.

  • Non è necessario specificare se un modello di regressione logistica è binario o multiclasse. BigQuery può determinare quale tipo di modello addestrare in base al numero di valori univoci nella colonna dell'etichetta.

  • L'opzione auto_class_weights è impostata su TRUE per bilanciare le etichette della classe nei dati di addestramento. Per impostazione predefinita, i dati di addestramento non sono ponderati. Se le etichette nei dati di addestramento non sono bilanciate, il modello potrebbe imparare a prevedere in modo più massiccio la classe di etichette più popolare. In questo caso, la maggior parte degli intervistati nel set di dati si trova nella fascia di reddito inferiore. Ciò può comportare la creazione di un modello che prevede troppo pesantemente la fascia di reddito più bassa. I pesi delle classi bilanciano le etichette delle classi calcolando le ponderazioni per ogni classe in proporzione inversa alla frequenza di quella classe.

  • L'istruzione SELECT esegue una query sulla vista input_data contenente i dati di addestramento. La clausola WHERE filtra le righe in input_data in modo che per addestrare il modello vengano utilizzate solo le righe etichettate come dati di addestramento.

Esegui la query che crea il tuo modello di regressione logistica:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor query, esegui questa query:

    CREATE OR REPLACE MODEL
    `census.census_model`
    OPTIONS
    ( model_type='LOGISTIC_REG',
      auto_class_weights=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. Nel riquadro Explorer, espandi il set di dati census e quindi la cartella Modelli.

  4. Fai clic sul modello census_model per aprire il riquadro delle informazioni.

  5. Fai clic sulla scheda Schema. Lo schema del modello elenca gli attributi utilizzati da BigQuery ML per eseguire Lo schema dovrebbe essere simile al seguente:

Informazioni sullo schema del cluster

DataFrame BigQuery

Usa il metodo fit per addestrare il modello e il metodo to_gbq per salvarlo nel set di dati.

Prima di provare questo esempio, segui le istruzioni per la configurazione di BigQuery DataFrames nella guida rapida di BigQuery sull'utilizzo di BigQuery DataFrames. Per maggiori informazioni, consulta la documentazione di riferimento di BigQuery DataFrames.

Per eseguire l'autenticazione su BigQuery, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configurare l'autenticazione per un ambiente di sviluppo locale.

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,
)

Valuta le prestazioni del modello

Dopo aver creato il modello, valuta le prestazioni del modello rispetto ai dati effettivi.

SQL

La funzione funzione ML.EVALUATE valuta i valori previsti generati dal modello rispetto ai dati effettivi.

Per l'input, la funzione ML.EVALUATE prende il modello addestrato e le righe della vista input_data che hanno evaluation come valore della colonna dataframe. La funzione restituisce una singola riga di statistiche sul modello.

Esegui la query ML.EVALUATE:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor query, esegui questa query:

    SELECT
    *
    FROM
    ML.EVALUATE (MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'evaluation'
      )
    )
    
  3. I risultati sono simili ai seguenti:

    Output ML.EVALUATE

DataFrame BigQuery

Utilizza il metodo score per valutare il modello rispetto ai dati effettivi.

Prima di provare questo esempio, segui le istruzioni per la configurazione di BigQuery DataFrames nella guida rapida di BigQuery sull'utilizzo di BigQuery DataFrames. Per maggiori informazioni, consulta la documentazione di riferimento di BigQuery DataFrames.

Per eseguire l'autenticazione su BigQuery, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configurare l'autenticazione per un ambiente di sviluppo locale.

# 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

Puoi anche esaminare il riquadro delle informazioni del modello nella console Google Cloud per visualizzare le metriche di valutazione calcolate durante l'addestramento:

Output ML.EVALUATE

Prevedere la fascia di reddito

Identificare la fascia di reddito a cui probabilmente appartiene un particolare intervistato utilizzando il modello.

SQL

Utilizza la funzione ML.PREDICT per fare previsioni sulla fascia di reddito probabile. Inserisci il modello addestrato e le righe dalla vista input_data che hanno prediction come valore della colonna dataframe.

Esegui la query ML.PREDICT:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor query, esegui questa query:

    SELECT
    *
    FROM
    ML.PREDICT (MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'prediction'
      )
    )
    
  3. I risultati sono simili ai seguenti:

    Risultati di ML.PREDICT

predicted_income_bracket è il valore previsto di income_bracket.

DataFrame BigQuery

Utilizza il metodo predict per fare previsioni sulla fascia di reddito probabile.

Prima di provare questo esempio, segui le istruzioni per la configurazione di BigQuery DataFrames nella guida rapida di BigQuery sull'utilizzo di BigQuery DataFrames. Per maggiori informazioni, consulta la documentazione di riferimento di BigQuery DataFrames.

Per eseguire l'autenticazione su BigQuery, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configurare l'autenticazione per un ambiente di sviluppo locale.

# 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

Spiegare i risultati della previsione

Per capire perché il modello genera questi risultati di previsione, puoi utilizzare la funzione ML.EXPLAIN_PREDICT.

ML.EXPLAIN_PREDICT è una versione estesa della funzione ML.PREDICT. ML.EXPLAIN_PREDICT non solo restituisce i risultati della previsione, ma genera anche colonne aggiuntive per spiegare i risultati della previsione. In pratica, puoi eseguire ML.EXPLAIN_PREDICT anziché ML.PREDICT. Per ulteriori informazioni, consulta Panoramica di BigQuery ML Explainable AI.

Esegui la query ML.EXPLAIN_PREDICT:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor query, esegui questa query:

    SELECT
    *
    FROM
    ML.EXPLAIN_PREDICT(MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'evaluation'),
      STRUCT(3 as top_k_features))
    
  3. I risultati sono simili ai seguenti:

    Output ML.EXPLAIN_PREDICT

Per i modelli di regressione logistica, vengono utilizzati i valori di Shapley per generare valori di attribuzione delle caratteristiche per ogni caratteristica nel modello. ML.EXPLAIN_PREDICT restituisce le prime tre attribuzioni di caratteristiche per riga della vista input_data perché top_k_features è stato impostato su 3 nella query. Queste attribuzioni vengono ordinate in base al valore assoluto dell'attribuzione in ordine decrescente. Nella riga 1 di questo esempio, la caratteristica hours_per_week ha contribuito maggiormente alla previsione complessiva, mentre nella riga 2, occupation ha contribuito maggiormente alla previsione complessiva.

Spiegare il modello a livello globale

Per sapere quali funzionalità sono in genere le più importanti per determinare la fascia di reddito, puoi utilizzare la funzione ML.GLOBAL_EXPLAIN. Per utilizzare ML.GLOBAL_EXPLAIN, devi riaddestrare il modello con l'opzione ENABLE_GLOBAL_EXPLAIN impostata su TRUE.

Reimposta il modello e ottieni spiegazioni globali:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor query, esegui questa query per riaddestrare il modello:

    CREATE OR REPLACE MODEL `census.census_model`
    OPTIONS
      ( model_type='LOGISTIC_REG',
        auto_class_weights=TRUE,
        enable_global_explain=TRUE,
        input_label_cols=['income_bracket']
      ) AS
    SELECT * EXCEPT(dataframe)
    FROM
      `census.input_data`
    WHERE
      dataframe = 'training'
    
  3. Nell'editor query, esegui questa query per ottenere spiegazioni globali:

    SELECT
      *
    FROM
      ML.GLOBAL_EXPLAIN(MODEL `census.census_model`)
    
  4. I risultati sono simili ai seguenti:

    Output ML.GLOBAL_EXPLAIN

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il set di dati

L'eliminazione del progetto rimuove tutti i set di dati e tutte le tabelle nel progetto. Se preferisci riutilizzare il progetto, puoi eliminare il set di dati creato in questo tutorial:

  1. Se necessario, apri la pagina BigQuery nella console Google Cloud.

    Vai alla pagina di BigQuery

  2. Nella barra di navigazione, fai clic sul set di dati census che hai creato.

  3. Fai clic su Elimina set di dati sul lato destro della finestra. Questa azione elimina il set di dati e il modello.

  4. Nella finestra di dialogo Elimina set di dati, digita il nome del set di dati (census) per confermare l'eliminazione, quindi fai clic su Elimina.

Elimina il progetto

Per eliminare il progetto:

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Passaggi successivi