Menggunakan BigQuery ML untuk membuat rekomendasi dari rating film


Tutorial ini memperkenalkan analis data pada model faktorisasi matriks di BigQuery ML. BigQuery ML memungkinkan pengguna membuat dan menjalankan model machine learning di BigQuery menggunakan kueri SQL. Tujuannya adalah mendemokrasikan machine learning dengan memungkinkan praktisi SQL membuat model menggunakan alat yang ada dan meningkatkan kecepatan pengembangan dengan meniadakan kebutuhan akan pemindahan data.

Dalam tutorial ini, Anda akan mempelajari cara membuat model dari masukan eksplisit menggunakan set data movielens1m untuk membuat rekomendasi berdasarkan ID film dan ID pengguna

Set data movielens berisi rating dari skala 1 hingga 5 yang diberikan pengguna pada film, beserta metadata film seperti genre.

Tujuan

Dalam tutorial ini, Anda akan menggunakan:

  • BigQuery ML untuk membuat model rekomendasi eksplisit menggunakan pernyataan CREATE MODEL
  • Fungsi ML.EVALUATE untuk mengevaluasi model ML
  • Fungsi ML.WEIGHTS untuk memeriksa bobot faktor laten yang dihasilkan selama pelatihan.
  • Fungsi ML.RECOMMEND untuk menghasilkan rekomendasi bagi pengguna.

Biaya

Tutorial ini menggunakan komponen Google Cloud yang dapat dikenai biaya, 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. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Make sure that billing is enabled for your Google Cloud project.

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

    Buka pemilih project

  5. Make sure that billing is enabled for your Google Cloud project.

  6. BigQuery secara otomatis diaktifkan dalam project baru. Untuk mengaktifkan BigQuery dalam project yang sudah ada, buka

    Aktifkan API BigQuery.

    Mengaktifkan API

Langkah pertama: Buat set data Anda

Buat set data BigQuery untuk menyimpan model ML Anda:

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka halaman 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 bqml_tutorial.

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

      Set data publik disimpan di US multi-region. Untuk mempermudah, simpan set data Anda di lokasi yang sama.

    • Jangan ubah setelan default yang tersisa, lalu klik Create dataset.

      Buat halaman set data.

Langkah kedua: Muat set data Movielens ke BigQuery

Berikut adalah langkah-langkah untuk memuat 1 juta set data movielens ke BigQuery menggunakan alat command line BigQuery. Set data bernama movielens akan dibuat dan tabel movielens yang relevan akan disimpan di dalamnya.

curl -O 'http://files.grouplens.org/datasets/movielens/ml-1m.zip'
unzip ml-1m.zip
bq mk --dataset movielens
sed 's/::/,/g' ml-1m/ratings.dat > ratings.csv
bq load --source_format=CSV movielens.movielens_1m ratings.csv \
  user_id:INT64,item_id:INT64,rating:FLOAT64,timestamp:TIMESTAMP

Karena judul film berisi titik dua, koma, dan pipa, kita perlu menggunakan pembatas yang berbeda. Untuk memuat judul film, gunakan varian yang sedikit berbeda dari dua perintah terakhir.

sed 's/::/@/g' ml-1m/movies.dat > movie_titles.csv
bq load --source_format=CSV --field_delimiter=@ \
 movielens.movie_titles movie_titles.csv \
 movie_id:INT64,movie_title:STRING,genre:STRING

Langkah ketiga: Buat model rekomendasi eksplisit

