Codelab per l'ottimizzazione degli acquisti in-app in tempo reale sul dispositivo

1. Panoramica

1cbf855eda62c306.png

Benvenuto nel codelab di ottimizzazione degli acquisti in-app sul dispositivo in tempo reale. In questo codelab imparerai come utilizzare TensorFlow Lite e Firebase per addestrare e distribuire un modello di personalizzazione personalizzato nella tua app.

Questo tutorial mostra come costruire un modello di machine learning per la personalizzazione, in particolare uno che prevede l'offerta di acquisto in-app (IAP) ottimale in base allo stato in cui si trova l'utente corrente. Questo è un esempio di un problema bandito contestuale, un problema importante e tipo di problema di machine learning ampiamente applicabile di cui imparerai di più in questo codelab

Cosa imparerai

  • Raccogli dati analitici tramite l'analisi Firebase
  • Preelabora i dati di analisi utilizzando BigQuery
  • Addestra un semplice modello ML per l'ottimizzazione sul dispositivo degli acquisti in-app (IAP)
  • Distribuisci i modelli TFLite su Firebase ML e accedi dalla tua app
  • Misura e sperimenta diversi modelli tramite Firebase A/B Testing
  • Addestra e distribuisci nuovi modelli utilizzando i dati più recenti con cadenza ricorrente

Di cosa avrai bisogno

  • Android Studio versione 3.4+
  • Un dispositivo di prova fisico con Android 2.3+ e Google Play Services 9.8 o versioni successive oppure un emulatore con Google Play Services 9.8 o versioni successive
  • Se si utilizza un dispositivo di test fisico, un cavo di collegamento
  • Conoscenza del machine learning per principianti

Come utilizzerai questo tutorial?

Leggetelo solo fino in fondo Leggilo e completa gli esercizi

Come valuteresti la tua esperienza con la creazione di app Android?

Novizio Intermedio Competente

2. Dichiarazione del problema

Supponiamo che tu sia uno sviluppatore di giochi che desidera mostrare suggerimenti personalizzati per gli acquisti in-app (IAP) alla fine di ogni livello. Puoi mostrare solo un numero limitato di opzioni IAP ogni volta e non sai quali avranno la migliore conversione. Dato che ogni utente e ogni sessione sono diversi, come possiamo trovare l'offerta IAP che offre la ricompensa prevista più alta?

3. Ottieni il codice di esempio

Clona il repository GitHub dalla riga di comando.

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

Questo repository contiene:

  1. Un notebook Jupyter (.ipynb) che addestra il modello di personalizzazione e lo inserisce in un modello TFLite
  2. Un'app Kotlin di esempio che utilizza il modello TFLite per effettuare previsioni sul dispositivo

4. Esegui l'app con Firebase

In questo codelab lavoreremo sull'ottimizzazione degli IAP della nostra app di gioco immaginaria: Flappy Sparky . Il gioco è uno scroller laterale in cui il giocatore controlla uno Sparky, tentando di volare tra colonne di muri senza colpirli. All'inizio del livello, all'utente viene presentata un'offerta IAP che gli darà un potenziamento. In questo codelab implementeremo solo la parte di ottimizzazione IAP dell'app.

Sarai in grado di applicare ciò che impari qui alla tua app connessa a un progetto Firebase. In alternativa, puoi creare un nuovo progetto Firebase per questo codelab. Se hai bisogno di aiuto per iniziare con Firebase, consulta i nostri tutorial su questo argomento ( Android e iOS ).

5. Raccogli eventi di analisi nella tua app

Gli eventi di analisi forniscono informazioni dettagliate sul comportamento degli utenti e vengono utilizzati per addestrare il modello ML. Ad esempio, il modello potrebbe apprendere che gli utenti che giocano più a lungo hanno maggiori probabilità di effettuare un IAP per ottenere vite extra. Il modello ML necessita di eventi di analisi come input per apprendere queste informazioni.

Alcuni eventi di analisi che potremmo voler registrare includono:

  • Per quanto tempo l'utente gioca al gioco
  • Il livello raggiunto dall'utente
  • Quante monete spende l'utente
  • Quali articoli acquista l'utente

Scarica dati di esempio (facoltativo)

