Codelab pengoptimalan Pembelian dalam aplikasi di perangkat real time

1. Ringkasan

1cbf855eda62c306.pngS

Selamat datang di codelab pengoptimalan pembelian dalam aplikasi di perangkat Realtime. Dalam codelab ini, Anda akan mempelajari cara menggunakan TensorFlow Lite dan Firebase untuk melatih dan men-deploy model personalisasi kustom ke aplikasi Anda.

Tutorial ini menunjukkan cara membuat model machine learning untuk personalisasi, khususnya yang memprediksi penawaran pembelian dalam aplikasi (IAP) yang optimal berdasarkan kondisi pengguna saat ini. Ini adalah contoh masalah bandit kontekstual, jenis masalah machine learning yang penting dan dapat diterapkan secara luas yang akan Anda pelajari lebih lanjut dalam codelab ini

Yang akan Anda pelajari

  • Mengumpulkan data analisis melalui Firebase Analytics
  • Melakukan prapemrosesan data analisis menggunakan BigQuery
  • Latih model ML sederhana untuk pengoptimalan pembelian dalam aplikasi (IAP) di perangkat
  • Men-deploy model TFLite ke Firebase ML dan mengaksesnya dari aplikasi Anda
  • Ukur dan bereksperimen dengan berbagai model melalui Firebase A/B Testing
  • Latih dan deploy model baru menggunakan data terbaru secara rutin

Yang Anda butuhkan

  • Android Studio versi 3.4+
  • Perangkat pengujian fisik dengan Android 2.3+ dan layanan Google Play 9.8 atau yang lebih baru, atau Emulator dengan layanan Google Play 9.8 atau yang lebih baru
  • Jika menggunakan perangkat tes fisik, kabel koneksi
  • Pengetahuan baru tentang ML

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana Anda menilai pengalaman membuat aplikasi Android?

Pemula Menengah Mahir

2. Pernyataan Masalah

Misalkan Anda adalah developer game yang ingin menampilkan saran pembelian dalam aplikasi (IAP) yang dipersonalisasi di akhir setiap level. Anda hanya dapat menampilkan sejumlah opsi pembelian dalam aplikasi (IAP) yang terbatas setiap kali, dan Anda tidak tahu opsi mana yang memiliki konversi terbaik. Mengingat setiap pengguna dan setiap sesi berbeda, bagaimana cara menemukan penawaran IAP yang memberikan estimasi reward tertinggi?

3. Mendapatkan kode contoh

Clone repositori GitHub dari command line.

git clone https://github.com/googlecodelabs/firebase-iap-optimization.git

Repositori ini berisi:

  1. Sebuah Jupyter notebook (.ipynb) yang melatih model personalisasi dan memaketkannya menjadi model TFLite
  2. Contoh aplikasi Kotlin yang menggunakan model TFLite untuk membuat prediksi di perangkat

4. Menjalankan aplikasi dengan Firebase

Dalam codelab ini, kita akan mengerjakan pengoptimalan IAP aplikasi game fiksi kami - Flappy Sparky. Game ini adalah side-scroller yang memungkinkan pemain mengontrol Sparky, yang mencoba terbang di antara kolom-kolom dinding tanpa mengenainya. Di awal level, pengguna akan melihat penawaran pembelian dalam aplikasi (IAP) yang akan memberi mereka kekuatan tambahan. Kita hanya akan menerapkan bagian pengoptimalan IAP pada aplikasi di codelab ini.

Anda akan dapat menerapkan apa yang dipelajari di sini ke aplikasi Anda sendiri yang terhubung ke project Firebase. Atau, Anda dapat membuat project Firebase baru untuk codelab ini. Jika Anda memerlukan bantuan untuk memulai Firebase, lihat tutorial kami tentang topik ini ( Android dan iOS).

5. Mengumpulkan peristiwa analisis di aplikasi Anda

