arrow_back

Metode Prediksi Bracket Turnamen dengan Machine Learning Google

Login Gabung
Uji dan bagikan pengetahuan Anda kepada komunitas kami.
done
Dapatkan akses ke lebih dari 700 lab praktik, badge keahlian, dan kursus

Metode Prediksi Bracket Turnamen dengan Machine Learning Google

Lab 1 jam 15 menit universal_currency_alt 5 Kredit show_chart Menengah
info Lab ini mungkin menggabungkan alat AI untuk mendukung pembelajaran Anda.
Uji dan bagikan pengetahuan Anda kepada komunitas kami.
done
Dapatkan akses ke lebih dari 700 lab praktik, badge keahlian, dan kursus

GSP461

Lab Mandiri Google Cloud

Ringkasan

BigQuery adalah database analisis berbiaya rendah dan NoOps yang dikelola sepenuhnya oleh Google. Dengan BigQuery, Anda dapat mengkueri data berskala terabyte tanpa perlu mengelola infrastruktur atau memiliki administrator database. BigQuery menggunakan SQL dan memanfaatkan model bayar sesuai penggunaan. Dengan BigQuery, Anda dapat berfokus pada analisis data untuk menemukan insight yang bermakna.

BigQuery ML memungkinkan analis data menggunakan pengetahuan SQL mereka untuk membangun model machine learning dengan cepat di lokasi data mereka berada di BigQuery.

Di BigQuery, terdapat set data yang tersedia bagi publik untuk pertandingan, tim, dan pemain basket NCAA. Data pertandingan ini mencakup data setiap pertandingan dan detail skor sejak tahun 2009, serta skor final sejak tahun 1996. Untuk beberapa tim, bahkan terdapat data tambahan terkait kemenangan dan kekalahan sejak musim 1894-1895.

Di lab ini, Anda akan menggunakan BigQuery ML untuk membuat prototipe, melatih, mengevaluasi, dan memprediksi tim yang 'menang' dan 'kalah' antara dua tim dalam turnamen basket NCAA.

Yang akan Anda lakukan

Di lab ini, Anda akan mempelajari cara:

  • Menggunakan BigQuery untuk mengakses set data publik NCAA
  • Mempelajari set data NCAA untuk memahami skema dan cakupan data yang tersedia
  • Menyiapkan dan mengubah data yang ada menjadi fitur dan label
  • Membagi set data menjadi subset pelatihan dan evaluasi
  • Menggunakan BigQuery ML untuk membangun model berdasarkan set data turnamen NCAA
  • Menggunakan model yang baru Anda buat untuk memprediksi pemenang turnamen NCAA untuk bracket Anda

Prasyarat

Ini adalah lab tingkat menengah. Sebelum mengikutinya, Anda harus memiliki pengalaman dengan SQL dan kata kunci bahasa. Sebaiknya Anda juga memahami BigQuery. Jika Anda perlu mendapatkan informasi tentang bidang ini, setidaknya Anda harus mengikuti salah satu lab berikut sebelum mencoba lab ini:

Penyiapan dan persyaratan

Sebelum mengklik tombol Mulai Lab

Baca petunjuk ini. Lab memiliki timer dan Anda tidak dapat menjedanya. Timer, yang dimulai saat Anda mengklik Start Lab, akan menampilkan durasi ketersediaan resource Google Cloud untuk Anda.

Lab praktik ini dapat Anda gunakan untuk melakukan sendiri aktivitas lab di lingkungan cloud sungguhan, bukan di lingkungan demo atau simulasi. Untuk mengakses lab ini, Anda akan diberi kredensial baru yang bersifat sementara dan dapat digunakan untuk login serta mengakses Google Cloud selama durasi lab.

Untuk menyelesaikan lab ini, Anda memerlukan:

  • Akses ke browser internet standar (disarankan browser Chrome).
Catatan: Gunakan jendela Samaran atau browser pribadi untuk menjalankan lab ini. Hal ini akan mencegah konflik antara akun pribadi Anda dan akun Siswa yang dapat menyebabkan tagihan ekstra pada akun pribadi Anda.
  • Waktu untuk menyelesaikan lab. Ingat, setelah dimulai, lab tidak dapat dijeda.
Catatan: Jika Anda sudah memiliki project atau akun pribadi Google Cloud, jangan menggunakannya untuk lab ini agar terhindar dari tagihan ekstra pada akun Anda.

Cara memulai lab dan login ke Google Cloud Console

  1. Klik tombol Start Lab. Jika Anda perlu membayar lab, jendela pop-up akan terbuka untuk memilih metode pembayaran. Di sebelah kiri adalah panel Lab Details dengan info berikut:

    • Tombol Open Google Cloud console
    • Waktu tersisa
    • Kredensial sementara yang harus Anda gunakan untuk lab ini
    • Informasi lain, jika diperlukan, untuk menyelesaikan lab ini
  2. Klik Open Google Cloud console (atau klik kanan dan pilih Open Link in Incognito Window jika Anda menjalankan browser Chrome).

    Lab akan menjalankan resource, lalu membuka tab lain yang menampilkan halaman Sign in.

    Tips: Atur tab di jendela terpisah secara berdampingan.

    Catatan: Jika Anda melihat dialog Choose an account, klik Use Another Account.
  3. Jika perlu, salin Username di bawah dan tempel ke dialog Sign in.

    {{{user_0.username | "Username"}}}

    Anda juga dapat menemukan Username di panel Lab Details.

  4. Klik Next.

  5. Salin Password di bawah dan tempel ke dialog Welcome.

    {{{user_0.password | "Password"}}}

    Anda juga dapat menemukan Password di panel Lab Details.

  6. Klik Next.

    Penting: Anda harus menggunakan kredensial yang diberikan lab. Jangan menggunakan kredensial akun Google Cloud Anda. Catatan: Menggunakan akun Google Cloud sendiri untuk lab ini dapat dikenai biaya tambahan.
  7. Klik halaman berikutnya:

    • Setujui persyaratan dan ketentuan.
    • Jangan tambahkan opsi pemulihan atau autentikasi 2 langkah (karena ini akun sementara).
    • Jangan mendaftar uji coba gratis.

Setelah beberapa saat, Konsol Google Cloud akan terbuka di tab ini.

Catatan: Untuk melihat menu dengan daftar produk dan layanan Google Cloud, klik Navigation menu di kiri atas. Ikon Navigation menu

Membuka konsol BigQuery

  1. Di Google Cloud Console, pilih Navigation menu > BigQuery.

