1. Panoramica
Ti diamo il benvenuto nel codelab sull'ottimizzazione in tempo reale degli acquisti in-app sul dispositivo. In questo codelab imparerai a utilizzare TensorFlow Lite e Firebase per addestrare ed eseguire il deployment di un modello di personalizzazione personalizzato nella tua app.
Questo tutorial mostra come creare un modello di machine learning per la personalizzazione, in particolare uno che preveda l'offerta di acquisto in-app (IAP) ottimale in base allo stato in cui si trova l'utente corrente. Questo è un esempio di problema di bandit contestuale, un tipo di problema di machine learning importante e ampiamente applicabile di cui scoprirai di più in questo codelab
Obiettivi didattici
- Raccogliere i dati di analisi tramite Firebase Analytics
- Pre-elaborare i dati di analisi utilizzando BigQuery
- Addestra un modello ML semplice per l'ottimizzazione on-device degli acquisti in-app
- Esegui il deployment di modelli TFLite su Firebase ML e accedi da un'app
- Misurare e sperimentare diversi modelli tramite Firebase A/B Testing
- Addestra ed esegui il deployment di nuovi modelli utilizzando i dati più recenti con una cadenza ricorrente
Che cosa ti serve
- Android Studio versione 3.4 o successive
- Un dispositivo di test 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 utilizzi un dispositivo di test fisico, un cavo di connessione
- Conoscenze di base di ML
Come utilizzerai questo tutorial?
Come valuteresti la tua esperienza di creazione di app per Android?
2. Dichiarazione del problema
Supponiamo che tu sia uno sviluppatore di giochi che vuole mostrare suggerimenti personalizzati per gli acquisti in-app (IAP) alla fine di ogni livello. Puoi mostrare solo un numero limitato di opzioni di acquisto in-app ogni volta e non sai quali avranno la conversione migliore. Poiché ogni utente e ogni sessione sono diversi, come facciamo a trovare l'offerta di acquisto in-app che offre la ricompensa prevista più elevata?
3. recupera il codice campione
Clona il repository GitHub dalla riga di comando.
git clone https://github.com/googlecodelabs/firebase-iap-optimization.git
Questo repository contiene:
- Un notebook Jupyter (.ipynb) che addestra il modello di personalizzazione e lo inserisce in un modello TFLite
- Un'app Kotlin di esempio che utilizza il modello TFLite per fare previsioni sul dispositivo
4. Esegui l'app con Firebase
In questo codelab, lavoreremo per ottimizzare gli acquisti in-app della nostra app di gioco fittizia Flappy Sparky. Il gioco è uno scorrimento laterale in cui il giocatore controlla uno Sparky, cercando di volare tra le 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 di IAP dell'app.
Potrai applicare ciò che impari qui alla tua app collegata a un progetto Firebase. In alternativa, puoi creare un nuovo progetto Firebase per questo codelab. Se hai bisogno di aiuto per iniziare a utilizzare Firebase, consulta i nostri tutorial su questo argomento ( Android e iOS).
5. Raccogliere eventi di analisi nella tua app
Gli eventi Analytics forniscono informazioni 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 acquisto in-app per ottenere vite extra. Il modello ML ha bisogno di eventi Analytics come input per apprendere queste informazioni.
Alcuni eventi di analisi che potremmo voler registrare includono:
- Per quanto tempo l'utente gioca
- Il livello raggiunto dall'utente
- Il numero di monete spese dall'utente
- Quali articoli acquista l'utente
(Facoltativo) Scarica dati di esempio
Nei passaggi seguenti, utilizzeremo Firebase Analytics per registrare gli eventi di analisi da utilizzare nel nostro modello. Se hai già dati di analisi che vuoi utilizzare, vai alla sezione "Addestra il modello di ottimizzazione" di questo codelab e segui le istruzioni con i nostri dati di esempio.
Raccogliere dati con l'SDK Firebase Analytics
Utilizzeremo Firebase Analytics per raccogliere questi eventi di analisi. L'SDK Firebase Analytics acquisisce automaticamente una serie di eventi e proprietà utente. Ti consente inoltre di definire eventi personalizzati per misurare gli eventi unici per la tua app.
Installare l'SDK Firebase Analytics
Per iniziare a utilizzare Firebase Analytics nella tua app, segui le istruzioni riportate nella documentazione relativa all'introduzione a Google Analytics. Il repository firebase-iap-optimization
clonato all'inizio di questo codelab include già l'SDK Firebase Analytics.
Registra gli eventi personalizzati
Dopo aver configurato l'SDK Firebase Analytics, possiamo iniziare a registrare gli eventi necessari per addestrare il nostro modello.
Prima di farlo, è importante impostare un ID utente nell'evento Analytics, in modo da poter associare i dati di Analytics per quell'utente ai suoi dati esistenti nell'app.
MainActivity.kt
firebaseAnalytics.setUserId("player1")
Successivamente, possiamo registrare gli eventi dei giocatori. Per l'ottimizzazione degli acquisti in-app, vogliamo registrare ogni offerta di acquisto in-app presentata all'utente e se l'utente fa clic su quell'offerta. In questo modo avremo due eventi Analytics: offer_iap
e offer_accepted
. Inoltre, monitoreremo un offer_id univoco in modo da poterlo utilizzare in un secondo momento per combinare questi dati e verificare se un'offerta viene 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 di Firebase Analytics sugli eventi di log.
6. Pre-elaborare i dati in BigQuery
Nell'ultimo passaggio, abbiamo raccolto gli eventi relativi all'offerta di acquisto in-app presentata all'utente e a quella su cui ha fatto clic. In questo passaggio, combineremo i dati sugli eventi con i dati utente in modo che il nostro modello possa apprendere da un quadro completo.
Per farlo, dobbiamo iniziare esportando gli eventi di analisi in BigQuery.
Collegare il progetto Firebase a BigQuery
Per collegare il tuo progetto Firebase e le relative app a BigQuery:
- Accedi a Firebase.
- Fai clic su
e seleziona Impostazioni progetto.
- Nella pagina Impostazioni progetto, fai clic sulla scheda Integrazioni.
- Nella scheda BigQuery, fai clic su Collega.
(Facoltativo) Esporta le raccolte Firestore in BigQuery
In questo passaggio, hai la possibilità di esportare dati utente aggiuntivi da Firestore a BigQuery da utilizzare per addestrare il modello. Se vuoi saltare questo passaggio per il momento, vai alla sezione "Preparazione dei dati in BigQuery " di questo codelab e segui i passaggi relativi agli eventi Firebase Analytics registrati nell'ultimo passaggio.
Firestore potrebbe essere il luogo in cui hai memorizzato la data di registrazione degli utenti, gli acquisti in-app effettuati, i livelli del gioco, le monete nel saldo o qualsiasi altro attributo che potrebbe essere utile per l'addestramento del modello.
Per esportare le raccolte Firestore in BigQuery, puoi installare l'estensione Firestore BigQuery Export. Poi, unisci le tabelle in BigQuery per combinare questi dati con quelli di Google Analytics da utilizzare nel modello di personalizzazione e nel resto di questo codelab.
Preparare i dati in BigQuery
Nei prossimi passaggi, utilizzeremo BigQuery per trasformare i dati di analisi non elaborati in dati utilizzabili per l'addestramento del modello.
Affinché il nostro modello possa apprendere quale offerta IAP presentare in base all'utente e allo stato del gioco, dobbiamo organizzare i dati relativi a quanto segue:
- l'utente
- lo stato del gioco
- l'offerta presentata
- se l'offerta presentata viene selezionata o meno
Tutti questi dati dovranno essere organizzati in una singola riga di 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 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. In questo modo possiamo prima pulire i dati di analisi.
Per verificare se ogni offerta di acquisto in-app viene selezionata, dobbiamo unire gli eventi offer_iap
e offer_accepted
registrati nel passaggio precedente.
all_offers_joined - BigQuery view
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 - BigQuery view
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 per utilizzarlo nell'addestramento del modello.
7. Addestrare il modello di ottimizzazione
Dati di esempio
Utilizza i dati del passaggio precedente, "Preelabora i dati in BigQuery", o i dati di esempio scaricabili forniti qui per seguire il resto di questo codelab.
Definizione del problema
Prima di iniziare ad addestrare il modello, dedichiamo un po' di tempo a definire il problema dei bandit contestuali.
Spiegazione dei bandit contestuali
All'inizio di ogni livello di Flappy Sparky, l'utente visualizza un'offerta di acquisto in-app che gli darà un potenziamento. Possiamo mostrare una sola opzione di acquisto in-app alla volta e non sappiamo quali avranno il miglior tasso di conversione. Poiché ogni utente e ogni sessione sono diversi, come facciamo a trovare l'offerta di acquisto in-app che offre la ricompensa prevista più elevata?
In questo caso, impostiamo la ricompensa su 0 se l'utente non accetta l'offerta di acquisto in-app e sul valore dell'acquisto in-app se la accetta. Per massimizzare la ricompensa, possiamo utilizzare i nostri dati storici per addestrare un modello che preveda la ricompensa prevista per ogni azione dato un utente e trovare l'azione con la ricompensa più alta.
Di seguito sono riportati gli elementi che utilizzeremo nella previsione:
- Stato: informazioni sull'utente e sulla sua sessione attuale
- Azione: offerte di acquisto in-app che possiamo scegliere di mostrare
- Premio: valore dell'offerta IAP
Sfruttamento ed esplorazione
Per tutti i problemi di bandit multi-armed, l'algoritmo deve trovare un equilibrio tra l'esplorazione (ottenere più dati per scoprire quale azione produce il risultato ottimale) e lo sfruttamento (utilizzare il risultato ottimale per ottenere la ricompensa più alta).
Nella nostra versione del problema, semplificheremo l'addestramento del modello periodicamente nel cloud e faremo previsioni solo quando utilizzeremo il modello sul dispositivo dell'utente (anziché addestrarlo anche sul dispositivo dell'utente). Per assicurarci di disporre di dati di addestramento sufficienti dopo l'utilizzo del modello, a volte dovremo mostrare risultati casuali agli utenti della nostra app (ad es. il 30%). Questa strategia di bilanciamento tra esplorazione e sfruttamento è chiamata epsilon-greedy.
Addestramento del modello
Per iniziare, puoi utilizzare lo script di addestramento (training.ipynb
) fornito con il codelab. Il nostro obiettivo è addestrare un modello che preveda le ricompense previste per ogni azione dato uno stato, quindi troviamo l'azione che ci offre le ricompense previste più alte.
Addestramento locale
Il modo più semplice per iniziare ad addestrare il tuo modello è creare una copia del blocco note nell'esempio di codice per questo codelab.
Per questo codelab non è necessaria una GPU, ma se ti serve una macchina più potente per esplorare i tuoi dati e addestrare il tuo modello, puoi ottenere un'istanza AI Platform Notebook per velocizzare l'addestramento.
Nello script di addestramento fornito, abbiamo creato un iteratore che genera dati di addestramento dai file CSV esportati da BigQuery. Poi abbiamo utilizzato i dati per iniziare ad addestrare il modello con Keras. I dettagli su come addestrare il modello sono disponibili nei commenti del notebook Python.
Misurare le prestazioni del modello
Durante l'addestramento del modello, lo confronteremo con un agente casuale che seleziona offerte in-app in modo casuale per verificare se il modello sta effettivamente imparando. Questa logica si trova in ValidationCallback
.
Al termine dell'addestramento, utilizziamo i dati in test.csv
per testare nuovamente il modello. Il modello non ha mai visto questi dati prima, quindi possiamo essere certi che il risultato non sia dovuto a un overfitting. In questo caso, il modello ha un rendimento migliore del 28% rispetto all'agente casuale.
Esporta il modello TFLite
Ora abbiamo un modello addestrato pronto all'uso, tranne per il fatto che attualmente è in formato TensorFlow. Dovremo esportare il modello in formato TFLite in modo che possa essere eseguito su dispositivi mobili.
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)
Da qui puoi scaricare il modello e raggrupparlo con la tua app.
Se vuoi, per un'app di produzione, ti consigliamo di eseguire il deployment del modello in Firebase ML e di fare in modo che Firebase lo ospiti. Ciò è utile per due motivi principali:
- Possiamo mantenere ridotte le dimensioni di installazione dell'app e scaricare il modello solo se necessario
- Il modello può essere aggiornato regolarmente e con un ciclo di rilascio diverso rispetto all'intera app
Per scoprire come eseguire il deployment del modello in Firebase ML, puoi seguire il codelab Aggiungi Firebase alla tua app per Android basata su TFLite. Puoi eseguire il deployment utilizzando la console Firebase o l'API Python.
8. Generazione di previsioni sul dispositivo
Il passaggio successivo consiste nell'effettuare 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 che hai scaricato e utilizzarla per eseguire l'inferenza con alcuni dati lato client.
Poiché abbiamo applicato un pretrattamento durante l'addestramento del modello, dovremo applicare lo stesso pretrattamento all'input del modello durante l'esecuzione sul dispositivo. Un modo semplice per farlo è utilizzare un formato indipendente dalla piattaforma e dal linguaggio, ad esempio un file JSON contenente una mappatura di ogni funzionalità ai metadati su come viene eseguito il pre-elaborazione. Puoi trovare maggiori dettagli su come farlo nell'app di esempio.
Successivamente, forniamo 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 power-up IAP per questo utente specifico.
Misurare l'accuratezza del modello
Per misurare l'accuratezza del nostro modello, possiamo semplicemente tenere traccia delle offerte di acquisto in-app previste dal modello e se vengono cliccate utilizzando Firebase Analytics. Puoi utilizzare questa funzionalità insieme a Firebase A/B Testing per misurare il rendimento effettivo del modello. Puoi anche eseguire test A/B su diverse iterazioni del modello. Per saperne di più sui test A/B con Firebase, consulta la documentazione Creare esperimenti di Firebase Remote Config con A/B Testing.
9. (Facoltativo) Aggiornamento regolare del modello con nuovi dati
Se devi aggiornare il modello man mano che arrivano nuovi dati, puoi configurare una pipeline per eseguire nuovamente l'addestramento del modello su base ricorrente. Per farlo, devi prima assicurarti di avere nuovi dati da utilizzare per l'addestramento utilizzando la strategia epsilon-greedy che abbiamo menzionato in precedenza. ad esempio, utilizzando il risultato della previsione del modello il 70% delle volte e risultati casuali il 30% delle volte.
La configurazione di una pipeline per l'addestramento e il deployment con nuovi dati non rientra nell'ambito di questo codelab. Per iniziare, puoi consultare Google Cloud AI Platform e TFX.
10. Complimenti!
In questo codelab hai imparato ad addestrare ed eseguire il deployment di un modello TFLite on-device per ottimizzare gli acquisti in-app utilizzando Firebase. Per saperne di più su TFLite e Firebase, dai un'occhiata ad altri esempi di TFLite e alle guide introduttive di Firebase.
Se hai domande, puoi pubblicarle su Stack Overflow #firebase-machine-learning.
Argomenti trattati
- TensorFlow Lite
- Firebase ML
- Firebase Analytics
- BigQuery
Passaggi successivi
- Addestra ed esegui il deployment di un modello di ottimizzazione per la tua app.