Peristiwa Analytics memberikan insight tentang perilaku pengguna, dan digunakan untuk melatih model ML. Misalnya, model tersebut dapat mempelajari bahwa pengguna yang bermain lebih lama cenderung melakukan pembelian dalam aplikasi (IAP) untuk mendapatkan nyawa tambahan. Model ML memerlukan peristiwa analisis sebagai input untuk mempelajari informasi ini.

Beberapa peristiwa analisis yang mungkin ingin kita catat meliputi:

  • Durasi pengguna memainkan game
  • Level yang dicapai pengguna
  • Jumlah koin yang dibelanjakan pengguna
  • Item yang dibeli pengguna

Download data sampel (Opsional)

Dalam langkah-langkah berikut, kita akan menggunakan Firebase Analytics untuk mencatat peristiwa analisis yang akan digunakan dalam model. Jika Anda sudah memiliki data analisis yang ingin digunakan, buka bagian "Melatih model pengoptimalan" di codelab ini dan Anda dapat mengikuti contoh data kami.

Mengumpulkan Data dengan Firebase Analytics SDK

Kami akan menggunakan Firebase Analytics untuk membantu mengumpulkan peristiwa analisis ini. Firebase Analytics SDK secara otomatis menangkap sejumlah peristiwa dan properti pengguna. API ini juga memungkinkan Anda menentukan peristiwa kustom sendiri untuk mengukur peristiwa yang unik bagi aplikasi Anda.

Menginstal Firebase Analytics SDK

Anda dapat memulai Firebase Analytics di aplikasi dengan mengikuti dokumentasi Mulai Menggunakan Google Analytics. Repositori firebase-iap-optimization yang di-clone di awal codelab ini sudah menyertakan Firebase Analytics SDK.

Membuat log peristiwa kustom

Setelah menyiapkan Firebase Analytics SDK, kita dapat mulai mencatat log peristiwa yang diperlukan untuk melatih model.

Sebelum melakukannya, penting untuk menetapkan User-ID dalam peristiwa analisis, sehingga kita dapat mengaitkan data analisis untuk pengguna tersebut dengan data yang sudah ada di aplikasi.

MainActivity.kt

firebaseAnalytics.setUserId("player1")

Selanjutnya kita dapat mencatat peristiwa pemain. Untuk pengoptimalan IAP, kita ingin mencatat setiap penawaran IAP yang ditampilkan kepada pengguna dan apakah penawaran tersebut diklik oleh pengguna. Tindakan ini akan memberi kita dua peristiwa analisis - offer_iap dan offer_accepted. Kita juga akan melacak offer_id unik sehingga dapat digunakan nanti untuk menggabungkan data ini untuk melihat apakah penawaran diterima.

MainActivity.kt

predictButton?.setOnClickListener {
  predictionResult = iapOptimizer.predict()

  firebaseAnalytics.logEvent("offer_iap"){
    param("offer_type", predictionResult)
    param("offer_id", sessionId)
  }
}

acceptButton?.setOnClickListener {
  firebaseAnalytics.logEvent("offer_accepted") {
    param("offer_type", predictionResult)
    param("offer_id", sessionId)
  }
}

Untuk informasi selengkapnya tentang pencatatan peristiwa kustom ke dalam log, buka dokumentasi Peristiwa Log Firebase Analytics.

6. Melakukan prapemrosesan data di BigQuery

Pada langkah terakhir, kami mengumpulkan peristiwa tentang penawaran IAP yang ditampilkan kepada pengguna dan penawaran IAP yang diklik oleh pengguna. Pada langkah ini, kita akan menggabungkan data peristiwa ini dengan data pengguna sehingga model kita dapat belajar dari gambaran lengkap.

Untuk melakukannya, kita harus memulai dengan mengekspor peristiwa analisis ke BigQuery.

Untuk menautkan project Firebase dan aplikasinya ke BigQuery:

  1. Login ke Firebase.
  2. Klik ikon Setelan, lalu pilih Setelan Project.
  3. Di halaman Setelan Project, klik tab Integrasi.
  4. Di kartu BigQuery, klik Tautkan.

(Opsional) Mengekspor koleksi Firestore ke BigQuery