Kotak pesan Welcome to BigQuery in the Cloud Console akan terbuka. Kotak pesan ini menyediakan link ke panduan memulai dan catatan rilis.

  1. Klik Done.

Konsol BigQuery terbuka.

Tugas 1. Membuka konsol BigQuery

  1. Dari Konsol Cloud, buka Navigation menu dan pilih BigQuery.

  2. Klik DONE untuk membuka UI versi beta. Pastikan Project ID Anda telah tercantum di tab Explorer, yang akan terlihat seperti ini:

Tab Explorer dengan project yang dipilih

Jika Anda mengklik panah Expand node di samping project, Anda tidak akan melihat database atau tabel apa pun di sana. Hal ini karena Anda belum menambahkan apa pun ke dalam project tersebut.

Untungnya, ada banyak set data publik terbuka yang tersedia di BigQuery yang dapat Anda gunakan. Sekarang Anda akan mempelajari lebih lanjut set data NCAA dan mengetahui cara menambahkan set data tersebut ke project BigQuery Anda.

Tugas 2. NCAA March Madness

National Collegiate Athletic Association (NCAA) menyelenggarakan dua turnamen basket besar tingkat perguruan tinggi setiap tahun di Amerika Serikat, yang dapat diikuti oleh pebasket putra dan putri di perguruan tinggi. Untuk turnamen basket putra NCAA yang diadakan pada bulan Maret, ada 68 tim yang ikut pertandingan eliminasi tunggal dan satu tim akan menjadi pemenang turnamen March Madness ini.

NCAA menawarkan set data publik yang berisi statistik data pertandingan dan pemain putra dan putri untuk musim tersebut dan turnamen final. Data pertandingan ini mencakup data setiap pertandingan dan detail skor sejak tahun 2009, serta skor final sejak tahun 1996. Untuk beberapa tim, bahkan terdapat data tambahan terkait kemenangan dan kekalahan sejak musim 1894-1895.

Tugas 3. Menemukan set data publik NCAA di BigQuery

  1. Untuk langkah ini, pastikan Anda masih berada di Konsol BigQuery. Pada tab Explorer, klik tombol + ADD, lalu pilih Public datasets.

  2. Di kotak penelusuran, ketik NCAA Basketball dan tekan Enter. Satu hasil akan muncul. Pilih hasil tersebut, lalu klik VIEW DATASET:

Hasil penelusuran NCAA Basketball ditampilkan dan tombol VIEW DATASET ditandai

Tindakan ini akan membuka tab BigQuery baru dan set data akan ditampilkan. Anda dapat terus bekerja di tab ini, atau menutupnya dan memuat ulang Konsol BigQuery di tab lain untuk menampilkan set data publik Anda.

Catatan: Jika Anda tidak dapat melihat `ncaa_basketball`, klik + ADD > Star a project by name. Masukkan bigquery-public-data sebagai nama project, lalu klik STAR.
  1. Luaskan set data bigquery-public-data > ncaa_basketball untuk menampilkan tabelnya:

Set data ncaa_basketball menampilkan beberapa tabel

Anda akan melihat 10 tabel di set data ini.

  1. Klik mbb_historical_tournament_games, lalu klik PREVIEW untuk melihat contoh baris data.

  2. Setelah itu, klik DETAILS untuk memperoleh metadata terkait tabel tersebut.

Halaman Anda akan terlihat seperti berikut:

Halaman tab Details yang menampilkan Table info, seperti Table ID, Table size, dan Long-term storage size

Tugas 4. Menulis kueri untuk menentukan musim dan pertandingan yang tersedia

Anda akan menulis kueri SQL sederhana untuk menentukan seberapa banyak musim dan pertandingan yang tersedia untuk dipelajari di tabel mbb_historical_tournament_games kita.

  1. Di EDITOR kueri, yang ada di atas bagian 'Table Details', salin dan tempel kode berikut di kolom tersebut:
SELECT season, COUNT(*) as games_per_tournament FROM `bigquery-public-data.ncaa_basketball.mbb_historical_tournament_games` GROUP BY season ORDER BY season # default is Ascending (low to high)
  1. Klik RUN. Setelah selesai, Anda akan menerima output seperti berikut:

Layar Query results yang menampilkan tabel pertandingan di setiap turnamen

  1. Scroll output yang ditampilkan, lalu catat jumlah musim dan pertandingan yang dimainkan per musim. Anda akan menggunakan informasi tersebut untuk menjawab pertanyaan di bawah ini. Selain itu, Anda juga dapat dengan cepat melihat berapa banyak baris yang ditampilkan dengan melihat di kanan bawah dekat panah penomoran halaman.

Klik Check my progress untuk memverifikasi tujuan. Menulis kueri untuk menentukan musim dan pertandingan yang tersedia

Uji pemahaman Anda

Pertanyaan pilihan ganda berikut akan memperkuat pemahaman Anda mengenai konsep yang telah dibahas sejauh ini. Jawab pertanyaan tersebut sebaik mungkin.

Tugas 5. Memahami fitur dan label machine learning

Tujuan akhir lab ini adalah untuk memprediksi pemenang pertandingan basket putra NCAA dengan menggunakan data historis pertandingan sebelumnya. Di machine learning, setiap kolom data yang membantu menentukan hasil akhir (menang atau kalah dalam pertandingan turnamen) disebut feature (fitur).

Kolom data yang Anda coba prediksi disebut label. Model machine learning "mempelajari" hubungan antara sejumlah fitur untuk memprediksi hasil akhir dari sebuah label.

Contoh fitur untuk set data historis Anda antara lain:

  • Musim
  • Nama tim
  • Nama tim lawan
  • Peringkat tim
  • Peringkat tim lawan

Label yang Anda akan coba prediksi untuk pertandingan berikutnya adalah game outcome (hasil akhir pertandingan) — yaitu apakah tim tersebut kalah atau menang.

Uji pemahaman Anda

Pertanyaan pilihan ganda berikut akan memperkuat pemahaman Anda mengenai konsep yang telah dibahas sejauh ini. Jawab pertanyaan tersebut sebaik mungkin.

Tugas 6. Membuat set data machine learning berlabel

