1. Présentation
Bienvenue dans l'atelier de programmation sur l'optimisation des achats via une application en temps réel sur l'appareil. Dans cet atelier de programmation, vous allez apprendre à utiliser TensorFlow Lite et Firebase pour entraîner et déployer un modèle de personnalisation personnalisé dans votre application.
Ce tutoriel explique comment créer un modèle de machine learning pour la personnalisation, en particulier un modèle qui prédit l'offre d'achat intégré dans l'application optimale en fonction de l'état de l'utilisateur actuel. Il s'agit d'un exemple de problème de bandit contextuel, un type de problème de machine learning important et largement applicable que vous allez découvrir dans cet atelier de programmation.
Points abordés
- Collecter des données analytiques via Firebase Analytics
- Prétraiter les données analytiques à l'aide de BigQuery
- Entraîner un modèle de ML simple pour optimiser les achats via l'application sur l'appareil
- Déployer des modèles TFLite dans Firebase ML et y accéder depuis votre application
- Mesurer et tester différents modèles via Firebase A/B Testing
- Entraînez et déployez de nouveaux modèles à l'aide des dernières données à une fréquence récurrente.
Prérequis
- Android Studio version 3.4 ou ultérieure
- Un appareil de test physique équipé d'Android 2.3 ou version ultérieure et des services Google Play 9.8 ou version ultérieure, ou un émulateur avec les services Google Play 9.8 ou version ultérieure
- Si vous utilisez un appareil de test physique, un câble de connexion
- Connaissances de base sur le ML
Comment allez-vous utiliser ce tutoriel ?
Comment évalueriez-vous votre niveau d'expérience en matière de création d'applications Android ?
2. Description du problème
Imaginons que vous soyez un développeur de jeux qui souhaite afficher des suggestions d'achats intégrés personnalisés à la fin de chaque niveau. Vous ne pouvez afficher qu'un nombre limité d'options d'achat intégré à chaque fois, et vous ne savez pas lesquelles généreront le meilleur taux de conversion. Étant donné que chaque utilisateur et chaque session sont différents, comment trouver l'offre d'IAP qui offre la récompense attendue la plus élevée ?
3. Obtenir l'exemple de code
Clonez le dépôt GitHub à partir de la ligne de commande.
git clone https://github.com/googlecodelabs/firebase-iap-optimization.git
Ce dépôt contient:
- Un notebook Jupyter (.ipynb) qui entraîne le modèle de personnalisation et le met en package dans un modèle TFLite
- Exemple d'application Kotlin qui utilise le modèle TFLite pour effectuer des prédictions sur l'appareil
4. Exécuter l'application avec Firebase
Dans cet atelier de programmation, nous allons optimiser les achats intégrés de notre application de jeu fictive, Flappy Sparky. Le jeu est un jeu à défilement horizontal dans lequel le joueur contrôle un Sparky, qui tente de voler entre des colonnes de murs sans les heurter. Au début du niveau, l'utilisateur reçoit une offre d'IAP qui lui permet d'obtenir un bonus. Dans cet atelier de programmation, nous n'implémenterons que la partie de l'application consacrée à l'optimisation des achats intégrés.
Vous pourrez appliquer ce que vous apprendrez ici à votre propre application associée à un projet Firebase. Vous pouvez également créer un projet Firebase pour cet atelier de programmation. Si vous avez besoin d'aide pour vous lancer avec Firebase, consultez nos tutoriels sur ce sujet ( Android et iOS).
5. Collecter des événements d'analyse dans votre application
Les événements Analytics fournissent des insights sur le comportement des utilisateurs et sont utilisés pour entraîner le modèle de ML. Par exemple, le modèle peut apprendre que les utilisateurs qui jouent plus longtemps sont plus susceptibles d'effectuer un achat intégré pour obtenir des vies supplémentaires. Le modèle de ML a besoin d'événements d'analyse comme entrée pour apprendre ces informations.
Voici quelques événements d'analyse que vous pouvez enregistrer:
- Durée de la session de jeu
- Niveau atteint par l'utilisateur
- Nombre de pièces dépensées par l'utilisateur
- Articles achetés par l'utilisateur
Télécharger un échantillon de données (facultatif)
Dans les étapes suivantes, nous allons utiliser Firebase Analytics pour consigner les événements d'analyse à utiliser dans notre modèle. Si vous disposez déjà de données analytiques que vous souhaitez utiliser, passez à la section "Entraîner le modèle d'optimisation" de cet atelier de programmation et suivez les instructions avec nos exemples de données.
Collecter des données avec le SDK Firebase Analytics
Nous utiliserons Firebase Analytics pour collecter ces événements d'analyse. Le SDK Firebase Analytics collecte automatiquement un certain nombre d'événements et de propriétés utilisateur. Il vous permet également de définir vos propres événements personnalisés pour mesurer les événements propres à votre application.
Installer le SDK Firebase Analytics
Pour commencer à utiliser Firebase Analytics dans votre application, consultez la documentation Premiers pas avec Google Analytics. Le dépôt firebase-iap-optimization
cloné au début de cet atelier de programmation inclut déjà le SDK Firebase Analytics.
Enregistrer des événements personnalisés
Après avoir configuré le SDK Firebase Analytics, nous pouvons commencer à enregistrer les événements dont nous avons besoin pour entraîner notre modèle.
Avant de procéder, il est important de définir un ID utilisateur dans l'événement d'analyse afin de pouvoir associer les données d'analyse de cet utilisateur à ses données existantes dans l'application.
MainActivity.kt
firebaseAnalytics.setUserId("player1")
Nous pouvons ensuite consigner les événements des joueurs. Pour optimiser les achats intégrés, nous souhaitons consigner chaque offre d'achat intégré présentée à l'utilisateur et si l'utilisateur a cliqué dessus. Nous obtenons ainsi deux événements d'analyse : offer_iap
et offer_accepted
. Nous tiendrons également compte d'un identifiant d'offre unique afin de pouvoir l'utiliser ultérieurement pour combiner ces données et voir si une offre est acceptée.
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)
}
}
Pour en savoir plus sur la journalisation des événements personnalisés, consultez la documentation sur la journalisation des événements Firebase Analytics.
6. Prétraiter des données dans BigQuery
Lors de la dernière étape, nous avons collecté des événements sur l'offre d'IAP présentée à l'utilisateur et sur celle sur laquelle l'utilisateur a cliqué. À cette étape, nous allons combiner ces données d'événements avec des données utilisateur afin que notre modèle puisse apprendre à partir d'une image complète.
Pour ce faire, nous devons commencer par exporter les événements d'analyse vers BigQuery.
Associer le projet Firebase à BigQuery
Pour associer votre projet Firebase et ses applications à BigQuery :
- Connectez-vous à Firebase.
- Cliquez sur
, puis sélectionnez "Paramètres du projet".
- Sur la page "Paramètres du projet", cliquez sur l'onglet "Intégrations".
- Sur la fiche BigQuery, cliquez sur Associer.
(Facultatif) Exporter vos collections Firestore vers BigQuery
À cette étape, vous pouvez exporter des données utilisateur supplémentaires de Firestore vers BigQuery pour les utiliser afin d'entraîner le modèle. Si vous souhaitez passer cette étape pour le moment, passez à la section "Préparer les données dans BigQuery" de cet atelier de programmation. Vous pourrez suivre les événements Firebase Analytics enregistrés lors de la dernière étape.
Firestore peut être l'endroit où vous avez stocké la date d'inscription des utilisateurs, les achats effectués dans l'application, les niveaux du jeu, les pièces disponibles ou tout autre attribut pouvant être utile pour entraîner le modèle.
Pour exporter vos collections Firestore vers BigQuery, vous pouvez installer l'extension d'exportation Firestore pour BigQuery. Ensuite, joignez des tables dans BigQuery pour combiner ces données avec celles de Google Analytics et les utiliser dans votre modèle de personnalisation et dans le reste de cet atelier de programmation.
Préparer des données dans BigQuery
Dans les prochaines étapes, nous allons utiliser BigQuery pour transformer nos données analytiques brutes en données utilisables pour entraîner notre modèle.
Pour que notre modèle puisse apprendre quelle offre d'IAP présenter en fonction de l'utilisateur et de l'état du jeu, nous devons organiser les données sur les éléments suivants:
- l'utilisateur
- l'état du jeu ;
- l'offre présentée ;
- si l'utilisateur a cliqué sur l'offre présentée ou non
Toutes ces données doivent être organisées en une seule ligne dans un tableau pour que notre modèle puisse les traiter. Heureusement, BigQuery est configuré pour nous aider à le faire.
BigQuery vous permet de créer des "vues" pour organiser vos requêtes. Il s'agit d'une table virtuelle définie par une requête SQL. Lorsque vous créez une vue, vous l'interrogez de la même manière qu'une table. Nous pouvons ainsi commencer par nettoyer nos données analytiques.
Pour savoir si chaque offre d'achat via l'application est cliquée, nous devons joindre les événements offer_iap
et offer_accepted
que nous avons enregistrés à l'étape précédente.
all_offers_joined : vue 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 : vue 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;
Exporter un ensemble de données BigQuery vers Google Cloud Storage
Enfin, nous pouvons exporter l'ensemble de données BigQuery vers GCS afin de pouvoir l'utiliser dans l'entraînement de notre modèle.
7. Entraîner le modèle d'optimisation
Exemple de données
Utilisez les données de l'étape précédente, "Prétraiter les données dans BigQuery", ou les exemples de données téléchargeables fournis ici pour suivre le reste de cet atelier de programmation.
Définition du problème
Avant de commencer à entraîner le modèle, définissons notre problème de bandits contextuels.
Présentation des bandits contextuels
Au début de chaque niveau de Flappy Sparky, l'utilisateur voit une offre d'IAP qui lui permet d'obtenir un bonus. Nous ne pouvons afficher qu'une seule option d'IAP à la fois, et nous ne savons pas laquelle génèrera la meilleure conversion. Étant donné que chaque utilisateur et chaque session sont différents, comment trouver l'offre d'IAP qui offre la récompense attendue la plus élevée ?
Dans ce cas, définissons la récompense sur 0 si l'utilisateur n'accepte pas l'offre d'IAP et sur la valeur de l'IAP s'il l'accepte. Pour essayer de maximiser votre récompense, nous pouvons utiliser nos données historiques pour entraîner un modèle qui prédit la récompense attendue pour chaque action donnée à un utilisateur, et trouver l'action offrant la récompense la plus élevée.
Voici ce que nous utiliserons pour la prédiction:
- État: informations sur l'utilisateur et sa session en cours
- Action: Offres d'IAP que nous pouvons choisir de diffuser
- Récompense: valeur de l'offre d'achat via une application
Exploitation ou exploration ?
Pour tous les problèmes de bandits multi-bras, l'algorithme doit trouver un équilibre entre l'exploration (obtenir plus de données pour apprendre quelle action donne le résultat optimal) et l'exploitation (utiliser le résultat optimal pour obtenir la récompense la plus élevée).
Dans notre version du problème, nous allons simplifier le processus en n'entraînant le modèle que périodiquement dans le cloud et en n'effectuant des prédictions que lorsque nous utilisons le modèle sur l'appareil de l'utilisateur (plutôt que d'entraîner le modèle sur l'appareil de l'utilisateur également). Pour nous assurer de disposer de suffisamment de données d'entraînement après avoir utilisé le modèle, nous devons parfois afficher des résultats aléatoires aux utilisateurs de notre application (par exemple, 30%). Cette stratégie d'équilibrage de l'exploration et de l'exploitation est appelée epsilon-greedy.
Entraîner le modèle
Pour commencer, vous pouvez utiliser le script d'entraînement (training.ipynb
) fourni avec l'atelier de programmation. Notre objectif est d'entraîner un modèle qui prédit les récompenses attendues pour chaque action en fonction d'un état, puis de trouver l'action qui nous offre les récompenses attendues les plus élevées.
Entraînement local
Le moyen le plus simple de commencer à entraîner votre propre modèle est de créer une copie du notebook dans l'exemple de code de cet atelier de programmation.
Vous n'avez pas besoin de GPU pour cet atelier de programmation, mais si vous avez besoin d'une machine plus puissante pour explorer vos propres données et entraîner votre propre modèle, vous pouvez obtenir une instance de notebook AI Platform pour accélérer l'entraînement.
Dans le script d'entraînement fourni, nous avons créé un itérateur qui génère des données d'entraînement à partir des fichiers CSV que nous avons exportés depuis BigQuery. Nous avons ensuite utilisé ces données pour commencer à entraîner notre modèle avec Keras. Pour savoir comment entraîner le modèle, consultez les commentaires du notebook Python.
Mesurer les performances du modèle
Lors de l'entraînement du modèle, nous le comparerons à un agent aléatoire qui sélectionne les offres d'IAP de manière aléatoire pour voir si notre modèle apprend réellement. Cette logique se trouve sous ValidationCallback
.
.
À la fin de l'entraînement, nous utilisons les données de test.csv
pour tester à nouveau notre modèle. Le modèle n'a jamais vu ces données auparavant. Nous pouvons donc être sûrs que le résultat n'est pas dû à un surapprentissage. Dans ce cas, le modèle est 28% plus performant que l'agent aléatoire.
Exporter le modèle TFLite
Nous avons maintenant un modèle entraîné prêt à l'emploi, mais il est actuellement au format TensorFlow. Nous allons exporter le modèle au format TFLite afin qu'il puisse être exécuté sur des appareils mobiles.
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)
Vous pouvez ensuite télécharger le modèle et le regrouper avec votre application.
Pour une application de production, nous vous recommandons de déployer le modèle dans Firebase ML et de demander à Firebase de l'héberger. Cela est utile pour deux raisons principales:
- Nous pouvons réduire la taille d'installation de l'application et ne télécharger le modèle que si nécessaire.
- Le modèle peut être mis à jour régulièrement et avec un cycle de publication différent de celui de l'application entière.
Pour savoir comment déployer le modèle dans Firebase ML, vous pouvez suivre l'atelier de programmation Ajouter Firebase à votre application Android basée sur TFLite. Vous pouvez effectuer le déploiement à l'aide de la console Firebase ou de l'API Python.
8. Effectuer des prédictions sur l'appareil
L'étape suivante consiste à effectuer des prédictions à l'aide du modèle sur l'appareil. Vous trouverez un exemple d'application qui télécharge un modèle à partir de Firebase ML dans le dossier app
de l'exemple de code que vous avez téléchargé. Vous pouvez l'utiliser pour effectuer une inférence avec certaines données côté client.
Comme nous avons appliqué un prétraitement lors de l'entraînement du modèle, nous devrons appliquer le même prétraitement à l'entrée du modèle lors de l'exécution sur l'appareil. Pour ce faire, vous pouvez utiliser un format indépendant de la plate-forme et de la langue, tel qu'un fichier JSON contenant une carte de chaque élément géographique avec des métadonnées sur la façon dont le prétraitement est effectué. Pour en savoir plus, consultez l'application exemple.
Ensuite, nous fournissons au modèle une entrée de test comme suit:
IapOptimizer.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"
)
Le modèle suggère que sparky_armor
est le meilleur boost IAP pour cet utilisateur en particulier.
Mesurer la précision du modèle
Pour mesurer la justesse de notre modèle, nous pouvons simplement suivre les offres d'IAP prédites par notre modèle et savoir si elles ont été cliquées à l'aide de Firebase Analytics. Vous pouvez l'utiliser avec Firebase A/B Testing pour mesurer les performances réelles du modèle. Vous pouvez également effectuer des tests A/B sur différentes itérations du modèle. Pour en savoir plus sur les tests A/B avec Firebase, consultez la documentation Créer des tests Firebase Remote Config avec A/B Testing.
9. (Facultatif) Mettre à jour régulièrement le modèle avec de nouvelles données
Si vous devez mettre à jour votre modèle à mesure que de nouvelles données sont ajoutées, vous pouvez configurer un pipeline pour réentraîner votre modèle de manière récurrente. Pour ce faire, vous devez d'abord vous assurer de disposer de nouvelles données à utiliser pour l'entraînement à l'aide de la stratégie épsilon-greedy que nous avons mentionnée ci-dessus. (par exemple, utiliser le résultat de la prédiction du modèle 70% du temps et utiliser des résultats aléatoires 30% du temps).
La configuration d'un pipeline pour l'entraînement et le déploiement avec de nouvelles données dépasse le cadre de cet atelier de programmation. Pour vous lancer, consultez Google Cloud AI Platform et TFX.
10. Félicitations !
Dans cet atelier de programmation, vous avez appris à entraîner et à déployer un modèle TFLite sur l'appareil pour optimiser les achats intégrés à l'aide de Firebase. Pour en savoir plus sur TFLite et Firebase, consultez d'autres exemples TFLite et les guides de démarrage de Firebase.
Si vous avez des questions, vous pouvez les poser sur Stack Overflow #firebase-machine-learning.
Points abordés
- TensorFlow Lite
- Firebase ML
- Firebase Analytics
- BigQuery
Étapes suivantes
- Entraînez et déployez un modèle d'optimiseur pour votre application.