Nei passaggi seguenti utilizzeremo Firebase Analytics per registrare gli eventi di analisi da utilizzare nel nostro modello. Se disponi già di dati di analisi che desideri utilizzare, passa alla sezione "Addestra il modello di ottimizzazione" di questo codelab e potrai seguire i nostri dati di esempio.

Raccogli dati con l'SDK di Firebase Analytics

Utilizzeremo Firebase Analytics per raccogliere questi eventi di analisi. L'SDK di Firebase Analytics acquisisce automaticamente una serie di eventi e proprietà utente. Ti consente inoltre di definire i tuoi eventi personalizzati per misurare gli eventi esclusivi della tua app.

Installazione dell'SDK di Firebase Analytics

Puoi iniziare a utilizzare Firebase Analytics nella tua app seguendo la documentazione Inizia con Google Analytics. Il repository firebase-iap-optimization clonato all'inizio di questo codelab include già l'SDK di Firebase Analytics.

Registra eventi personalizzati

Dopo aver configurato l'SDK di Firebase Analytics, possiamo iniziare a registrare gli eventi di cui abbiamo bisogno per addestrare il nostro modello.

Prima di farlo, è importante impostare un ID utente nell'evento di analisi, in modo da poter associare i dati di analisi per quell'utente ai dati esistenti nell'app.

MainActivity.kt

firebaseAnalytics.setUserId("player1")

Successivamente possiamo registrare gli eventi del giocatore. Per l'ottimizzazione IAP, vogliamo registrare ogni offerta IAP presentata all'utente e se l'utente fa clic su tale offerta. Questo ci fornirà due eventi di analisi: offer_iap e offer_accepted . Terremo anche traccia di un offer_id univoco in modo da poterlo utilizzare in seguito per combinare questi dati e vedere se un'offerta è accettata.

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

Per ulteriori informazioni sulla registrazione degli eventi personalizzati, consulta la documentazione sugli eventi di registro di Firebase Analytics .

6. Preelaborare i dati in BigQuery

Nell'ultimo passaggio, abbiamo raccolto eventi su quale offerta IAP viene presentata all'utente e quale offerta IAP viene cliccata dall'utente. In questo passaggio combineremo i dati di questo evento con i dati dell'utente in modo che il nostro modello possa apprendere da un quadro completo.

Per fare ciò, dovremo iniziare esportando gli eventi di analisi in BigQuery.

Per collegare il tuo progetto Firebase e le relative app a BigQuery:

  1. Accedi a Firebase.
  2. Clic the Settings icon , quindi seleziona Impostazioni progetto.
  3. Nella pagina Impostazioni progetto, fare clic sulla scheda Integrazioni.
  4. Nella scheda BigQuery, fai clic su Collegamento.

(Facoltativo) Esporta le tue raccolte Firestore in BigQuery

In questo passaggio hai la possibilità di esportare ulteriori dati utente da Firestore a BigQuery da utilizzare per addestrare il modello. Se per il momento desideri saltare questo passaggio, passa alla sezione "Preparazione dei dati in BigQuery" di questo codelab e potrai seguire gli eventi Firebase Analytics registrati nell'ultimo passaggio.

Firestore potrebbe essere il luogo in cui hai archiviato la data di registrazione degli utenti, gli acquisti in-app effettuati, i livelli di gioco, le monete in saldo o qualsiasi altro attributo che potrebbe essere utile per addestrare il modello.

Per esportare le tue raccolte Firestore in BigQuery, puoi installare Firestore BigQuery Export Extension . Quindi, unisci le tabelle in BigQuery per combinare questi dati con i dati di Google Analytics da utilizzare nel tuo modello di personalizzazione e nel resto di questo codelab.

Preparazione dei dati in BigQuery

Nei prossimi passaggi utilizzeremo BigQuery per trasformare i nostri dati analitici grezzi in dati utilizzabili per addestrare il nostro modello.

Affinché il nostro modello possa apprendere quale offerta IAP presentare in base all'utente e allo stato del gioco, dobbiamo organizzare i dati su quanto segue:

  • l'utente
  • lo stato del gioco
  • l'offerta presentata
  • se l'offerta presentata viene cliccata o meno

Tutti questi dati dovranno essere organizzati in un'unica riga in una tabella affinché il nostro modello possa elaborarli. Fortunatamente, BigQuery è configurato per aiutarci a fare proprio questo.