Selanjutnya, Anda membuat model rekomendasi eksplisit menggunakan tabel contoh lensa film yang dimuat pada langkah sebelumnya. Kueri GoogleSQL berikut digunakan untuk membuat model yang akan digunakan untuk memprediksi rating setiap pasangan item pengguna.

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.my_explicit_mf_model`
OPTIONS
  (model_type='matrix_factorization',
   user_col='user_id',
   item_col='item_id',
   l2_reg=9.83,
   num_factors=34) AS
SELECT
  user_id,
  item_id,
  rating
FROM `movielens.movielens_1m`

Selain membuat model, menjalankan perintah CREATE MODEL akan melatih model yang Anda buat.

Detail kueri

Klausa CREATE MODEL digunakan untuk membuat dan melatih model bernama bqml_tutorial.my_explicit_mf_model.

Klausa OPTIONS(model_type='matrix_factorization', user_col='user_id', ...) menunjukkan bahwa Anda membuat model faktorisasi matriks. Secara default, tindakan ini akan membuat model faktorisasi matriks eksplisit, kecuali jika feedback_type='IMPLICIT' ditentukan. Contoh cara membuat model faktorisasi matriks implisit akan dijelaskan dalam artikel Menggunakan BigQuery ML untuk membuat rekomendasi untuk masukan implisit.

Pernyataan SELECT kueri ini menggunakan kolom berikut untuk membuat rekomendasi.

  • user_id—ID pengguna (INT64).
  • item_id—ID film (INT64).
  • rating—Rating eksplisit dari 1 hingga 5 yang diberikan user_id kepada item_id (FLOAT64).

Klausul FROMmovielens.movielens_1m — menunjukkan bahwa Anda membuat kueri tabel movielens_1m dalam set data movielens. Set data ini ada di proyek BigQuery jika petunjuk pada langkah kedua telah diikuti.

Menjalankan kueri CREATE MODEL

Untuk menjalankan kueri CREATE MODEL guna membuat dan melatih model Anda:

  1. Di konsol Google Cloud, klik tombol Buat kueri baru.

  2. Masukkan kueri GoogleSQL berikut di area teks Query editor.

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.my_explicit_mf_model`
OPTIONS
  (model_type='matrix_factorization',
   user_col='user_id',
   item_col='item_id',
   l2_reg=9.83,
   num_factors=34) AS
SELECT
  user_id,
  item_id,
  rating
FROM `movielens.movielens_1m`
  1. Klik Jalankan.

    Pemrosesan kueri ini memerlukan waktu sekitar 10 menit, setelah itu model Anda (my_explicit_mf_model) akan muncul di panel navigasi Konsol Google Cloud. Karena kueri tersebut menggunakan pernyataan CREATE MODEL untuk membuat model, Anda tidak akan melihat hasil kueri.

Langkah keempat (opsional): Dapatkan statistik pelatihan

Untuk melihat hasil pelatihan model, Anda dapat menggunakan fungsi ML.TRAINING_INFO, atau Anda dapat melihat statistik di konsol Google Cloud. Dalam tutorial ini, Anda akan menggunakan konsol Google Cloud.

Algoritma machine learning membuat model dengan memeriksa banyak contoh dan mencoba menemukan model yang meminimalkan kerugian. Proses ini disebut minimalisasi risiko empiris.

Untuk melihat statistik pelatihan model yang dihasilkan saat Anda menjalankan kueri CREATE MODEL:

  1. Di panel navigasi konsol Google Cloud, di bagian Resource, luaskan [PROJECT_ID] > bqml_tutorial, lalu klik my_implicit_mf_model.

  2. Klik tab Pelatihan, lalu klik Tabel. Hasilnya akan terlihat seperti berikut:

    Output ML.TRAINING_INFO.

    Kolom Training Data Loss menunjukkan metrik kerugian yang dihitung setelah model dilatih menggunakan set data pelatihan. Karena Anda melakukan faktorisasi matriks, kolom ini adalah rataan kuadrat galat (RKG). Secara default, model faktorisasi matriks tidak akan membagi data, sehingga kolom Evaluation Data Loss tidak akan ditampilkan kecuali jika set data holdout ditentukan karena pembagian data berpotensi menghilangkan semua peringkat untuk pengguna atau item. Akibatnya, model tidak akan memiliki informasi faktor laten tentang pengguna atau item yang tidak ada.

    Untuk mengetahui detail selengkapnya tentang fungsi ML.TRAINING_INFO, lihat referensi sintaksis ML BigQuery.

Langkah kelima: Evaluasi model Anda

Setelah membuat model, Anda mengevaluasi performa pemberi rekomendasi menggunakan fungsi ML.EVALUATE. Fungsi ML.EVALUATE mengevaluasi prediksi rating terhadap rating yang sebenarnya.

Kueri yang digunakan untuk mengevaluasi model adalah sebagai berikut:

#standardSQL
SELECT
  *
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.my_explicit_mf_model`,
    (
    SELECT
      user_id,
      item_id,
      rating
     FROM
      `movielens.movielens_1m`))

Detail kueri

Pernyataan SELECT paling atas mengambil kolom dari model Anda.

Klausa FROM menggunakan fungsi ML.EVALUATE terhadap model Anda: bqml_tutorial.my_explicit_mf_model.

Pernyataan SELECT dan klausa FROM bertingkat dari kueri ini sama dengan pernyataan dalam kueri CREATE MODEL.

Anda juga dapat memanggil ML.EVALUATE tanpa memberikan data input. Pelatihan ini akan menggunakan metrik evaluasi yang dihitung selama pelatihan:

#standardSQL
SELECT
  *
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.my_explicit_mf_model`)

Menjalankan kueri ML.EVALUATE

Untuk menjalankan kueri ML.EVALUATE yang mengevaluasi model:

  1. Di konsol Google Cloud, klik tombol Buat kueri baru.

  2. Masukkan kueri GoogleSQL berikut di area teks Query editor.

    #standardSQL
    SELECT
    *
    FROM
    ML.EVALUATE(MODEL `bqml_tutorial.my_explicit_mf_model`,
      (
      SELECT
    user_id,
    item_id,
    rating
       FROM
    `movielens.movielens_1m`))
  3. (Opsional) Untuk menetapkan lokasi pemrosesan, klik More > Query settings. Untuk Processing location, pilih US. Langkah ini bersifat opsional karena lokasi pemrosesan terdeteksi secara otomatis berdasarkan lokasi set data.

    Query settings.

  4. Klik Run.

  5. Setelah kueri selesai, klik tab Results di bawah area teks kueri. Hasilnya akan terlihat seperti berikut:

    Output ML.EVALUATE.

    Karena Anda melakukan faktorisasi matriks eksplisit, hasilnya mencakup kolom berikut:

    • mean_absolute_error
    • mean_squared_error
    • mean_squared_log_error
    • median_absolute_error
    • r2_score
    • explained_variance

Metrik penting dalam hasil evaluasi adalah skor R2. Skor R2 adalah ukuran statistik yang menentukan apakah prediksi regresi linear memperkirakan data sebenarnya. 0 menunjukkan bahwa model tidak menjelaskan variabilitas data respons di sekitar nilai rata-rata. 1 menunjukkan bahwa model menjelaskan semua variabilitas data respons di sekitar nilai rata-rata.

Langkah keenam: Gunakan model Anda untuk memprediksi rating dan membuat rekomendasi

Menemukan semua rating item untuk sekumpulan pengguna

ML.RECOMMEND tidak perlu menggunakan argumen tambahan selain model, tetapi dapat menggunakan tabel opsional. Jika tabel input hanya memiliki satu kolom yang cocok dengan nama kolom input user atau item input, semua prediksi rating item untuk setiap user akan dihasilkan dan sebaliknya. Perlu diketahui bahwa jika semua users atau semua items berada dalam tabel input, hasil yang akan ditampilkan adalah tidak meneruskan argumen opsional ke ML.RECOMMEND.

Berikut adalah contoh kueri untuk mengambil semua prediksi rating film untuk 5 pengguna:

#standardSQL
SELECT
  *
FROM
  ML.RECOMMEND(MODEL `bqml_tutorial.my_explicit_mf_model`,
    (
    SELECT
      user_id
    FROM
      `movielens.movielens_1m`
    LIMIT 5))

Detail kueri

Pernyataan SELECT paling atas mengambil kolom user, item, dan predicted_rating. Kolom terakhir ini dihasilkan oleh fungsi ML.RECOMMEND. Saat Anda menggunakan fungsi ML.RECOMMEND, nama kolom output untuk model adalah predicted_<rating_column_name>. Untuk model faktorisasi matriks eksplisit, predicted_rating adalah estimasi nilai rating.

Fungsi ML.RECOMMEND digunakan untuk memprediksi rating menggunakan model Anda: bqml_tutorial.my_explicit_mf_model.

Pernyataan SELECT bertingkat pada kueri ini hanya memilih kolom user_id dari tabel asli yang digunakan untuk pelatihan.

Klausul LIMITLIMIT 5—akan memfilter 5 user_id secara acak untuk dikirim ke ML.RECOMMEND.

Menemukan rating untuk semua pasangan item pengguna

Setelah mengevaluasi model, langkah berikutnya adalah menggunakannya untuk memprediksi rating. Anda menggunakan model Anda untuk memprediksi rating setiap kombinasi item pengguna di kueri berikut:

#standardSQL
SELECT
  *
FROM
  ML.RECOMMEND(MODEL `bqml_tutorial.my_explicit_mf_model`)

Detail kueri

Pernyataan SELECT paling atas mengambil kolom user, item, dan predicted_rating. Kolom terakhir ini dihasilkan oleh fungsi ML.RECOMMEND. Saat Anda menggunakan fungsi ML.RECOMMEND, nama kolom output untuk model adalah predicted_<rating_column_name>. Untuk model faktorisasi matriks eksplisit, predicted_rating adalah estimasi nilai rating.

Fungsi ML.RECOMMEND digunakan untuk memprediksi rating menggunakan model Anda: bqml_tutorial.my_explicit_mf_model.

Salah satu cara untuk menyimpan hasilnya ke tabel adalah:

#standardSQL
CREATE OR REPLACE TABLE `bqml_tutorial.recommend_1m`
OPTIONS() AS
SELECT
  *
FROM
  ML.RECOMMEND(MODEL `bqml_tutorial.my_explicit_mf_model`)

Jika terjadi error Query Exceeded Resource Limits untuk ML.RECOMMEND, coba lagi dengan tingkat penagihan yang lebih tinggi. Di alat command line BigQuery, hal ini dapat ditetapkan menggunakan flag --maximum_billing_tier.

Buat rekomendasi.

Dengan kueri rekomendasi sebelumnya, kita dapat mengurutkan berdasarkan rating yang diprediksi dan menampilkan item prediksi teratas untuk setiap pengguna. Kueri berikut menggabungkan item_ids dengan movie_ids yang ada dalam tabel movielens.movie_titles yang diupload sebelumnya dan menghasilkan 5 film teratas yang direkomendasikan per pengguna.

#standardSQL
SELECT
  user_id,
  ARRAY_AGG(STRUCT(movie_title, genre, predicted_rating)
ORDER BY predicted_rating DESC LIMIT 5)
FROM (
SELECT
  user_id,
  item_id,
  predicted_rating,
  movie_title,
  genre
FROM
  `bqml_tutorial.recommend_1m`
JOIN
  `movielens.movie_titles`
ON
  item_id = movie_id)
GROUP BY
  user_id

Detail kueri

Pernyataan SELECT bagian dalam menjalankan inner join pada item_id dari tabel hasil rekomendasi dan movie_id dari tabel movielens.movie_titles. movielens.movie_titles tidak hanya memetakan movie_id ke nama film, tetapi juga menyertakan genre film seperti yang dicantumkan oleh IMDB.

Pernyataan SELECT level atas menggabungkan hasil dari pernyataan SELECT bertingkat menggunakan GROUPS BY user_id untuk menggabungkan movie_title, genre, dan predicted_rating dalam urutan menurun dan hanya mempertahankan 5 film teratas.

Menjalankan kueri ML.RECOMMEND

Untuk menjalankan kueri ML.RECOMMEND yang menghasilkan 5 film teratas yang direkomendasikan per pengguna:

  1. Di konsol Google Cloud, klik tombol Buat kueri baru.

  2. Masukkan kueri GoogleSQL berikut di area teks Query editor.

    #standardSQL
    CREATE OR REPLACE TABLE `bqml_tutorial.recommend_1m`
    OPTIONS() AS
    SELECT
    *
    FROM
    ML.RECOMMEND(MODEL `bqml_tutorial.my_explicit_mf_model`)
  3. Klik Jalankan.

    Setelah kueri selesai berjalan, (bqml_tutorial.recommend_1m) akan muncul di panel navigasi. Karena kueri ini menggunakan pernyataan CREATE TABLE untuk membuat tabel, Anda tidak akan melihat hasil kueri.

  4. Tulis kueri baru lainnya. Masukkan kueri GoogleSQL berikut di area teks Query editor setelah kueri sebelumnya selesai berjalan.

    #standardSQL
    SELECT
     user_id,
     ARRAY_AGG(STRUCT(movie_title, genre, predicted_rating)
    ORDER BY predicted_rating DESC LIMIT 5)
    FROM (
    SELECT
     user_id,
     item_id,
     predicted_rating,
     movie_title,
     genre
    FROM
     `bqml_tutorial.recommend_1m`
    JOIN
     `movielens.movie_titles`
    ON
     item_id = movie_id)
    GROUP BY
     user_id
  5. (Opsional) Untuk menetapkan lokasi pemrosesan, klik More > Query settings. Untuk Processing location, pilih US. Langkah ini bersifat opsional karena lokasi pemrosesan terdeteksi secara otomatis berdasarkan lokasi set data.

    Query settings.

  6. Klik Run.

  7. Setelah kueri selesai, klik tab Results di bawah area teks kueri. Hasilnya akan terlihat seperti berikut:

    Output ML.RECOMMEND.