Membangun model machine learning memerlukan banyak data pelatihan berkualitas tinggi. Untungnya, set data NCAA kita cukup kredibel sehingga kita dapat mengandalkannya untuk membangun model yang efektif.

  1. Kembali ke Konsol BigQuery—Anda akan melihat hasil kueri yang tadi Anda jalankan.

  2. Dari menu di sebelah kiri, buka tabel mbb_historical_tournament_games dengan mengklik nama tabel. Setelah tabel terbuka, klik PREVIEW. Halaman Anda akan terlihat seperti berikut:

Tabel mbb_historical_tournament_games di halaman tab Preview

Uji pemahaman Anda

Pertanyaan pilihan ganda berikut akan memperkuat pemahaman Anda mengenai konsep yang telah dibahas sejauh ini. Jawab pertanyaan tersebut sebaik mungkin.

  1. Setelah memeriksa set data, Anda akan melihat bahwa satu baris di set data tersebut memiliki kolom untuk win_market dan lose_market. Anda harus membagi data pertandingan tunggal menjadi data untuk masing-masing tim, sehingga Anda dapat melabeli setiap baris sebagai "menang" atau "kalah".

  2. Di EDITOR kueri, salin dan tempel kueri berikut, lalu klikRUN:

# create a row for the winning team SELECT # features season, # ex: 2015 season has March 2016 tournament games round, # sweet 16 days_from_epoch, # how old is the game game_date, day, # Friday 'win' AS label, # our label win_seed AS seed, # ranking win_market AS market, win_name AS name, win_alias AS alias, win_school_ncaa AS school_ncaa, # win_pts AS points, lose_seed AS opponent_seed, # ranking lose_market AS opponent_market, lose_name AS opponent_name, lose_alias AS opponent_alias, lose_school_ncaa AS opponent_school_ncaa # lose_pts AS opponent_points FROM `bigquery-public-data.ncaa_basketball.mbb_historical_tournament_games` UNION ALL # create a separate row for the losing team SELECT # features season, round, days_from_epoch, game_date, day, 'loss' AS label, # our label lose_seed AS seed, # ranking lose_market AS market, lose_name AS name, lose_alias AS alias, lose_school_ncaa AS school_ncaa, # lose_pts AS points, win_seed AS opponent_seed, # ranking win_market AS opponent_market, win_name AS opponent_name, win_alias AS opponent_alias, win_school_ncaa AS opponent_school_ncaa # win_pts AS opponent_points FROM `bigquery-public-data.ncaa_basketball.mbb_historical_tournament_games`

Anda akan menerima output berikut:

Halaman Query results dengan tab yang menampilkan beberapa baris data untuk judul kolom seperti season, round, dan game_date

Klik Check my progress untuk memverifikasi tujuan. Membuat set data machine learning berlabel

Setelah Anda mengetahui fitur apa saja yang tersedia dari hasil kueri, jawab pertanyaan berikut untuk memperkuat pemahaman Anda mengenai set data.

Tugas 7. Membuat model machine learning untuk memprediksi pemenang berdasarkan peringkat dan nama tim

Setelah mempelajari data, kini saatnya untuk melatih model machine learning.

  • Gunakan penilaian terbaik Anda dan jawab pertanyaan berikut untuk mengarahkan Anda dalam bagian ini.

Memilih jenis model

Untuk masalah ini, Anda akan membangun model klasifikasi. Karena kita memiliki dua kelas, yaitu kalah atau menang, model ini juga disebut sebagai model klasifikasi biner. Sebuah tim bisa menang atau kalah dalam pertandingan.

Jika mau, setelah lab ini selesai, Anda dapat memperkirakan jumlah total poin yang akan dicetak oleh sebuah tim dengan menggunakan model perkiraan, tetapi hal itu tidak menjadi fokus kita di sini.

Cara mudah untuk mengetahui apakah Anda sedang membuat perkiraan atau klasifikasi adalah dengan melihat jenis label (kolom) data yang Anda prediksi:

  • Jika berupa kolom numerik (seperti unit terjual atau poin dalam pertandingan), berarti Anda sedang membuat perkiraan
  • Jika berupa nilai string, berarti Anda sedang membuat klasifikasi (baris ini dapat ditujukan untuk kelas ini atau kelas yang lain), dan
  • Jika ada lebih dari dua kelas (seperti menang, kalah, atau seri), berarti Anda sedang membuat klasifikasi kelas jamak

Model klasifikasi ini akan menjalankan machine learning dengan model statistik yang banyak digunakan yang disebut Regresi Logistik.

Kita memerlukan model yang menghasilkan probabilitas untuk setiap kemungkinan nilai label terpisah, dalam kasus ini adalah 'menang' atau 'kalah'. Untuk tujuan ini, regresi logistik adalah jenis model yang baik untuk memulai. Kabar baik untuk Anda adalah bahwa model ML akan melakukan semua perhitungan dan pengoptimalan selama pelatihan model -- inilah keahlian komputer yang sesungguhnya.

Catatan: Ada banyak model machine learning lainnya dengan beraneka kompleksitas untuk melakukan tugas klasifikasi. Salah satu model yang paling sering digunakan di Google adalah Deep Learning dengan Jaringan Neural.

Membuat model machine learning dengan BigQuery ML

Untuk membuat model klasifikasi di BigQuery, kita hanya perlu menulis pernyataan SQL CREATE MODEL dan memberikan beberapa opsi.

Namun, sebelum membuat model, kita perlu tempat untuk menyimpannya di project kita.

  1. Pada tab Explorer, klik ikon View actions di samping Project ID, lalu pilih Create dataset.

Tab Explorer yang menampilkan opsi menu Create dataset

  1. Tindakan ini akan membuka dialog Create dataset. Tetapkan Dataset ID Anda ke bracketology, lalu klik CREATE DATASET.

Kotak dialog Create dataset

  1. Sekarang jalankan perintah berikut di EDITOR kueri
CREATE OR REPLACE MODEL `bracketology.ncaa_model` OPTIONS ( model_type='logistic_reg') AS # create a row for the winning team SELECT # features season, 'win' AS label, # our label win_seed AS seed, # ranking win_school_ncaa AS school_ncaa, lose_seed AS opponent_seed, # ranking lose_school_ncaa AS opponent_school_ncaa FROM `bigquery-public-data.ncaa_basketball.mbb_historical_tournament_games` WHERE season <= 2017 UNION ALL # create a separate row for the losing team SELECT # features season, 'loss' AS label, # our label lose_seed AS seed, # ranking lose_school_ncaa AS school_ncaa, win_seed AS opponent_seed, # ranking win_school_ncaa AS opponent_school_ncaa FROM `bigquery-public-data.ncaa_basketball.mbb_historical_tournament_games` # now we split our dataset with a WHERE clause so we can train on a subset of data and then evaluate and test the model's performance against a reserved subset so the model doesn't memorize or overfit to the training data. # tournament season information from 1985 - 2017 # here we'll train on 1985 - 2017 and predict for 2018 WHERE season <= 2017

