Membangun dan menggunakan model klasifikasi pada data sensus


Dalam tutorial ini, Anda akan menggunakan model regresi logistik biner di BigQuery ML untuk memprediksi rentang pendapatan individu berdasarkan data demografis mereka. Model regresi logistik biner memprediksi apakah suatu nilai termasuk dalam salah satu dari dua kategori, dalam hal ini apakah pendapatan tahunan seseorang berada di atas atau di bawah $50.000.

Tutorial ini menggunakan set data bigquery-public-data.ml_datasets.census_adult_income. Set data ini berisi informasi demografis dan pendapatan penduduk AS dari tahun 2000 dan 2010.

Tujuan

Dalam tutorial ini, Anda akan melakukan tugas-tugas berikut:

  • Membuat model regresi logistik.
  • Mengevaluasi model.
  • Buat prediksi menggunakan model.
  • Jelaskan hasil yang dihasilkan oleh model.

Biaya

Tutorial ini menggunakan komponen Google Cloud yang dapat ditagih, termasuk:

  • BigQuery
  • BigQuery ML

Untuk informasi selengkapnya tentang biaya BigQuery, lihat halaman harga BigQuery.

Untuk informasi selengkapnya tentang biaya BigQuery ML, lihat harga BigQuery ML.

Sebelum memulai

  1. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  2. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  3. Aktifkan API BigQuery.

    Mengaktifkan API

Izin yang diperlukan

Untuk membuat model menggunakan BigQuery ML, Anda memerlukan izin IAM berikut:

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

Untuk menjalankan inferensi, Anda memerlukan izin berikut:

  • bigquery.models.getData pada model
  • bigquery.jobs.create

Pengantar

Tugas umum dalam machine learning adalah mengklasifikasikan data ke dalam salah satu dari dua jenis, yang dikenal sebagai label. Misalnya, retailer mungkin ingin memprediksi apakah pelanggan tertentu akan membeli produk baru, berdasarkan informasi lain tentang pelanggan tersebut. Dalam hal ini, kedua labelnya mungkin will buy dan won't buy. Retailer dapat membuat set data sedemikian rupa sehingga satu kolom mewakili kedua label, dan juga berisi informasi pelanggan seperti lokasi pelanggan, pembelian sebelumnya, dan preferensi yang dilaporkan. Kemudian, retailer dapat menggunakan model regresi logistik biner yang menggunakan informasi pelanggan ini untuk memprediksi label mana yang paling mewakili setiap pelanggan.

Dalam tutorial ini, Anda akan membuat model regresi logistik biner yang memprediksi apakah pendapatan responden Sensus AS termasuk dalam salah satu dari dua rentang berdasarkan demografi responden.

Membuat set data

Buat set data BigQuery untuk menyimpan model Anda:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Explorer, klik nama project Anda.

  3. Klik View actions > Create dataset.

    Buat set data.

  4. Di halaman Create dataset, lakukan hal berikut:

    • Untuk Dataset ID, masukkan census.

    • Untuk Location type, pilih Multi-region, lalu pilih US (multiple regions in United States).

      Set data publik disimpan di US multi-region. Agar mudah, simpanlah set data Anda di lokasi yang sama.

    • Jangan ubah setelan default lainnya, lalu klik Create dataset.

Memeriksa data

Periksa set data dan identifikasi kolom mana yang akan digunakan sebagai data pelatihan untuk model regresi logistik. Pilih 100 baris dari tabel census_adult_income:

SQL

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri GoogleSQL berikut:

    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. Hasilnya akan terlihat seperti berikut:

    Data Sensus

DataFrame BigQuery

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan BigQuery DataFrames di panduan memulai BigQuery menggunakan BigQuery DataFrames. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery DataFrames.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Hasil kueri menunjukkan bahwa kolom income_bracket dalam tabel census_adult_income hanya memiliki salah satu dari dua nilai: <=50K atau >50K. Kolom functional_weight adalah jumlah individu yang menurut organisasi sensus diwakili oleh baris tertentu. Nilai kolom ini tampaknya tidak terkait dengan nilai income_bracket untuk baris tertentu.

Menyiapkan data sampel

Dalam tutorial ini, Anda akan memprediksi pendapatan responden sensus berdasarkan atribut berikut:

  • Usia
  • Jenis pekerjaan yang dilakukan
  • Status pernikahan
  • Tingkat pendidikan
  • Pekerjaan
  • Jam kerja per minggu

Untuk membuat prediksi ini, Anda akan mengekstrak informasi dari data responden sensus di tabel census_adult_income. Pilih kolom fitur, termasuk:

  • education_num, yang mewakili tingkat pendidikan responden
  • workclass, yang mewakili jenis pekerjaan yang dilakukan responden