Pada langkah ini, Anda memiliki opsi untuk mengekspor data pengguna tambahan dari Firestore ke BigQuery untuk digunakan guna membantu melatih model. Jika Anda ingin melewati langkah ini sekarang, langsung buka bagian "Menyiapkan data di BigQuery" di codelab ini dan Anda dapat mengikuti peristiwa Firebase Analytics yang dicatat dalam log di langkah terakhir.

Firestore mungkin adalah tempat Anda menyimpan tanggal pendaftaran pengguna, pembelian dalam aplikasi yang dilakukan, level dalam game, saldo koin, atau atribut lain yang mungkin berguna dalam melatih model.

Untuk mengekspor koleksi Firestore ke BigQuery, Anda dapat menginstal Ekstensi BigQuery Export Firestore. Kemudian, gabungkan tabel di BigQuery untuk menggabungkan data ini dengan data dari Google Analytics untuk digunakan dalam model personalisasi Anda dan di seluruh codelab ini.

Menyiapkan data di BigQuery

Dalam beberapa langkah berikutnya, kita akan menggunakan BigQuery untuk mengubah data analisis mentah menjadi data yang dapat digunakan untuk melatih model.

Agar model dapat mempelajari penawaran IAP mana yang akan ditampilkan berdasarkan pengguna dan status game, kita perlu mengatur data tentang hal berikut:

  • pengguna
  • status game
  • penawaran yang diberikan
  • apakah penawaran yang disajikan diklik atau tidak

Semua data ini perlu disusun menjadi satu baris dalam tabel agar model dapat memprosesnya. Untungnya, BigQuery disiapkan untuk membantu kita melakukan hal itu.

BigQuery memungkinkan pembuatan "tampilan" untuk menjaga kueri Anda tetap teratur. Tampilan adalah tabel virtual yang ditentukan oleh kueri SQL. Saat Anda membuat tampilan, kuerinya dengan cara yang sama seperti saat Anda membuat kueri tabel. Dengan menggunakan ini, kita dapat membersihkan data analisis terlebih dahulu.

Untuk melihat apakah setiap penawaran pembelian dalam aplikasi diklik, kita harus menggabungkan peristiwa offer_iap dan offer_accepted yang kita catat di langkah sebelumnya.

all_offers_joined - tampilan BigQuery

SELECT
  iap_offers.*,
  CASE
    WHEN accepted_offers.accepted IS NULL THEN FALSE ELSE TRUE
  END
  is_clicked,
FROM
  `iap-optimization.ml_sample.accepted_offers` AS accepted_offers
RIGHT JOIN
  `iap-optimization.ml_sample.iap_offers` AS iap_offers
ON
 accepted_offers.offer_id =iap_offers.offer_id;

all_offers_with_user_data - Tampilan BigQuery

SELECT
  offers.is_clicked,
  offers.presented_powerup,
  offers.last_run_end_reason,
  offers.event_timestamp,
  users.*
FROM
  `iap-optimization.ml_sample.all_offers_joined` AS offers
LEFT JOIN
  `iap-optimization.ml_sample.all_users` AS users
ON
  users.user_id = offers.user_id;

Mengekspor set data bigQuery ke Google Cloud Storage

Terakhir, kita dapat mengekspor set data bigquery ke GCS sehingga dapat digunakan dalam pelatihan model.

888daa7ba4db8e44.pngS

14d22bf474fae455.png

7. Melatih model pengoptimalan

Contoh data

Gunakan data Anda dari langkah sebelumnya, "Praproses data di BigQuery", atau contoh data yang dapat didownload yang disediakan di sini untuk mengikuti codelab ini.

Definisi masalah

Sebelum kita mulai melatih model, mari kita luangkan waktu untuk mendefinisikan masalah bandit kontekstual.

Penjelasan bandit kontekstual

Di awal setiap level di Flappy Sparky, pengguna diberi penawaran IAP yang akan memberi mereka kekuatan tambahan. Kami hanya dapat menampilkan satu opsi IAP setiap kali, dan tidak tahu mana yang memiliki konversi terbaik. Mengingat setiap pengguna dan setiap sesi berbeda, bagaimana cara menemukan penawaran IAP yang memberikan estimasi reward tertinggi?

