Codelab Pengoptimalan pembelian dalam aplikasi di perangkat secara real-time

1. Ringkasan

1cbf855eda62c306.pngS

Selamat datang di codelab Realtime on-device in-app purchase optimization. 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 model yang memprediksi penawaran pembelian dalam aplikasi (IAP) yang optimal berdasarkan status pengguna saat ini. Ini adalah contoh masalah bandit kontekstual, jenis masalah machine learning yang penting dan berlaku secara luas yang akan Anda pelajari lebih lanjut di codelab ini

Yang akan Anda pelajari

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

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 pengujian fisik, kabel koneksi
  • Pengetahuan ML pemula

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana Anda menilai pengalaman membuat aplikasi Android Anda?

Pemula Menengah Mahir

2. Pernyataan Masalah

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

3. Mendapatkan kode contoh

Clone repositori GitHub dari command line.

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

Repo ini berisi:

  1. Notebook Jupyter (.ipynb) yang melatih model personalisasi dan mengemasnya ke dalam 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 mengoptimalkan IAP aplikasi game fiksi kami - Flappy Sparky. Game ini adalah scroller samping yang memungkinkan pemain mengontrol Sparky, yang mencoba terbang di antara kolom dinding tanpa mengenainya. Di awal level, pengguna diberi penawaran IAP yang akan memberi mereka kekuatan tambahan. Kami hanya akan menerapkan bagian pengoptimalan IAP dari aplikasi dalam codelab ini.

Anda dapat menerapkan hal-hal 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 dapat mempelajari bahwa pengguna yang bermain lebih lama cenderung melakukan IAP untuk mendapatkan nyawa ekstra. Model ML memerlukan peristiwa analisis sebagai input untuk mempelajari informasi ini.

Beberapa peristiwa analisis yang mungkin ingin kita catat meliputi:

  • Berapa lama pengguna memainkan game
  • Tingkat yang dicapai pengguna
  • Jumlah koin yang dibelanjakan pengguna
  • Item yang dibeli pengguna

Mendownload data contoh (Opsional)

Pada langkah-langkah berikut, kita akan menggunakan Firebase Analytics untuk mencatat peristiwa analisis yang akan digunakan dalam model kita. Jika Anda sudah memiliki data analisis yang ingin digunakan, buka "Melatih model pengoptimalan" di bagian 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 akan otomatis merekam sejumlah peristiwa dan properti pengguna. SDK ini juga memungkinkan Anda menentukan peristiwa kustom Anda sendiri untuk mengukur peristiwa yang unik untuk aplikasi Anda.

Menginstal Firebase Analytics SDK

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

Mencatat peristiwa kustom ke dalam log

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

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

MainActivity.kt

firebaseAnalytics.setUserId("player1")

Selanjutnya, kita dapat mencatat peristiwa pemain ke dalam log. 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 kita dapat menggunakannya nanti untuk menggabungkan data ini guna 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 cara mencatat peristiwa kustom ke dalam log, buka dokumentasi Peristiwa Log Firebase Analytics.

6. Memproses data di BigQuery

Pada langkah terakhir, kita mengumpulkan peristiwa tentang penawaran IAP mana yang ditampilkan kepada pengguna dan penawaran IAP mana 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 mulai 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 Project Settings, klik tab Integrations.
  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 ingin melewati langkah ini untuk saat ini, lanjutkan ke bagian "Menyiapkan data di BigQuery" di codelab ini dan Anda dapat mengikuti peristiwa Firebase Analytics yang dicatat dalam log pada langkah terakhir.

Firestore mungkin adalah tempat Anda menyimpan data pengguna tanggal pendaftaran, pembelian dalam aplikasi yang dilakukan, level dalam game, koin saldo, 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 disajikan
  • apakah penawaran yang ditampilkan diklik atau tidak

Semua data ini harus diatur ke dalam satu baris dalam tabel agar model kami dapat memprosesnya. Untungnya, BigQuery disiapkan untuk membantu kita melakukannya.

BigQuery memungkinkan pembuatan "tampilan" untuk menjaga kueri Anda tetap teratur. Tampilan adalah tabel virtual yang ditentukan oleh kueri SQL. Saat membuat tampilan, Anda membuat kueri dengan cara yang sama seperti membuat kueri tabel. Dengan menggunakan ini, kita dapat membersihkan data analisis kita 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, "Memproses data di BigQuery", atau data contoh yang dapat didownload yang disediakan di sini untuk mengikuti codelab ini.