Karena kita memiliki informasi metadata tambahan tentang setiap movie_id selain INT64, kita dapat melihat info seperti genre tentang 5 film teratas yang direkomendasikan untuk setiap pengguna. Jika Anda tidak memiliki tabel movietitles yang setara untuk data pelatihan, hasilnya mungkin tidak dapat ditafsirkan secara manusia hanya dengan ID atau hash angka.

Genre teratas per faktor

Jika Anda ingin tahu dengan genre apa setiap faktor laten yang mungkin berkorelasi, Anda dapat menjalankan kueri berikut:

#standardSQL
SELECT
  factor,
  ARRAY_AGG(STRUCT(feature, genre,
      weight)
  ORDER BY
    weight DESC
  LIMIT
    10) AS weights
FROM (
  SELECT
    * EXCEPT(factor_weights)
  FROM (
    SELECT
      *
    FROM (
      SELECT
        factor_weights,
        CAST(feature AS INT64) as feature
      FROM
        ML.WEIGHTS(model `bqml_tutorial.my_explicit_mf_model`)
      WHERE
        processed_input= 'item_id')
    JOIN
      `movielens.movie_titles`
    ON
      feature = movie_id) weights
  CROSS JOIN
    UNNEST(weights.factor_weights)
  ORDER BY
    feature,
    weight DESC)
GROUP BY
  factor

Detail kueri

Pernyataan SELECT paling dalam mendapatkan array bobot item_id atau faktor film, lalu menggabungkannya dengan tabel movielens.movie_titles untuk mendapatkan genre setiap ID item.

Hasilnya kemudian CROSS JOIN dengan setiap array factor_weights yang hasilnya kemudian ORDER BY feature, weight DESC.

Terakhir, pernyataan SELECT level teratas menggabungkan hasil dari pernyataan internalnya dengan factor dan membuat array untuk setiap faktor yang diurutkan berdasarkan bobot setiap genre.

Menjalankan kueri

Untuk menjalankan kueri di atas yang menghasilkan 10 genre film teratas per faktor:

  1. Di konsol Google Cloud, klik tombol Buat kueri baru.

  2. Masukkan kueri GoogleSQL berikut di area teks Query editor.

#standardSQL
SELECT
  factor,
  ARRAY_AGG(STRUCT(feature, genre,
      weight)
  ORDER BY
    weight DESC
  LIMIT
    10) AS weights
FROM (
  SELECT
    * EXCEPT(factor_weights)
  FROM (
    SELECT
      *
    FROM (
      SELECT
        factor_weights,
        CAST(feature AS INT64) as feature
      FROM
        ML.WEIGHTS(model `bqml_tutorial.my_explicit_mf_model`)
      WHERE
        processed_input= 'item_id')
    JOIN
      `movielens.movie_titles`
    ON
      feature = movie_id) weights
  CROSS JOIN
    UNNEST(weights.factor_weights)
  ORDER BY
    feature,
    weight DESC)
GROUP BY
  factor
  1. (Opsional) Untuk menetapkan lokasi pemrosesan, klik More > Query settings. Untuk Processing location, pilih US. Langkah ini bersifat opsional karena lokasi pemrosesan terdeteksi secara otomatis berdasarkan lokasi set data.

    Query settings.

  2. Klik Run.

  3. Setelah kueri selesai, klik tab Results di bawah area teks kueri. Hasilnya akan terlihat seperti berikut:

    Analisis bobot.

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.

  • Anda dapat menghapus project yang dibuat.
  • Atau, Anda dapat menyimpan project dan menghapus set data.

Menghapus set data

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

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

    Buka halaman BigQuery

  2. Di navigasi, klik set data bqml_tutorial yang telah Anda buat.

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

  4. Di kotak dialog Delete dataset, konfirmasi perintah hapus dengan mengetikkan nama set data Anda (bqml_tutorial), 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