Dalam kasus ini, mari kita buat reward 0 jika pengguna tidak menerima penawaran IAP, dan nilai IAP jika menerima. Untuk mencoba memaksimalkan reward, kita dapat menggunakan data historis untuk melatih model yang memprediksi reward yang diharapkan untuk setiap tindakan yang diberikan kepada pengguna, dan menemukan tindakan dengan reward tertinggi.

7d3264141498bff.jpeg

Berikut ini yang akan kita gunakan dalam prediksi:

  • Status: informasi tentang pengguna dan sesinya saat ini
  • Tindakan: Penawaran IAP yang dapat kita pilih untuk ditampilkan
  • Reward: nilai penawaran IAP

Eksploitasi vs Eksplorasi

Untuk semua masalah multi-armed bandits, algoritma perlu menyeimbangkan antara eksplorasi (mendapatkan lebih banyak data untuk mempelajari tindakan mana yang memberikan hasil optimal) dan eksploitasi (menggunakan hasil optimal untuk mendapatkan reward tertinggi).

Dalam masalah versi kami, hal ini akan disederhanakan untuk hanya melatih model secara berkala di cloud dan hanya melakukan prediksi saat menggunakan model di perangkat pengguna (bukan melatih model pada perangkat pengguna). Untuk memastikan kita memiliki data pelatihan yang memadai setelah menggunakan model, terkadang kita perlu menampilkan hasil acak kepada pengguna aplikasi (mis. 30%). Strategi yang menyeimbangkan eksplorasi dan eksploitasi ini disebut Epsilon-greedy.

Melatih model

Anda dapat menggunakan skrip pelatihan (training.ipynb) yang disediakan dengan codelab untuk memulai. Tujuan kita adalah melatih model yang memprediksi reward yang diharapkan untuk setiap tindakan yang diberikan suatu status, lalu kita menemukan tindakan yang memberi kita reward tertinggi yang diharapkan.

Pelatihan lokal

Cara termudah untuk mulai melatih model Anda sendiri adalah dengan membuat salinan notebook dalam contoh kode untuk codelab ini.

Anda tidak memerlukan GPU untuk codelab ini, tetapi jika Anda memerlukan mesin yang lebih canggih untuk menjelajahi data Anda sendiri dan melatih model Anda sendiri, Anda bisa mendapatkan instance AI Platform Notebook untuk mempercepat pelatihan.

Dalam skrip pelatihan yang disediakan, kami membuat iterator yang menghasilkan data pelatihan dari file CSV yang diekspor dari BigQuery. Kemudian, kita menggunakan data untuk mulai melatih model dengan Keras. Detail tentang cara melatih model dapat ditemukan di komentar notebook Python.

Mengukur performa model

Saat melatih model, kita akan membandingkannya dengan agen acak yang memilih penawaran IAP secara acak untuk melihat apakah model kita benar-benar mempelajari. Logika ini berada di ValidationCallback.

Pada akhir pelatihan, kita menggunakan data di test.csv untuk menguji model kita lagi. Model ini belum pernah melihat data ini sebelumnya, jadi kita bisa yakin bahwa hasilnya bukan karena overfitting. Dalam hal ini, model berperforma 28% lebih baik daripada agen acak.

Mengekspor model TFLite

Sekarang kita memiliki model terlatih yang siap digunakan, tetapi saat ini model tersebut menggunakan format TensorFlow. Kita harus mengekspor model dalam format TFLite agar dapat dijalankan di perangkat seluler.

train.ipynb

converter = tflite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

with tf.io.gfile.GFile('iap-optimizer.tflite', 'wb') as f:
  f.write(tflite_model)

Dari sini, Anda dapat mendownload model dan memaketkan model dengan aplikasi Anda.