Dalam kode tersebut, Anda akan melihat bahwa membuat model hanya memerlukan beberapa baris SQL. Salah satu opsi terpenting adalah memilih jenis model logistic_reg untuk tugas klasifikasi ini.

Catatan: Lihat panduan dokumentasi BigQuery ML untuk mengetahui daftar semua opsi model dan setelan yang tersedia. Dalam kasus ini, kita sudah memiliki kolom bernama "label", jadi kita tidak perlu menentukan kolom label dengan menggunakan opsi model: input_label_cols.

Proses untuk melatih model akan memakan waktu 3 sampai 5 menit. Anda akan menerima output berikut saat tugas selesai dijalankan:

Layar Query results yang menampilkan pesan di tab Results

  1. Klik tombol Go to Model di samping kanan konsol.

Klik Check my progress untuk memverifikasi tujuan. Membuat model machine learning

Melihat detail pelatihan model

  • Setelah Anda berada di bagian Model details, scroll ke bawah ke bagian Training options, lalu lihat iterasi sesungguhnya yang dilakukan model pada pelatihan.

Jika Anda familier dengan machine learning, Anda juga dapat menyesuaikan semua hyperparameter ini (opsi yang ditetapkan sebelum model berjalan) dengan menentukan nilainya di pernyataan OPTIONS.

Jika Anda pengguna baru machine learning, BigQuery ML akan menetapkan nilai default secara cerdas untuk setiap opsi yang tidak ditetapkan.

Lihat daftar opsi model BigQuery ML untuk mempelajari lebih lanjut.

Melihat statistik pelatihan model

Model machine learning "mempelajari" hubungan antara fitur yang diketahui dan label yang belum diketahui. Anda mungkin menebak, beberapa fitur seperti "peringkat" atau "nama universitas" dapat lebih menentukan menang atau kalah daripada kolom data (fitur) lainnya, seperti tanggal pertandingan.

Model machine learning memulai proses pelatihan tanpa intuisi semacam itu dan umumnya akan mengacak pembobotan setiap fitur.

Selama proses pelatihan, model akan mengoptimalkan jalur menuju pembobotan terbaiknya untuk setiap fitur. Setiap kali dijalankan, model mencoba untuk meminimalkan Training Data Loss dan Evaluation Data Loss.

Jika Anda mendapati bahwa kehilangan data akhir untuk evaluasi jauh lebih tinggi daripada untuk pelatihan, berarti model Anda overfitting atau menghafal data pelatihan, bukan mempelajari hubungan yang dapat digeneralisasi.

Anda dapat melihat berapa banyak sesi pelatihan yang dilakukan model dengan mengklik tab TRAINING dan memilih opsi Table di bagian View as.

Pada sesi ini, model menyelesaikan 3 iterasi pelatihan dalam waktu 20 detik. Model Anda kemungkinan akan berbeda.

Tabel statistik model berisi empat baris data di bawah judul kolom Iteration, Training Data Loss, Evaluation Data Loss, Learn Rate, dan Completion Time (seconds)

Melihat apa yang telah dipelajari model terkait fitur

Setelah pelatihan, Anda dapat melihat fitur mana yang memberikan nilai terbanyak untuk model dengan memeriksa bobotnya.

  • Jalankan perintah berikut di EDITOR kueri:
SELECT category, weight FROM UNNEST(( SELECT category_weights FROM ML.WEIGHTS(MODEL `bracketology.ncaa_model`) WHERE processed_input = 'seed')) # try other features like 'school_ncaa' ORDER BY weight DESC

Output Anda akan terlihat seperti ini:

Halaman Query results yang menampilkan 10 baris data di bawah judul kolom Row, category, dan weight di tabel Results

Seperti yang Anda lihat, jika peringkat sebuah tim sangat rendah (1,2,3) atau sangat tinggi (14,15,16), model memberikan bobot signifikan (maksimal 1,0) dalam menentukan hasil akhir menang atau kalah. Secara intuitif, hal ini masuk akal karena kita mengharapkan tim dengan peringkat terendah dapat bermain dengan baik dalam turnamen.

Kecanggihan machine learning sesungguhnya adalah kita tidak perlu membuat banyak pernyataan IF THEN yang di-hardcode di SQL untuk memberi tahu model IF (JIKA) peringkatnya adalah 1, THEN (MAKA) berikan tim tersebut peluang 80% lebih tinggi untuk menang. Machine learning tidak menerapkan aturan dan logika yang di-hardcode, namun mempelajari hubungan ini untuknya sendiri. Lihat dokumentasi bobot sintaksis BQML untuk mempelajari lebih lanjut.

Tugas 8. Mengevaluasi performa model

Untuk mengevaluasi performa model, Anda dapat menjalankan perintah sederhana ML.EVALUATE terhadap model terlatih.

  • Jalankan perintah berikut di EDITOR kueri:
SELECT * FROM ML.EVALUATE(MODEL `bracketology.ncaa_model`)

Anda akan melihat output seperti ini:

Layar Query results yang menampilkan hasil ML.EVALUATE

Akurasi nilainya adalah sekitar 69%. Meskipun nilai ini lebih baik daripada melempar koin, ada banyak hal yang dapat ditingkatkan.

Catatan: Untuk model klasifikasi, akurasi model bukan satu-satunya metrik yang perlu diperhatikan pada output yang ditampilkan.