Definisi masalah

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

Penjelasan tentang bandit kontekstual

Di awal setiap level di Flappy Sparky, pengguna akan melihat penawaran IAP yang akan memberi mereka powerup. Kami hanya dapat menampilkan satu opsi IAP setiap kali, dan kami tidak tahu opsi mana yang akan menghasilkan konversi terbaik. Mengingat setiap pengguna dan setiap sesi berbeda, bagaimana cara menemukan penawaran IAP yang memberikan reward yang diharapkan tertinggi?

Dalam hal ini, mari kita buat reward 0 jika pengguna tidak menerima penawaran IAP, dan nilai IAP jika pengguna menerimanya. 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.

e7d3264141498bff.jpeg

Berikut adalah hal yang akan kita gunakan dalam prediksi:

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

Eksploitasi vs Eksplorasi

Untuk semua masalah multi-armed bandit, 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 versi masalah kita, kita akan menyederhanakannya untuk hanya melatih model secara berkala di cloud dan hanya melakukan prediksi saat menggunakan model di perangkat pengguna (bukan juga melatih di perangkat pengguna). Untuk memastikan bahwa kita memiliki data pelatihan yang memadai setelah menggunakan model, terkadang kita harus menampilkan hasil acak kepada pengguna aplikasi (misalnya, 30%). Strategi untuk menyeimbangkan eksplorasi dan eksploitasi ini disebut Epsilon-greedy.

Melatih model

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

Melatih secara 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 memerlukan mesin yang lebih canggih untuk mempelajari data Anda sendiri dan melatih model Anda sendiri, Anda bisa mendapatkan instance AI Platform Notebook untuk mempercepat pelatihan.

Dalam skrip pelatihan yang disediakan, kita membuat iterator yang menghasilkan data pelatihan dari file CSV yang diekspor dari BigQuery. Kemudian, kita menggunakan data tersebut untuk mulai melatih model dengan Keras. Detail 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 belajar. Logika ini berada di bagian ValidationCallback.

Di akhir pelatihan, kita menggunakan data dalam test.csv untuk menguji model kita lagi. Model ini belum pernah melihat data ini sebelumnya, jadi kami dapat 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, kecuali dalam format TensorFlow. Kita harus mengekspor model dalam format TFLite sehingga 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 deploy model ke Firebase ML dan minta Firebase menghosting model Anda. Hal ini berguna karena dua alasan utama:

  1. Kita dapat memastikan 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 dengan teknologi TFLite. Anda memiliki opsi untuk men-deploy menggunakan Firebase console atau Python API.

8. Membuat prediksi di perangkat

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

Karena kita menerapkan beberapa prapemrosesan 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 prapemrosesan dilakukan. Anda bisa menemukan detail selengkapnya tentang cara melakukannya di aplikasi contoh.

Selanjutnya, kita memberikan input pengujian ke 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 menyarankan sparky_armor adalah kekuatan tambahan IAP terbaik untuk pengguna khusus ini.

a3381dbcdbdf811e.pngS

Mengukur akurasi model

Untuk mengukur akurasi model, kita cukup melacak penawaran IAP yang diprediksi oleh model dan apakah penawaran tersebut 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 berbagai iterasi model. Anda dapat mempelajari lebih lanjut pengujian A/B dengan Firebase dalam dokumentasi Membuat Eksperimen Firebase Remote Config dengan Pengujian A/B.

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

Jika perlu memperbarui model saat data baru masuk, Anda dapat menyiapkan pipeline untuk melatih ulang model secara berulang. Untuk melakukannya, pertama-tama Anda harus memastikan bahwa Anda memiliki data baru yang akan digunakan untuk pelatihan menggunakan strategi epsilon-greedy yang kami sebutkan di atas. (misalnya menggunakan hasil prediksi model dengan frekuensi 70% dan hasil acak selama 30%).

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 TFLite dan Firebase lebih lanjut, lihat contoh TFLite lainnya dan panduan memulai Firebase.

Jika ada pertanyaan, sampaikan pertanyaan tersebut di Stack Overflow #firebase-machine-learning.

Yang telah kita bahas

  • TensorFlow Lite
  • Firebase ML
  • Firebase Analytics
  • BigQuery

Langkah Berikutnya

  • Melatih dan men-deploy model pengoptimal untuk aplikasi Anda.

Pelajari Lebih Lanjut