BigQuery consente di creare "viste" per mantenere organizzata la tua query. Una vista è una tabella virtuale definita da una query SQL. Quando crei una vista, esegui una query nello stesso modo in cui esegui una query su una tabella. Usandolo possiamo prima pulire i nostri dati di analisi.

Per vedere se viene cliccato su ciascuna offerta di acquisto in-app, dovremo unirci agli eventi offer_iap e offer_accepted che abbiamo registrato nel passaggio precedente.

all_offers_joined: visualizzazione 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 - Visualizzazione 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;

Esporta il set di dati bigQuery in Google Cloud Storage

Infine, possiamo esportare il set di dati BigQuery in GCS in modo da poterlo utilizzare nell'addestramento del nostro modello.

888daa7ba4db8e44.png

14d22bf474fae455.png

7. Addestrare il modello di ottimizzazione

Dati di esempio

Utilizza i dati del passaggio precedente, "Preelaborazione dei dati in BigQuery", oppure i dati di esempio scaricabili forniti qui da seguire insieme al resto di questo codelab.

Definizione del problema

Prima di iniziare ad addestrare il modello, dedichiamo un po' di tempo alla definizione del nostro problema contestuale dei banditi.

Spiegazione dei banditi contestuali

All'inizio di ogni livello in Flappy Sparky, all'utente viene presentata un'offerta IAP che gli darà un potenziamento. Possiamo mostrare solo un'opzione IAP ogni volta e non sappiamo quale avrà la migliore conversione. Dato che ogni utente e ogni sessione sono diversi, come possiamo trovare l'offerta IAP che offre la ricompensa prevista più alta?

In questo caso, impostiamo la ricompensa su 0 se l'utente non accetta l'offerta IAP e il valore IAP se lo fa. Per cercare di massimizzare la tua ricompensa, possiamo utilizzare i nostri dati storici per addestrare un modello che preveda la ricompensa prevista per ogni azione data a un utente e trovi l'azione con la ricompensa più alta.

e7d3264141498bff.jpeg

Quanto segue è ciò che useremo nella previsione:

  • Stato: informazioni sull'utente e sulla sua sessione corrente
  • Azione: offerte IAP che possiamo scegliere di mostrare
  • Premio: valore dell'offerta IAP

Sfruttamento vs esplorazione

Per tutti i problemi relativi ai banditi multi-armati, l'algoritmo deve trovare un equilibrio tra esplorazione (ottenere più dati per scoprire quale azione dà il risultato ottimale) e sfruttamento (utilizzare il risultato ottimale per ottenere la ricompensa più alta).

Nella nostra versione del problema, lo semplificheremo per addestrare il modello solo periodicamente nel cloud ed eseguire previsioni solo quando si utilizza il modello sul dispositivo dell'utente (in contrapposizione all'addestramento anche sul dispositivo dell'utente). Per essere sicuri di disporre di dati di addestramento sufficienti dopo aver utilizzato il modello, a volte dovremo mostrare risultati randomizzati agli utenti della nostra app (ad esempio 30%). Questa strategia di bilanciamento tra esplorazione e sfruttamento è chiamata Epsilon-greedy .

Addestrare il modello

Per iniziare, puoi utilizzare lo script di training ( training.ipynb ) fornito con il codelab. Il nostro obiettivo è addestrare un modello che preveda le ricompense attese per ogni azione dato uno stato, quindi troviamo l'azione che ci dà le ricompense attese più elevate.

Formazione a livello locale

Il modo più semplice per iniziare con l'addestramento del proprio modello è creare una copia del notebook nel codice di esempio per questo codelab.

Non hai bisogno di una GPU per questo codelab, ma se hai bisogno di una macchina più potente per esplorare i tuoi dati e addestrare il tuo modello, puoi ottenere un'istanza di AI Platform Notebook per velocizzare l'addestramento.

Nello script di formazione fornito, abbiamo creato un iteratore che genera dati di formazione dai file CSV esportati da BigQuery. Quindi abbiamo utilizzato i dati per iniziare ad addestrare il nostro modello con Keras. I dettagli su come addestrare il modello possono essere trovati nei commenti del notebook Python.

Misurare le prestazioni del modello

Durante l'addestramento del modello, lo confronteremo con un agente casuale che seleziona le offerte IAP in modo casuale per vedere se il nostro modello sta effettivamente imparando. Questa logica risiede in ValidationCallback .