Mengecualikan kolom yang menduplikasi data. Contoh:

  • education, karena education dan education_num menyatakan data yang sama dalam format yang berbeda

Pisahkan data menjadi set pelatihan, evaluasi, dan prediksi dengan membuat kolom dataframe baru yang berasal dari kolom functional_weight. Beri label pada 80% sumber data untuk melatih model, dan siapkan 20% data yang tersisa untuk evaluasi dan prediksi.

SQL

Untuk menyiapkan data sampel, buat tampilan untuk berisi data pelatihan. Tampilan ini digunakan oleh pernyataan CREATE MODEL nanti dalam tutorial ini.

Jalankan kueri yang menyiapkan data sampel:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri berikut:

    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. Di panel Explorer, luaskan set data census dan temukan tampilan input_data.

  4. Klik nama tampilan untuk membuka panel informasi. Skema tampilan muncul di tab Schema.

Hasil kueri

DataFrame BigQuery

Buat DataFrame dengan nama input_data. Anda akan menggunakan input_data nanti dalam tutorial ini untuk melatih model, mengevaluasinya, dan membuat prediksi.

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan BigQuery DataFrames di panduan memulai BigQuery menggunakan BigQuery DataFrames. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery DataFrames.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Membuat model regresi logistik

Buat model regresi logistik dengan data pelatihan yang Anda beri label di bagian sebelumnya.

SQL

Gunakan pernyataan CREATE MODEL dan tentukan LOGISTIC_REG untuk jenis model

Berikut adalah hal-hal penting yang perlu diketahui tentang pernyataan CREATE MODEL:

  • Opsi input_label_cols menentukan kolom mana dalam pernyataan SELECT yang akan digunakan sebagai kolom label. Di sini, kolom labelnya adalah income_bracket, sehingga model akan mempelajari mana dari dua nilai income_bracket yang paling mungkin untuk baris tertentu berdasarkan nilai lain yang ada di baris tersebut.

  • Anda tidak perlu menentukan apakah model regresi logistik bersifat biner atau multi-class. BigQuery dapat menentukan jenis model yang akan dilatih berdasarkan jumlah nilai unik dalam kolom label.

  • Opsi auto_class_weights ditetapkan ke TRUE untuk menyeimbangkan label class dalam data pelatihan. Secara default, data pelatihan tidak diberi bobot. Jika label dalam data pelatihan tidak seimbang, model dapat belajar untuk lebih banyak memprediksi class label yang paling populer. Dalam hal ini, sebagian besar responden dalam set data berada dalam kelompok berpendapatan lebih rendah. Hal ini dapat menyebabkan model yang memprediksi terlalu banyak kelompok pendapatan yang lebih rendah. Bobot class menyeimbangkan label class dengan menghitung bobot untuk setiap class dengan proporsi yang terbalik dengan frekuensi class tersebut.

  • Pernyataan SELECT membuat kueri tabel virtual input_data yang berisi data pelatihan. Klausa WHERE memfilter baris di input_data sehingga hanya baris yang diberi label sebagai data pelatihan yang digunakan untuk melatih model.

Jalankan kueri yang membuat model regresi logistik:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri berikut:

    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. Di panel Explorer, luaskan set data census, lalu folder Models.

  4. Klik model census_model untuk membuka panel informasi.

  5. Klik tab Schema. Skema model mencantumkan atribut yang digunakan BigQuery ML untuk melakukan regresi logistik. Skema akan terlihat mirip dengan yang berikut ini:

Info skema cluster

DataFrame BigQuery

Gunakan metode fit untuk melatih model dan metode to_gbq untuk menyimpannya ke set data Anda.

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan BigQuery DataFrames di panduan memulai BigQuery menggunakan BigQuery DataFrames. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi BigQuery DataFrames.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Mengevaluasi performa model

Setelah membuat model, evaluasi performa model terhadap data yang sebenarnya.

SQL

Fungsi fungsi ML.EVALUATE mengevaluasi nilai yang diprediksi yang dihasilkan oleh model terhadap data sebenarnya.

Untuk input, fungsi ML.EVALUATE menggunakan model yang dilatih dan baris dari tampilan input_data yang memiliki evaluation sebagai nilai kolom dataframe. Fungsi ini menampilkan satu baris statistik tentang model.

Jalankan kueri ML.EVALUATE:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri berikut:

    SELECT
    *
    FROM
    ML.EVALUATE (MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'evaluation'
      )
    )
  3. Hasilnya akan terlihat seperti berikut:

    Output ML.EVALUATE

DataFrame BigQuery