Secara opsional, untuk aplikasi produksi, sebaiknya Anda men-deploy model ke Firebase ML dan meminta Firebase menghosting model Anda. Hal ini berguna untuk dua alasan utama:

  1. Kita dapat membuat ukuran penginstalan aplikasi tetap kecil dan hanya mendownload model jika diperlukan
  2. Model dapat diupdate secara berkala dan dengan siklus rilis yang berbeda dari seluruh aplikasi

Untuk mempelajari cara men-deploy model ke Firebase ML, Anda dapat mengikuti codelab Menambahkan Firebase ke Aplikasi Android yang didukung TFLite. Anda memiliki opsi untuk men-deploy menggunakan Firebase console atau Python API.

8. Membuat prediksi di perangkat

Langkah selanjutnya adalah membuat prediksi menggunakan model di perangkat. Anda dapat menemukan aplikasi contoh yang mendownload model dari Firebase ML dalam folder app kode contoh yang Anda download, dan menggunakannya untuk melakukan inferensi dengan beberapa data sisi klien.

Karena kita menerapkan beberapa pra-pemrosesan selama pelatihan model, kita perlu menerapkan pra-pemrosesan yang sama ke input model saat berjalan di perangkat. Cara sederhana untuk melakukannya adalah dengan menggunakan format yang tidak bergantung pada platform dan bahasa seperti file JSON yang berisi peta setiap fitur ke metadata tentang cara pra-pemrosesan yang dilakukan. Anda dapat menemukan detail selengkapnya tentang cara melakukannya di aplikasi contoh.

Selanjutnya, kita berikan input pengujian kepada model sebagai berikut:

IapOptimzer.kt

  val testInput = mapOf(
    "coins_spent" to                       2048f,
    "distance_avg" to                      1234f,
    "device_os" to                         "ANDROID",
    "game_day" to                          10f,
    "geo_country" to                       "Canada",
    "last_run_end_reason" to               "laser"
  )

Model ini menyarankan sparky_armor adalah kekuatan tambahan IAP terbaik untuk pengguna khusus ini.

a3381dbcdbdf811e.png

Mengukur akurasi model

Untuk mengukur akurasi model, kita cukup melacak penawaran IAP yang diprediksi oleh model dan apakah penawaran diklik menggunakan Firebase Analytics. Anda dapat menggunakannya bersama dengan Firebase A/B Testing untuk mengukur performa model yang sebenarnya. Lebih jauh lagi, Anda juga dapat melakukan pengujian A/B pada iterasi model yang berbeda. Anda dapat mempelajari lebih lanjut pengujian A/B dengan Firebase dalam dokumentasi Membuat Eksperimen Firebase Remote Config dengan A/B Testing.

9. (Opsional): Memperbarui model secara rutin dengan data baru

Jika Anda perlu memperbarui model saat data baru masuk, Anda dapat menyiapkan pipeline untuk melatih ulang model secara berulang. Untuk melakukannya, pastikan terlebih dahulu bahwa Anda memiliki data baru yang akan digunakan untuk pelatihan dengan strategi epsilon-greedy yang disebutkan di atas. (misalnya, Menggunakan hasil prediksi model 70% dari waktu dan menggunakan hasil acak 30% dari waktu tersebut).

Mengonfigurasi pipeline untuk pelatihan dan men-deploy dengan data baru berada di luar cakupan codelab ini. Anda dapat melihat Google Cloud AI Platform dan TFX untuk memulai.

10. Selamat!

Dalam codelab ini, Anda telah mempelajari cara melatih dan men-deploy model TFLite di perangkat untuk mengoptimalkan pembelian dalam aplikasi menggunakan Firebase. Untuk mempelajari lebih lanjut tentang TFLite dan Firebase, lihat contoh TFLite lainnya dan panduan memulai Firebase.

Jika ada pertanyaan, Anda dapat mengajukannya di Stack Overflow #firebase-machine-learning.

Yang telah kita bahas

  • TensorFlow Lite
  • Firebase ML
  • Firebase Analytics
  • BigQuery

Langkah Berikutnya

  • Latih dan deploy model pengoptimal untuk aplikasi Anda.

Pelajari Lebih Lanjut