Karena Anda melakukan regresi logistik, Anda dapat mengevaluasi performa model terhadap semua metrik berikut (semakin mendekati 1,0, semakin baik hasilnya):

  • Precision (Presisi): Metrik untuk model klasifikasi. Presisi mengidentifikasi frekuensi terkait apakah model benar saat memprediksi kelas positif.
  • Recall (Perolehan): Metrik untuk model klasifikasi yang menjawab pertanyaan berikut: Dari semua kemungkinan label positif, berapa banyak label yang diidentifikasi dengan benar oleh model?
  • Accuracy (Akurasi): Akurasi adalah bagian dari prediksi model klasifikasi yang benar.
  • f1_score (Skor F1): Ukuran akurasi model. Skor F1 adalah rata-rata harmonik presisi dan perolehan. Nilai tertinggi Skor F1 adalah 1. Nilai terendahnya adalah 0.
  • log_loss (Kerugian log): Fungsi kerugian yang digunakan di regresi logistik. Metrik ini adalah ukuran seberapa jauh prediksi model dari label yang benar.
  • roc_auc (ABK KOP): Area di bawah kurva KOP. Ini adalah probabilitas bahwa pengklasifikasi lebih yakin bahwa contoh positif yang dipilih secara acak sebenarnya positif daripada contoh negatif yang dipilih secara acak adalah positif.
  • Tugas 9. Membuat prediksi

    Setelah melatih model dengan data historis sampai dan termasuk musim 2017 (ini adalah semua data yang Anda punya), kini saatnya membuat prediksi untuk musim 2018. Tim data science Anda telah menyediakan hasil turnamen tahun 2018 di tabel terpisah yang tidak ada di set data asli Anda.

    Membuat prediksi semudah memanggil ML.PREDICT pada model terlatih dan meneruskan set data yang ingin Anda gunakan sebagai acuan untuk membuat prediksi.

    • Jalankan perintah berikut di EDITOR kueri:
    CREATE OR REPLACE TABLE `bracketology.predictions` AS ( SELECT * FROM ML.PREDICT(MODEL `bracketology.ncaa_model`, # predicting for 2018 tournament games (2017 season) (SELECT * FROM `data-to-insights.ncaa.2018_tournament_results`) ) )

    Dalam waktu singkat, Anda akan melihat output seperti ini:

    Halaman Query results yang menampilkan pesan di tab Results yang mengonfirmasi bahwa tabel baru telah dibuat

    Klik Check my progress untuk memverifikasi tujuan. Mengevaluasi performa model dan membuat tabel

    Catatan: Anda menyimpan prediksi dalam tabel, sehingga nanti Anda dapat menjalankan kueri untuk insight tanpa harus menjalankan ulang kueri di atas.

    Sekarang Anda akan melihat set data asli dan juga tambahan tiga kolom baru:

    • Label yang diprediksi
    • Opsi label yang diprediksi
    • Probabilitas label yang diprediksi

    Karena Anda telah mengetahui hasil turnamen March Madness tahun 2018, mari kita lihat hasil prediksi model. (Tips: Jika Anda memprediksi untuk turnamen March Madness tahun ini, Anda hanya perlu meneruskan set data yang berisi peringkat tahun 2019 dan nama tim yang bertanding. Tentunya kolom label akan kosong karena pertandingan belum terjadi -- itulah yang Anda prediksi!).

    Tugas 10. Seberapa banyak model memprediksi dengan benar untuk turnamen NCAA tahun 2018?

    • Jalankan perintah berikut di EDITOR kueri:
    SELECT * FROM `bracketology.predictions` WHERE predicted_label <> label

    Anda akan melihat output seperti ini:

    Layar Query results yang menampilkan output prediksi

    Dari 134 prediksi (67 pertandingan pada turnamen March Madness), model salah sebanyak 38 kali. Artinya, prediksi model yang benar untuk pertandingan pada turnamen tahun 2018 secara keseluruhan adalah 70%.

    Tugas 11. Model hanya bisa melakukan sejauh ini...

    Ada banyak faktor dan fitur lain yang berperan dalam penentuan kemenangan tipis dan kejutan luar biasa pada turnamen March Madness yang sangat sulit diprediksi oleh model.

    Mari kita lihat kejutan terbesar yang terjadi pada turnamen tahun 2017 menurut model. Kita akan melihat ketika model memprediksi dengan keyakinan 80%+ dan ternyata SALAH.

    1. Jalankan perintah berikut di EDITOR kueri:
    SELECT model.label AS predicted_label, model.prob AS confidence, predictions.label AS correct_label, game_date, round, seed, school_ncaa, points, opponent_seed, opponent_school_ncaa, opponent_points FROM `bracketology.predictions` AS predictions, UNNEST(predicted_label_probs) AS model WHERE model.prob > .8 AND predicted_label <> predictions.label

    Hasilnya akan terlihat seperti ini:

    Layar Query results yang menampilkan output prediksi kalah/menang

    Prediksi: Model memprediksi Peringkat 1 Virginia mengalahkan Peringkat 16 UMBC dengan keyakinan 87%. Cukup wajar, bukan?

    Tonton video '16-seed UMBC pulls off a miracle upset over 1-seed Virginia' untuk melihat apa yang sebenarnya terjadi.

    Setelah pertandingan, Pelatih Odom (UMBC) mengatakan, "Sulit dipercaya — hanya itu yang bisa saya katakan." Baca selengkapnya tentang hal ini di artikel 2018 UMBC vs. Virginia men's basketball game.

    Rangkuman

    • Anda membuat model machine learning untuk memprediksi hasil akhir pertandingan.
    • Anda mengevaluasi performa model dan mendapatkan akurasi 69% dengan menggunakan peringkat dan nama tim sebagai fitur utama
    • Anda memprediksi hasil akhir turnamen tahun 2018
    • Anda menganalisis hasil untuk mendapatkan insight

    Tantangan selanjutnya adalah membangun model yang lebih baik TANPA menggunakan fitur peringkat dan nama tim.

    Tugas 12. Menggunakan fitur model ML yang terampil

    Di bagian kedua lab ini, Anda akan membangun model ML kedua menggunakan fitur yang baru disediakan dan mendetail.

    Setelah Anda memahami cara membangun model ML menggunakan BigQuery ML, tim data science Anda telah menyediakan set data setiap pertandingan baru di mana mereka telah membuat metrik tim baru untuk dipelajari oleh model Anda. Metrik tersebut meliputi:

    • Efisiensi penskoran dari waktu ke waktu berdasarkan analisis historis setiap pertandingan.
    • Penguasaan bola dari waktu ke waktu.

    Membuat set data ML baru dengan fitur terampil tersebut

    • Jalankan perintah berikut di EDITOR kueri:
    # create training dataset: # create a row for the winning team CREATE OR REPLACE TABLE `bracketology.training_new_features` AS WITH outcomes AS ( SELECT # features season, # 1994 'win' AS label, # our label win_seed AS seed, # ranking # this time without seed even win_school_ncaa AS school_ncaa, lose_seed AS opponent_seed, # ranking lose_school_ncaa AS opponent_school_ncaa FROM `bigquery-public-data.ncaa_basketball.mbb_historical_tournament_games` t WHERE season >= 2014 UNION ALL # create a separate row for the losing team SELECT # features season, # 1994 'loss' AS label, # our label lose_seed AS seed, # ranking lose_school_ncaa AS school_ncaa, win_seed AS opponent_seed, # ranking win_school_ncaa AS opponent_school_ncaa FROM `bigquery-public-data.ncaa_basketball.mbb_historical_tournament_games` t WHERE season >= 2014 UNION ALL # add in 2018 tournament game results not part of the public dataset: SELECT season, label, seed, school_ncaa, opponent_seed, opponent_school_ncaa FROM `data-to-insights.ncaa.2018_tournament_results` ) SELECT o.season, label, # our team seed, school_ncaa, # new pace metrics (basketball possession) team.pace_rank, team.poss_40min, team.pace_rating, # new efficiency metrics (scoring over time) team.efficiency_rank, team.pts_100poss, team.efficiency_rating, # opposing team opponent_seed, opponent_school_ncaa, # new pace metrics (basketball possession) opp.pace_rank AS opp_pace_rank, opp.poss_40min AS opp_poss_40min, opp.pace_rating AS opp_pace_rating, # new efficiency metrics (scoring over time) opp.efficiency_rank AS opp_efficiency_rank, opp.pts_100poss AS opp_pts_100poss, opp.efficiency_rating AS opp_efficiency_rating, # a little feature engineering (take the difference in stats) # new pace metrics (basketball possession) opp.pace_rank - team.pace_rank AS pace_rank_diff, opp.poss_40min - team.poss_40min AS pace_stat_diff, opp.pace_rating - team.pace_rating AS pace_rating_diff, # new efficiency metrics (scoring over time) opp.efficiency_rank - team.efficiency_rank AS eff_rank_diff, opp.pts_100poss - team.pts_100poss AS eff_stat_diff, opp.efficiency_rating - team.efficiency_rating AS eff_rating_diff FROM outcomes AS o LEFT JOIN `data-to-insights.ncaa.feature_engineering` AS team ON o.school_ncaa = team.team AND o.season = team.season LEFT JOIN `data-to-insights.ncaa.feature_engineering` AS opp ON o.opponent_school_ncaa = opp.team AND o.season = opp.season

    Dalam waktu singkat, Anda akan melihat output seperti ini:

    Pernyataan di layar Query results yang mengonfirmasi bahwa tabel telah diganti

    Klik Check my progress untuk memverifikasi tujuan. Menggunakan fitur model ML yang terampil

    Tugas 13. Melihat pratinjau fitur baru

    • Klik tombol Go to table di samping kanan konsol. Lalu, klik tab Preview.

    Tabel Anda akan terlihat seperti ini:

    Pratinjau tabel training_new_features

    Jangan khawatir jika output Anda tidak sama dengan screenshot di atas.

    Tugas 14. Menafsirkan metrik yang dipilih

    • Sekarang Anda akan belajar tentang beberapa label penting yang membantu dalam pembuatan prediksi.

    opp_efficiency_rank

    Peringkat Efisiensi Lawan: Peringkat tim lawan dari semua tim dalam mencetak angka secara efisien dari waktu ke waktu (poin per 100 penguasaan bola). Semakin rendah nilainya, maka semakin baik.

    opp_pace_rank

    Peringkat Laju Langkah Lawan: Peringkat tim lawan dari semua tim untuk penguasaan bola (durasi penguasaan dalam 40 menit). Semakin rendah nilainya, maka semakin baik.

    Setelah Anda memiliki fitur yang informatif terkait seberapa baik sebuah tim dapat mencetak skor dan menguasai bola, mari kita latih model kedua ini.

    Sebagai tindakan tambahan agar model Anda tidak "mengingat tim hebat dari periode sebelumnya", jangan sertakan nama tim dan peringkat tersebut untuk model ini dan berfokuslah hanya pada metrik.

    Tugas 15. Melatih model baru

    • Jalankan perintah berikut di EDITOR kueri:
    CREATE OR REPLACE MODEL `bracketology.ncaa_model_updated` OPTIONS ( model_type='logistic_reg') AS SELECT # this time, don't train the model on school name or seed season, label, # our pace poss_40min, pace_rank, pace_rating, # opponent pace opp_poss_40min, opp_pace_rank, opp_pace_rating, # difference in pace pace_rank_diff, pace_stat_diff, pace_rating_diff, # our efficiency pts_100poss, efficiency_rank, efficiency_rating, # opponent efficiency opp_pts_100poss, opp_efficiency_rank, opp_efficiency_rating, # difference in efficiency eff_rank_diff, eff_stat_diff, eff_rating_diff FROM `bracketology.training_new_features` # here we'll train on 2014 - 2017 and predict on 2018 WHERE season BETWEEN 2014 AND 2017 # between in SQL is inclusive of end points

    Dalam waktu singkat, output Anda akan terlihat seperti ini:

    Pernyataan di layar Query results yang mengonfirmasi bahwa model baru telah dibuat

    Tugas 16. Mengevaluasi performa model baru

    • Untuk mengevaluasi performa model baru, jalankan perintah berikut di EDITOR kueri:
    SELECT * FROM ML.EVALUATE(MODEL `bracketology.ncaa_model_updated`)

    Output Anda akan terlihat seperti ini:

    Halaman Query results dengan tab yang menampilkan tabel statistik dari model baru

    Wow! Anda baru saja melatih model baru dengan fitur berbeda dan meningkatkan akurasi menjadi sekitar 75% atau naik 5% dari model sebelumnya.

    Ini adalah salah satu pelajaran berharga yang diperoleh di machine learning, yaitu bahwa set data fitur berkualitas tinggi dapat membuat perbedaan signifikan dalam akurasi model Anda.

    Klik Check my progress untuk memverifikasi tujuan. Melatih model baru dan melakukan evaluasi

    Tugas 17. Memeriksa apa yang telah dipelajari model

    • Fitur mana yang paling menentukan hasil menang/kalah pada model ini? Cari tahu dengan menjalankan perintah berikut di EDITOR kueri:
    SELECT * FROM ML.WEIGHTS(MODEL `bracketology.ncaa_model_updated`) ORDER BY ABS(weight) DESC

    Output Anda akan terlihat seperti ini:

    Halaman Query results dengan tab yang menampilkan tabel hasil inspeksi bobot pada model baru

    Kita menggunakan nilai absolut dari bobot dalam menentukan urutan ini, sehingga fitur yang paling berpengaruh (untuk menang atau kalah) dicantumkan terlebih dahulu.

    Seperti yang Anda lihat dalam hasilnya, 3 teratas adalah pace_stat_diff, eff_stat_diff, dan eff_rating_diff. Mari kita pelajari ketiganya lebih lanjut.

    pace_stat_diff

    Seberapa berbeda statistik sebenarnya untuk (penguasaan bola/40 menit) antartim. Menurut model, ini adalah pendorong terbesar dalam memilih hasil akhir pertandingan.

    eff_stat_diff

    Seberapa berbeda statistik sebenarnya untuk (poin net/100 penguasaan bola) antartim.

    eff_rating_diff

    Seberapa berbeda rating yang dinormalisasi untuk efisiensi penskoran antartim.

    Fitur apa yang tidak dianggap berbobot tinggi oleh model dalam prediksinya? Musim. Fitur ini berada di urutan terakhir dalam daftar bobot di atas. Yang dimaksud oleh model adalah bahwa musim (tahun 2013, 2014, 2015) tidak terlalu berguna untuk memprediksi hasil akhir pertandingan. Tidak ada hal yang ajaib pada tahun "2014" bagi semua tim.

    Insight yang menarik adalah bahwa model lebih mementingkan laju langkah sebuah tim (seberapa baik mereka mengontrol bola) daripada seberapa efisien sebuah tim dapat mencetak skor.

    Tugas 18. Saatnya membuat prediksi!

    • Jalankan perintah berikut di EDITOR kueri:
    CREATE OR REPLACE TABLE `bracketology.ncaa_2018_predictions` AS # let's add back our other data columns for context SELECT * FROM ML.PREDICT(MODEL `bracketology.ncaa_model_updated`, ( SELECT * # include all columns now (the model has already been trained) FROM `bracketology.training_new_features` WHERE season = 2018 ))

    Output Anda akan terlihat seperti ini:

    Pernyataan di layar Query results yang mengonfirmasi bahwa tabel prediksi baru telah dibuat

    Klik Check my progress untuk memverifikasi tujuan. Menjalankan kueri untuk membuat tabel ncaa_2018_predictions

    Tugas 19. Analisis prediksi:

    Karena Anda mengetahui hasil akhir pertandingan yang benar, Anda dapat melihat di mana model membuat prediksi yang salah menggunakan set data pengujian baru.

    • Jalankan perintah berikut di EDITOR kueri:
    SELECT * FROM `bracketology.ncaa_2018_predictions` WHERE predicted_label <> label

    Halaman Query results dengan tab yang menampilkan tabel analisis prediksi

    Seperti yang Anda lihat dari jumlah data yang ditampilkan dari kueri, model salah memprediksi 48 pertandingan (24 laga) dari total jumlah pertandingan di turnamen tahun 2018 dengan akurasi 64%. 2018 pasti merupakan tahun yang luar biasa, mari kita lihat kejutan yang terjadi.

    Tugas 20. Kejutan apa yang terjadi pada March Madness 2018?

    • Jalankan perintah berikut di EDITOR kueri:
    SELECT CONCAT(school_ncaa, " was predicted to ",IF(predicted_label="loss","lose","win")," ",CAST(ROUND(p.prob,2)*100 AS STRING), "% but ", IF(n.label="loss","lost","won")) AS narrative, predicted_label, # what the model thought n.label, # what actually happened ROUND(p.prob,2) AS probability, season, # us seed, school_ncaa, pace_rank, efficiency_rank, # them opponent_seed, opponent_school_ncaa, opp_pace_rank, opp_efficiency_rank FROM `bracketology.ncaa_2018_predictions` AS n, UNNEST(predicted_label_probs) AS p WHERE predicted_label <> n.label # model got it wrong AND p.prob > .75 # by more than 75% confidence ORDER BY prob DESC

    Hasilnya akan terlihat seperti ini:

    Layar Query results yang menampilkan tabel kejutan di model baru

    Kejutan utamanya adalah sama seperti yang ditemukan oleh model sebelumnya, yaitu UMBC vs. Virginia. Baca selengkapnya tentang bagaimana tahun 2018 secara keseluruhan merupakan tahun yang penuh kejutan di artikel Has This Been the “Maddest” March?. Akankah tahun 2019 juga penuh kejutan?

    Tugas 21. Membandingkan performa model

    Bagaimana dengan saat model naif (membandingkan peringkat) salah, tetapi model yang lebih canggih bisa benar?

    • Jalankan perintah berikut di EDITOR kueri:
    SELECT CONCAT(opponent_school_ncaa, " (", opponent_seed, ") was ",CAST(ROUND(ROUND(p.prob,2)*100,2) AS STRING),"% predicted to upset ", school_ncaa, " (", seed, ") and did!") AS narrative, predicted_label, # what the model thought n.label, # what actually happened ROUND(p.prob,2) AS probability, season, # us seed, school_ncaa, pace_rank, efficiency_rank, # them opponent_seed, opponent_school_ncaa, opp_pace_rank, opp_efficiency_rank, (CAST(opponent_seed AS INT64) - CAST(seed AS INT64)) AS seed_diff FROM `bracketology.ncaa_2018_predictions` AS n, UNNEST(predicted_label_probs) AS p WHERE predicted_label = 'loss' AND predicted_label = n.label # model got it right AND p.prob >= .55 # by 55%+ confidence AND (CAST(opponent_seed AS INT64) - CAST(seed AS INT64)) > 2 # seed difference magnitude ORDER BY (CAST(opponent_seed AS INT64) - CAST(seed AS INT64)) DESC

    Hasilnya akan terlihat seperti ini:

    Layar Query results yang menampilkan tabel model baru

    Model memprediksi bahwa Florida St. (09) mengalahkan Xavier (01) dan itu terjadi!

    Kejutan tersebut diprediksi dengan benar oleh model baru (walaupun peringkat tim mengatakan hal sebaliknya) berdasarkan fitur terampil baru, seperti efisiensi laju langkah dan lemparan bola. Lihat sorotan pertandingan di YouTube.

    Tugas 22. Memprediksi turnamen March Madness 2019

    Setelah mengetahui tim dan peringkatnya untuk turnamen March Madness 2019, mari kita prediksi hasil pertandingan mendatang.

    Mempelajari data tahun 2019

    • Jalankan kueri berikut untuk mengetahui peringkat teratas
    SELECT * FROM `data-to-insights.ncaa.2019_tournament_seeds` WHERE seed = 1

    Hasilnya akan terlihat seperti ini:

    Layar Query results yang menampilkan tabel dengan hasil peringkat teratas tahun 2019

    Membuat matriks untuk semua pertandingan yang mungkin terjadi

    Karena kita belum mengetahui tim mana yang akan bertanding satu sama lain saat turnamen berlangsung, kita akan membuat mereka semua saling berhadapan.

    Di SQL, cara mudah untuk membuat sebuah tim berhadapan dengan semua tim lain dalam tabel adalah dengan CROSS JOIN.

    • Jalankan kueri di bawah ini untuk mendapatkan semua kemungkinan pertandingan tim di turnamen.
    SELECT NULL AS label, team.school_ncaa AS team_school_ncaa, team.seed AS team_seed, opp.school_ncaa AS opp_school_ncaa, opp.seed AS opp_seed FROM `data-to-insights.ncaa.2019_tournament_seeds` AS team CROSS JOIN `data-to-insights.ncaa.2019_tournament_seeds` AS opp # teams cannot play against themselves :) WHERE team.school_ncaa <> opp.school_ncaa

    Menambahkan statistik tim tahun 2018 (laju langkah, efisiensi)

    CREATE OR REPLACE TABLE `bracketology.ncaa_2019_tournament` AS WITH team_seeds_all_possible_games AS ( SELECT NULL AS label, team.school_ncaa AS school_ncaa, team.seed AS seed, opp.school_ncaa AS opponent_school_ncaa, opp.seed AS opponent_seed FROM `data-to-insights.ncaa.2019_tournament_seeds` AS team CROSS JOIN `data-to-insights.ncaa.2019_tournament_seeds` AS opp # teams cannot play against themselves :) WHERE team.school_ncaa <> opp.school_ncaa ) , add_in_2018_season_stats AS ( SELECT team_seeds_all_possible_games.*, # bring in features from the 2018 regular season for each team (SELECT AS STRUCT * FROM `data-to-insights.ncaa.feature_engineering` WHERE school_ncaa = team AND season = 2018) AS team, (SELECT AS STRUCT * FROM `data-to-insights.ncaa.feature_engineering` WHERE opponent_school_ncaa = team AND season = 2018) AS opp FROM team_seeds_all_possible_games ) # Preparing 2019 data for prediction SELECT label, 2019 AS season, # 2018-2019 tournament season # our team seed, school_ncaa, # new pace metrics (basketball possession) team.pace_rank, team.poss_40min, team.pace_rating, # new efficiency metrics (scoring over time) team.efficiency_rank, team.pts_100poss, team.efficiency_rating, # opposing team opponent_seed, opponent_school_ncaa, # new pace metrics (basketball possession) opp.pace_rank AS opp_pace_rank, opp.poss_40min AS opp_poss_40min, opp.pace_rating AS opp_pace_rating, # new efficiency metrics (scoring over time) opp.efficiency_rank AS opp_efficiency_rank, opp.pts_100poss AS opp_pts_100poss, opp.efficiency_rating AS opp_efficiency_rating, # a little feature engineering (take the difference in stats) # new pace metrics (basketball possession) opp.pace_rank - team.pace_rank AS pace_rank_diff, opp.poss_40min - team.poss_40min AS pace_stat_diff, opp.pace_rating - team.pace_rating AS pace_rating_diff, # new efficiency metrics (scoring over time) opp.efficiency_rank - team.efficiency_rank AS eff_rank_diff, opp.pts_100poss - team.pts_100poss AS eff_stat_diff, opp.efficiency_rating - team.efficiency_rating AS eff_rating_diff FROM add_in_2018_season_stats

    Membuat prediksi

    CREATE OR REPLACE TABLE `bracketology.ncaa_2019_tournament_predictions` AS SELECT * FROM # let's predicted using the newer model ML.PREDICT(MODEL `bracketology.ncaa_model_updated`, ( # let's predict on March 2019 tournament games: SELECT * FROM `bracketology.ncaa_2019_tournament` ))

    Klik Check my progress untuk memverifikasi tujuan. Menjalankan kueri untuk membuat tabel ncaa_2019_tournament dan ncaa_2019_tournament_predictions

    Mendapatkan prediksi Anda

    SELECT p.label AS prediction, ROUND(p.prob,3) AS confidence, school_ncaa, seed, opponent_school_ncaa, opponent_seed FROM `bracketology.ncaa_2019_tournament_predictions`, UNNEST(predicted_label_probs) AS p WHERE p.prob >= .5 AND school_ncaa = 'Duke' ORDER BY seed, opponent_seed

    Layar Query results yang menampilkan tabel dengan prediksi untuk Duke

    • Di sini, kita memfilter hasil model untuk melihat semua kemungkinan pertandingan Duke. Scroll untuk menemukan pertandingan Duke vs. North Dakota St.

    Insight: Duke (1) diunggulkan 88,5% untuk mengalahkan North Dakota St. (16) pada 22 Maret 2019.

    Bereksperimenlah dengan mengubah filter school_ncaa di atas untuk memprediksi pertandingan di bracket Anda. Tuliskan tingkat keyakinan model dan nikmati pertandingannya.

    Selamat!

    Anda telah menggunakan BigQuery ML untuk memprediksi tim yang menang untuk turnamen basket putra NCAA.

    Langkah berikutnya/Pelajari lebih lanjut

    Sertifikasi dan pelatihan Google Cloud

    ...membantu Anda mengoptimalkan teknologi Google Cloud. Kelas kami mencakup keterampilan teknis dan praktik terbaik untuk membantu Anda memahami dengan cepat dan melanjutkan proses pembelajaran. Kami menawarkan pelatihan tingkat dasar hingga lanjutan dengan opsi on demand, live, dan virtual untuk menyesuaikan dengan jadwal Anda yang sibuk. Sertifikasi membantu Anda memvalidasi dan membuktikan keterampilan serta keahlian Anda dalam teknologi Google Cloud.

    Manual Terakhir Diperbarui pada 19 Maret 2024

    Lab Terakhir Diuji pada 19 Maret 2024

    Hak cipta 2024 Google LLC Semua hak dilindungi undang-undang. Google dan logo Google adalah merek dagang dari Google LLC. Semua nama perusahaan dan produk lain mungkin adalah merek dagang masing-masing perusahaan yang bersangkutan.

    Konten ini tidak tersedia untuk saat ini

    Kami akan memberi tahu Anda melalui email saat konten tersedia

    Bagus!

    Kami akan menghubungi Anda melalui email saat konten tersedia