1. Panoramica
Ti diamo il benvenuto nel codelab sull'ottimizzazione degli acquisti in-app on-device in tempo reale. In questo codelab imparerai a utilizzare TensorFlow Lite e Firebase per addestrare e implementare 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 dell'utente corrente. Questo è un esempio di problema di bandito contestuale, un tipo importante e ampiamente applicabile di problema di machine learning su cui scoprirai di più in questo codelab
Obiettivi didattici
- Raccogliere i dati di analisi tramite Firebase Analytics
- Esegui la pre-elaborazione dei dati di analisi utilizzando BigQuery
- Addestra un semplice modello ML per l'ottimizzazione on-device degli acquisti in-app
- Esegui il deployment dei modelli TFLite in Firebase ML e accedivi dalla tua app
- Misura e sperimenta 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 3.4 o versioni successive
- Un dispositivo di test fisico con Android 2.3 o versioni successive 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 collegamento
- Novizio del machine learning
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 di acquisti in-app (IAP) personalizzati alla fine di ogni livello. Puoi mostrare solo un numero limitato di opzioni di acquisti in-app alla volta e non sai quali avranno la conversione migliore. Poiché ogni utente e ogni sessione sono diversi, come facciamo a trovare l'offerta IAP che offre il premio più alto previsto?
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 blocco note Jupyter (.ipynb) che addestra il modello di personalizzazione e lo impacchetta 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 all'ottimizzazione degli acquisti in-app della nostra app di gioco fittizia Flappy Sparky. Il gioco è un side-scroller in cui il giocatore controlla Sparky, tentando di volare tra colonne di muri senza colpirle. All'inizio del livello, all'utente viene presentata un'offerta IAP che gli fornirà un potenziamento. In questo codelab implementeremo solo la parte di ottimizzazione degli acquisti in-app 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 gli eventi di analisi nella tua app
Gli eventi Analytics forniscono informazioni sul comportamento degli utenti e vengono utilizzati per addestrare il modello di ML. Ad esempio, il modello potrebbe apprendere che gli utenti che giocano per più tempo hanno maggiori probabilità di effettuare un acquisto in-app per ottenere vite extra. Il modello ML ha bisogno di eventi di analisi come input per apprendere queste informazioni.
Alcuni eventi di analisi che potremmo voler registrare includono:
- La durata della partita dell'utente
- Il livello raggiunto dall'utente
- Quanti gettoni spende l'utente
- Quali articoli vengono acquistati dall'utente
(Facoltativo) Scarica i 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 da utilizzare, vai alla sezione "Addestramento del modello di ottimizzazione" di questo codelab e segui la procedura con i nostri dati di esempio.
Raccogliere i dati con l'SDK Firebase Analytics
Utilizzeremo Firebase Analytics per aiutarti a raccogliere questi eventi di analisi. L'SDK Firebase Analytics acquisisce automaticamente una serie di eventi e proprietà utente. Inoltre, ti consente di definire i tuoi eventi personalizzati per misurare quelli specifici della tua app.
Installazione dell'SDK Firebase Analytics
Per iniziare a utilizzare Firebase Analytics nella tua app, consulta la documentazione Inizia a utilizzare 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 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")
Ora possiamo registrare gli eventi del player. Per l'ottimizzazione degli acquisti in-app, vogliamo registrare ogni offerta IAP presentata all'utente e se l'utente fa clic sull'offerta. In questo modo avremo due eventi di analisi: offer_iap
e offer_accepted
. Monitoreremo anche un offer_id univoco per 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 saperne di più sulla registrazione degli eventi personalizzati, consulta la documentazione sugli eventi di log di Firebase Analytics.
6. Esegui la pre-elaborazione dei dati in BigQuery
Nell'ultimo passaggio, abbiamo raccolto gli eventi relativi all'offerta IAP presentata all'utente e su cui l'utente fa clic. In questo passaggio, combineremo questi 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 ulteriori dati utente da Firestore a BigQuery per utilizzarli per addestrare il modello. Se per il momento vuoi saltare questo passaggio, vai alla sezione "Preparazione dei dati in BigQuery " di questo codelab e segui gli eventi Firebase Analytics registrati nell'ultimo passaggio.
In Firestore potresti aver memorizzato la data di registrazione degli utenti, gli acquisti in-app effettuati, i livelli del gioco, i moneti disponibili o qualsiasi altro attributo che potrebbe essere utile per l'addestramento del modello.
Per esportare le raccolte Firestore in BigQuery, puoi installare l'estensione BigQuery Export per Firestore. Poi, unisci le tabelle in BigQuery per combinare questi dati con quelli di Google Analytics da utilizzare nel modello di personalizzazione e per tutto il resto di questo codelab.
Preparazione dei dati in BigQuery
Nei prossimi passaggi, utilizzeremo BigQuery per trasformare i dati di analisi non elaborati in dati utilizzabili per l'addestramento del 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 relativi a quanto segue:
- l'utente
- lo stato del gioco
- l'offerta presentata
- Se viene fatto clic o meno sull'offerta presentata
Affinché il nostro modello possa elaborarli, tutti questi dati dovranno essere organizzati in una singola riga di una tabella. Fortunatamente, BigQuery è configurato per aiutarci a farlo.
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 viene fatto clic su ogni offerta di acquisto in-app, dobbiamo unire gli eventi offer_iap
e offer_accepted
registrati 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;
Esportare 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 "Preprocessa 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 alla definizione del problema dei banditi contestuali.
Spiegazione dei banditi contestuali
All'inizio di ogni livello di Flappy Sparky, all'utente viene presentata un'offerta IAP che gli fornirà un potenziamento. Possiamo mostrare una sola opzione di pagamento in-app alla volta e non sappiamo quali avranno la conversione migliore. Poiché ogni utente e ogni sessione sono diversi, come facciamo a trovare l'offerta IAP che offre il premio più alto previsto?
In questo caso, impostiamo il premio su 0 se l'utente non accetta l'offerta di IAP e sul valore dell'IAP se l'accetta. Per provare a massimizzare il premio, possiamo utilizzare i nostri dati storici per addestrare un modello che preveda il premio previsto per ogni azione in base a un utente e trovare l'azione con il premio più alto.
Di seguito è riportato ciò che utilizzeremo nella previsione:
- Stato: informazioni sull'utente e sulla sessione corrente
- Azione: offerte di acquisti in-app che possiamo scegliere di mostrare
- Premio: valore dell'offerta IAP
Sfruttamento ed esplorazione
Per tutti i problemi relativi ai banditi con più armi, l'algoritmo deve trovare un equilibrio tra esplorazione (ottenere più dati per scoprire quale azione genera il risultato ottimale) e sfruttamento (utilizzare il risultato ottimale per ottenere la ricompensa più alta).
Nella nostra versione del problema, semplificheremo il problema in modo da addestrare il modello solo periodicamente nel cloud ed eseguire le previsioni solo quando il modello viene utilizzato sul dispositivo dell'utente (anziché addestrare il modello 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 ed estrazione è 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 i premi previsti per ogni azione in base a uno stato, quindi trovare l'azione che offre i premi previsti più elevati.
Addestramento locale
Il modo più semplice per iniziare ad addestrare il tuo modello è creare una copia del notebook nel codice di esempio per questo codelab.
Per questo codelab non è necessaria una GPU, ma se hai bisogno di una macchina più potente per esplorare i tuoi dati e addestrare il tuo modello, puoi ottenere un'istanza di notebook AI Platform 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 nostro 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 le offerte IAP in modo casuale per verificare se il nostro modello sta effettivamente imparando. Questa logica si trova in ValidationCallback
.
Al termine dell'addestramento, utilizziamo i dati in test.csv
per testare di nuovo il modello. Il modello non ha mai visto questi dati prima, quindi possiamo essere certi che il risultato non sia dovuto a 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 per l'uso, ma al momento è in un 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 farlo ospitare da Firebase. Questa operazione è 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 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 nel fare previsioni utilizzando il modello sul dispositivo. Nella cartella app
del codice di esempio scaricato puoi trovare un'app di esempio che scarica un modello da Firebase ML e utilizzarlo per eseguire l'inferenza con alcuni dati lato client.
Poiché abbiamo applicato un po' di pre-elaborazione durante l'addestramento del modello, dovremo applicare la stessa pre-elaborazione all'input del modello quando viene eseguito sul dispositivo. Un modo semplice per farlo è utilizzare un formato indipendente da piattaforma e lingua, ad esempio un file JSON contenente una mappa di ogni funzionalità per i metadati relativi alla modalità di esecuzione della preelaborazione. Puoi trovare ulteriori dettagli su come eseguire questa operazione nell'app di esempio.
Poi 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 potenziamento IAP migliore per questo utente specifico.
Misurare l'accuratezza del modello
Per misurare l'accuratezza del nostro modello, possiamo semplicemente tenere traccia delle offerte IAP previste dal nostro modello e verificare se vengono selezionate utilizzando Firebase Analytics. Puoi utilizzarlo insieme a Firebase A/B Testing per misurare il rendimento effettivo del modello. Facendo un ulteriore passo avanti, puoi anche eseguire test A/B su diverse iterazioni del modello. Per scoprire di più sui test A/B con Firebase, consulta la documentazione Creare esperimenti di Firebase Remote Config con A/B Testing.
9. (Facoltativo) Aggiornare regolarmente il modello con nuovi dati
Se devi aggiornare il modello man mano che arrivano nuovi dati, puoi configurare una pipeline per addestrare nuovamente il modello su base ricorrente. Per farlo, devi prima assicurarti di avere nuovi dati da utilizzare per l'addestramento utilizzando la strategia epsilon-greedy menzionata sopra. (ad es. 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 il deployment con nuovi dati non rientra nell'ambito di questo codelab. Per iniziare, puoi consultare la piattaforma AI di Google Cloud e TFX.
10. Complimenti!
In questo codelab hai imparato ad addestrare e implementare un modello TFLite on-device per ottimizzare gli acquisti in-app utilizzando Firebase. Per scoprire di più su TFLite e Firebase, dai un'occhiata ad altri esempi di TFLite e alle guide introduttive di Firebase.
Per eventuali domande, puoi pubblicarle su Stack Overflow #firebase-machine-learning.
Argomenti trattati
- TensorFlow Lite
- Firebase ML
- Firebase Analytics
- BigQuery
Passaggi successivi
- Addestrare ed eseguire il deployment di un modello di ottimizzazione per la tua app.