Gunakan metode score untuk mengevaluasi model berdasarkan data sebenarnya.

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan BigQuery DataFrames di panduan memulai BigQuery menggunakan BigQuery DataFrames. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi BigQuery DataFrames.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

# 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

Anda juga dapat melihat panel informasi model di konsol Google Cloud untuk melihat metrik evaluasi yang dihitung selama pelatihan:

Output ML.EVALUATE

Memprediksi rentang pendapatan

Identifikasi kelompok pendapatan yang kemungkinan mencakup responden tertentu menggunakan model.

SQL

Gunakan fungsi ML.PREDICT untuk membuat prediksi tentang kemungkinan kategori pendapatan. Masukkan model yang dilatih dan baris dari tampilaninput_data yang memiliki prediction sebagai nilai kolom dataframe.

Jalankan kueri ML.PREDICT:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri berikut:

    SELECT
    *
    FROM
    ML.PREDICT (MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'prediction'
      )
    )
  3. Hasilnya akan terlihat seperti berikut:

    Hasil ML.PREDICT

predicted_income_bracket adalah prediksi nilai income_bracket.

DataFrame BigQuery

Gunakan metode predict untuk membuat prediksi tentang kemungkinan kategori pendapatan.

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan BigQuery DataFrames di panduan memulai BigQuery menggunakan BigQuery DataFrames. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery DataFrames.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

# 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

Menjelaskan hasil prediksi

Untuk memahami alasan model menghasilkan hasil prediksi ini, Anda dapat menggunakan fungsi ML.EXPLAIN_PREDICT.

ML.EXPLAIN_PREDICT adalah versi yang diperluas dari fungsi ML.PREDICT. ML.EXPLAIN_PREDICT tidak hanya menghasilkan output hasil prediksi, tetapi juga menghasilkan kolom tambahan untuk menjelaskan hasil prediksi. Dalam praktiknya, Anda dapat menjalankan ML.EXPLAIN_PREDICT, bukan ML.PREDICT. Untuk mengetahui informasi selengkapnya, lihat Ringkasan Explainable AI BigQuery ML.

Jalankan kueri ML.EXPLAIN_PREDICT:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri berikut:

    SELECT
    *
    FROM
    ML.EXPLAIN_PREDICT(MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'evaluation'),
      STRUCT(3 as top_k_features))
  3. Hasilnya akan terlihat seperti berikut:

    Output ML.EXPLAIN_PREDICT

Untuk model regresi logistik, nilai Shapley digunakan untuk menghasilkan nilai atribusi fitur untuk setiap fitur dalam model. ML.EXPLAIN_PREDICT menghasilkan tiga atribusi fitur teratas per baris tampilan input_data karena top_k_features ditetapkan ke 3 dalam kueri. Atribusi ini diurutkan menurut nilai absolut atribusi dalam urutan menurun. Di baris 1 contoh ini, fitur hours_per_week berkontribusi paling banyak terhadap prediksi keseluruhan, tetapi di baris 2, occupation berkontribusi paling banyak terhadap prediksi keseluruhan.

Menjelaskan model secara global

Untuk mengetahui fitur mana yang umumnya paling penting guna menentukan kelompok pendapatan, Anda dapat menggunakan fungsi ML.GLOBAL_EXPLAIN. Untuk menggunakan ML.GLOBAL_EXPLAIN, Anda harus melatih ulang model dengan opsi ENABLE_GLOBAL_EXPLAIN yang disetel ke TRUE.

Latih ulang dan dapatkan penjelasan global untuk model:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri berikut untuk melatih ulang model:

    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. Di editor kueri, jalankan kueri berikut untuk mendapatkan penjelasan global:

    SELECT
      *
    FROM
      ML.GLOBAL_EXPLAIN(MODEL `census.census_model`)
  4. Hasilnya akan terlihat seperti berikut:

    Output ML.GLOBAL_EXPLAIN

Pembersihan

Agar akun Google Cloud Anda tidak dikenai biaya untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus resource satu per satu.

Menghapus set data Anda

Jika project Anda dihapus, semua set data dan semua tabel dalam project akan dihapus. Jika ingin menggunakan kembali project tersebut, Anda dapat menghapus set data yang dibuat dalam tutorial ini:

  1. Jika perlu, buka halaman BigQuery di konsol Google Cloud.

    Buka halaman BigQuery

  2. Di navigasi, klik set data census yang Anda buat.

  3. Klik Delete dataset di sisi kanan jendela. Tindakan ini akan menghapus set data dan model.

  4. Di kotak dialog Delete dataset, konfirmasi perintah hapus dengan mengetikkan nama set data Anda (census), lalu klik Delete.

Menghapus project Anda

Untuk menghapus project:

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah berikutnya