Al termine dell'addestramento, utilizziamo i dati in test.csv per testare nuovamente il nostro modello. Il modello non ha mai visto questi dati prima, quindi possiamo essere sicuri che il risultato non sia dovuto a un overfitting . In questo caso, il modello ha prestazioni migliori del 28% rispetto all’agente casuale.

Esporta il modello TFLite

Ora abbiamo un modello addestrato pronto per l'uso, tranne che attualmente è in formato TensorFlow. Dovremo esportare il modello in formato TFLite in modo che possa essere eseguito su dispositivi mobili.

treno.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)

Da qui puoi scaricare il modello e raggrupparlo con la tua app.

Facoltativamente, per un'app di produzione, ti consigliamo di distribuire il modello su Firebase ML e di fare in modo che Firebase ospiti il ​​tuo modello. Ciò è utile per due ragioni principali:

  1. Possiamo mantenere ridotte le dimensioni di installazione dell'app e scaricare il modello solo se necessario
  2. Il modello può essere aggiornato regolarmente e con un ciclo di rilascio diverso rispetto all'intera app

Per informazioni su come distribuire il modello su Firebase ML, puoi seguire il codelab Aggiungi Firebase al codelab dell'app Android basata su TFLite . Hai la possibilità di eseguire la distribuzione utilizzando la console Firebase o l'API Python.

8. Fare previsioni sul dispositivo

Il passaggio successivo consiste nel fare previsioni utilizzando il modello sul dispositivo. Puoi trovare un'app di esempio che scarica un modello da Firebase ML nella cartella app del codice di esempio scaricato e utilizzarla per eseguire l'inferenza con alcuni dati lato client.

Poiché abbiamo applicato una certa preelaborazione durante l'addestramento del modello, dovremo applicare la stessa preelaborazione all'input del modello durante l'esecuzione sul dispositivo. Un modo semplice per farlo è utilizzare un formato indipendente dalla piattaforma e dalla lingua, ad esempio un file JSON contenente una mappa di ogni funzionalità nei metadati su come viene eseguita la preelaborazione. Puoi trovare maggiori dettagli su come eseguire questa operazione nell'app di esempio.

Successivamente, diamo al modello un input di test come segue:

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

Il modello suggerisce che sparky_armor è il miglior potenziamento IAP per questo particolare utente.

a3381dbcdbdf811e.png

Misurare la precisione del modello

Per misurare l'accuratezza del nostro modello, possiamo semplicemente tenere traccia delle offerte IAP previste dal nostro modello e se vengono cliccati utilizzando Firebase Analytics. Puoi utilizzarlo insieme al test A/B Firebase per misurare le prestazioni effettive del modello. Facendo un ulteriore passo avanti, puoi anche eseguire test A/B su diverse iterazioni del modello. Puoi scoprire di più sui test A/B con Firebase nella documentazione Crea esperimenti di configurazione remota Firebase con test A/B .

9. (Facoltativo): aggiornamento regolare del modello con nuovi dati

Se è necessario aggiornare il modello man mano che arrivano nuovi dati, è possibile impostare una pipeline per riqualificare il modello su base ricorrente. Per fare ciò, devi prima assicurarti di avere nuovi dati da utilizzare per allenarti utilizzando la strategia epsilon-greedy di cui abbiamo parlato sopra. (ad esempio, utilizzando il risultato della previsione del modello il 70% delle volte e utilizzando risultati casuali il 30% delle volte).

La configurazione di una pipeline per l'addestramento e la distribuzione con nuovi dati va oltre l'ambito di questo codelab, puoi consultare Google Cloud AI Platform e TFX per iniziare.

10. Congratulazioni!

In questo codelab hai imparato come addestrare e distribuire un modello TFLite sul dispositivo per ottimizzare gli acquisti in-app utilizzando Firebase. Per ulteriori informazioni su TFLite e Firebase, dai un'occhiata ad altri esempi di TFLite e alle guide introduttive di Firebase.

Se hai domande, puoi lasciarle su Stack Overflow #firebase-machine-learning .

Di cosa abbiamo parlato

  • TensorFlow Lite
  • FirebaseML
  • Analisi Firebase
  • BigQuery

Prossimi passi

  • Addestra e distribuisci un modello di ottimizzazione per la tua app.

Saperne di più