Optimización de compra en la aplicación en tiempo real en el dispositivo Codelab

1. Información general

1cbf855eda62c306.png

Bienvenido al laboratorio de código de optimización de compras en la aplicación en tiempo real en el dispositivo. En este codelab, aprenderá cómo usar TensorFlow Lite y Firebase para entrenar e implementar un modelo de personalización personalizado en su aplicación.

Este tutorial muestra cómo construir un modelo de aprendizaje automático para la personalización, en particular uno que predice la oferta óptima de compra dentro de la aplicación (IAP) dado el estado en el que se encuentra el usuario actual. Este es un ejemplo de un problema de bandido contextual, un importante y Tipo de problema de aprendizaje automático ampliamente aplicable sobre el que aprenderá más en este codelab.

lo que aprenderás

  • Recopile datos analíticos a través de análisis de Firebase
  • Preprocesar datos analíticos con BigQuery
  • Entrene un modelo de aprendizaje automático simple para la optimización de compras dentro de la aplicación (IAP) en el dispositivo
  • Implemente modelos TFLite en Firebase ML y acceda a ellos desde su aplicación
  • Mide y experimenta con diferentes modelos a través de Firebase A/B Testing
  • Entrene e implemente nuevos modelos utilizando los datos más recientes en una cadencia recurrente

Lo que necesitarás

  • Android Estudio versión 3.4+
  • Un dispositivo de prueba físico con Android 2.3+ y servicios de Google Play 9.8 o posterior, o un emulador con servicios de Google Play 9.8 o posterior
  • Si utiliza un dispositivo de prueba física, un cable de conexión
  • Conocimientos de aprendizaje automático para principiantes

¿Cómo utilizarás este tutorial?

Léelo solo completo Léelo y completa los ejercicios.

¿Cómo calificaría su experiencia en la creación de aplicaciones para Android?

Principiante Intermedio Competente

2. Planteamiento del problema

Supongamos que es un desarrollador de juegos que desea mostrar sugerencias personalizadas de compras dentro de la aplicación (IAP) al final de cada nivel. Solo puede mostrar una cantidad limitada de opciones de IAP cada vez y no sabe cuáles tendrán la mejor conversión. Dado que cada usuario y cada sesión son diferentes, ¿cómo hacemos para encontrar la oferta IAP que ofrezca la mayor recompensa esperada?

3. Obtenga el código de muestra

Clona el repositorio de GitHub desde la línea de comando.

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

Este repositorio contiene:

  1. Un cuaderno Jupyter (.ipynb) que entrena el modelo de personalización y lo empaqueta en un modelo TFLite
  2. Una aplicación Kotlin de muestra que utiliza el modelo TFLite para hacer predicciones en el dispositivo

4. Ejecute la aplicación con Firebase

En este codelab, trabajaremos para optimizar los IAP de nuestra aplicación de juego ficticia: Flappy Sparky . El juego es un juego de desplazamiento lateral en el que el jugador controla un Sparky, que intenta volar entre columnas de paredes sin golpearlas. Al comienzo del nivel, al usuario se le presenta una oferta IAP que le dará un poder. Solo implementaremos la parte de optimización IAP de la aplicación en este codelab.

Podrás aplicar lo que aprendas aquí a tu propia aplicación que esté conectada a un proyecto de Firebase. Como alternativa, puedes crear un nuevo proyecto de Firebase para este codelab. Si necesita ayuda para comenzar con Firebase, consulte nuestros tutoriales sobre este tema ( Android e iOS ).

5. Recopile eventos analíticos en su aplicación

Los eventos de análisis brindan información sobre el comportamiento del usuario y se utilizan para entrenar el modelo de aprendizaje automático. Por ejemplo, el modelo puede aprender que los usuarios que juegan durante más tiempo tienen más probabilidades de crear un IAP para obtener vidas adicionales. El modelo ML necesita eventos analíticos como entrada para aprender esta información.

Algunos eventos de análisis que quizás queramos registrar incluyen:

  • ¿Cuánto tiempo juega el usuario?
  • ¿Qué nivel alcanza el usuario?
  • ¿Cuántas monedas gasta el usuario?
  • Qué artículos compra el usuario

Descargar datos de muestra (opcional)

En los siguientes pasos, usaremos Firebase Analytics para registrar eventos de análisis para usarlos en nuestro modelo. Si ya tiene datos analíticos que desea utilizar, vaya a la sección "Entrenar el modelo de optimización" de este codelab y podrá seguir nuestros datos de muestra.

Recopile datos con el SDK de Firebase Analytics

Usaremos Firebase Analytics para ayudar a recopilar estos eventos analíticos. El SDK de Firebase Analytics captura automáticamente una cantidad de eventos y propiedades de usuario. También le permite definir sus propios eventos personalizados para medir los eventos que son exclusivos de su aplicación.

Instalación del SDK de Firebase Analytics

Puede comenzar a utilizar Firebase Analytics en su aplicación siguiendo la documentación Introducción a Google Analytics. El repositorio firebase-iap-optimization clonado al comienzo de este codelab ya incluye el SDK de Firebase Analytics.

Registrar eventos personalizados

Después de configurar el SDK de Firebase Analytics, podemos comenzar a registrar los eventos que necesitamos para entrenar nuestro modelo.

Antes de hacer eso, es importante establecer una ID de usuario en el evento de análisis, para que podamos asociar los datos de análisis de ese usuario con sus datos existentes en la aplicación.

Actividad principal.kt

firebaseAnalytics.setUserId("player1")

A continuación podemos registrar eventos de jugadores. Para la optimización de IAP, queremos registrar cada oferta de IAP presentada al usuario y si el usuario hace clic en esa oferta. Esto nos dará dos eventos analíticos: offer_iap y offer_accepted . También realizaremos un seguimiento de un ID de oferta único para poder usarlo más adelante para combinar estos datos y ver si se acepta una oferta.

Actividad principal.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)
  }
}

Para obtener más información sobre cómo registrar eventos personalizados, visita la documentación de Eventos de registro de Firebase Analytics .

6. Preprocesar datos en BigQuery

En el último paso, recopilamos eventos sobre qué oferta IAP se presenta al usuario y en qué oferta IAP hace clic el usuario. En este paso, combinaremos los datos de este evento con los datos del usuario para que nuestro modelo pueda aprender de una imagen completa.

Para hacer esto, necesitaremos comenzar exportando los eventos de análisis a BigQuery.

Para vincular tu proyecto de Firebase y sus aplicaciones a BigQuery:

  1. Inicia sesión en Firebase.
  2. Hacer clic the Settings icon y luego seleccione Configuración del proyecto.
  3. En la página Configuración del proyecto, haga clic en la pestaña Integraciones.
  4. En la tarjeta de BigQuery, haz clic en Vincular.

(Opcional) Exporta tus colecciones de Firestore a BigQuery

En este paso, tiene la opción de exportar datos de usuario adicionales de Firestore a BigQuery para usarlos como ayuda para entrenar el modelo. Si desea omitir este paso por ahora, vaya a la sección "Preparar datos en BigQuery" de este codelab y podrá seguir los eventos de Firebase Analytics registrados en el último paso.

Firestore puede ser el lugar donde almacenó la fecha de registro de los usuarios, las compras realizadas dentro de la aplicación, los niveles del juego, las monedas en saldo o cualquier otro atributo que pueda ser útil para entrenar el modelo.

Para exportar sus colecciones de Firestore a BigQuery, puede instalar la extensión de exportación de Firestore BigQuery . Luego, une tablas en BigQuery para combinar estos datos con los datos de Google Analytics para usarlos en tu modelo de personalización y en el resto de este codelab.

Preparar datos en BigQuery

En los próximos pasos, usaremos BigQuery para transformar nuestros datos analíticos sin procesar en datos utilizables para entrenar nuestro modelo.

Para que nuestro modelo sepa qué oferta IAP presentar según el usuario y el estado del juego, necesitamos organizar datos sobre lo siguiente:

  • el usuario
  • el estado del juego
  • la oferta presentada
  • si se hace clic en la oferta presentada o no

Todos estos datos deberán organizarse en una sola fila en una tabla para que nuestro modelo los procese. Afortunadamente, BigQuery está configurado para ayudarnos a lograr precisamente eso.

BigQuery permite crear "vistas" para mantener tu consulta organizada. Una vista es una tabla virtual definida por una consulta SQL. Cuando crea una vista, la consulta de la misma manera que consulta una tabla. Usando esto, primero podemos limpiar nuestros datos analíticos.

Para ver si se hace clic en cada oferta de compra dentro de la aplicación, necesitaremos unirnos a los eventos offer_iap y offer_accepted que registramos en el paso anterior.

all_offers_joined - Vista de 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 - Vista de 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;

Exportar conjunto de datos de bigQuery a Google Cloud Storage

Por último, podemos exportar el conjunto de datos de Bigquery a GCS para poder usarlo en el entrenamiento de nuestro modelo.

888daa7ba4db8e44.png

14d22bf474fae455.png

7. Entrene el modelo de optimización.

Data de muestra

Utilice sus datos del paso anterior, "Preprocesar datos en BigQuery", o los datos de muestra descargables que se proporcionan aquí para seguir el resto de este codelab.

Definición del problema

Antes de comenzar a entrenar el modelo, dediquemos un tiempo a definir nuestro problema contextual de bandidos.

Bandidos contextuales

Al comienzo de cada nivel en Flappy Sparky, al usuario se le presenta una oferta IAP que le dará un potenciador. Solo podemos mostrar una opción IAP cada vez y no sabemos cuáles tendrán la mejor conversión. Dado que cada usuario y cada sesión son diferentes, ¿cómo hacemos para encontrar la oferta IAP que ofrezca la mayor recompensa esperada?

En este caso, hagamos que la recompensa sea 0 si el usuario no acepta la oferta de IAP y el valor de IAP si lo hace. Para intentar maximizar su recompensa, podemos usar nuestros datos históricos para entrenar un modelo que prediga la recompensa esperada por cada acción dada por un usuario y encontrar la acción con la recompensa más alta.

e7d3264141498bff.jpeg

Lo siguiente es lo que usaremos en la predicción:

  • Estado: información sobre el usuario y su sesión actual
  • Acción: Ofertas IAP que podemos elegir mostrar
  • Recompensa: valor de la oferta IAP

Explotación vs Exploración

Para todos los problemas de bandidos con múltiples brazos, el algoritmo necesita equilibrar entre exploración (obtener más datos para saber qué acción da el resultado óptimo) y explotación (usar el resultado óptimo para obtener la recompensa más alta).

En nuestra versión del problema, simplificaremos esto para entrenar el modelo solo periódicamente en la nube y solo hacer predicciones cuando use el modelo en el dispositivo del usuario (en lugar de entrenar también en el dispositivo del usuario). Para asegurarnos de tener suficientes datos de entrenamiento después de usar el modelo, a veces necesitaremos mostrar resultados aleatorios a los usuarios de nuestra aplicación (por ejemplo, 30%). Esta estrategia de equilibrar la exploración y la explotación se llama Epsilon-greedy .

Entrenando el modelo

Puede utilizar el script de capacitación ( training.ipynb ) proporcionado con el codelab para comenzar. Nuestro objetivo es entrenar un modelo que prediga las recompensas esperadas para cada acción dado un estado, luego encontramos la acción que nos brinda las recompensas esperadas más altas.

Capacitación local

La forma más sencilla de comenzar a entrenar su propio modelo es hacer una copia del cuaderno en el ejemplo de código de este codelab.

No necesitas una GPU para este codelab, pero si necesitas una máquina más potente para explorar tus propios datos y entrenar tu propio modelo, puedes obtener una instancia de AI Platform Notebook para acelerar tu entrenamiento.

En el script de entrenamiento proporcionado, creamos un iterador que genera datos de entrenamiento a partir de los archivos CSV que exportamos desde BigQuery. Luego usamos los datos para comenzar a entrenar nuestro modelo con Keras. Los detalles sobre cómo entrenar el modelo se pueden encontrar en los comentarios del cuaderno de Python.

Medir el rendimiento del modelo.

Mientras entrenamos el modelo, lo compararemos con un agente aleatorio que selecciona ofertas IAP al azar para ver si nuestro modelo realmente está aprendiendo. Esta lógica reside en ValidationCallback .

Al final del entrenamiento, usamos los datos en test.csv para probar nuestro modelo nuevamente. El modelo nunca antes había visto estos datos, por lo que podemos estar seguros de que el resultado no se debe a un sobreajuste . En este caso, el modelo funciona un 28% mejor que el agente aleatorio.

Exportar el modelo TFLite

Ahora tenemos un modelo entrenado listo para usar, excepto que actualmente está en formato TensorFlow. Necesitaremos exportar el modelo en formato TFLite para que pueda ejecutarse en dispositivos móviles.

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

Desde aquí, puede descargar el modelo y agruparlo con su aplicación.

Opcionalmente, para una aplicación de producción, te recomendamos implementar el modelo en Firebase ML y hacer que Firebase aloje tu modelo. Esto es útil por dos razones principales:

  1. Podemos mantener el tamaño de instalación de la aplicación pequeño y solo descargar el modelo si es necesario.
  2. El modelo se puede actualizar periódicamente y con un ciclo de lanzamiento diferente al de toda la aplicación.

Para aprender cómo implementar el modelo en Firebase ML, puede seguir el codelab Agregar Firebase a su aplicación de Android con tecnología TFLite . Tiene la opción de implementar usando Firebase console o la API de Python.

8. Hacer predicciones en el dispositivo

El siguiente paso es hacer predicciones utilizando el modelo del dispositivo. Puede encontrar una aplicación de ejemplo que descarga un modelo de Firebase ML en la carpeta de la app del código de muestra que descargó y usarla para realizar inferencias con algunos datos del lado del cliente.

Debido a que aplicamos algo de preprocesamiento durante el entrenamiento del modelo, necesitaremos aplicar el mismo preprocesamiento a la entrada del modelo cuando se ejecute en el dispositivo. Una forma sencilla de hacerlo es utilizar un formato independiente de la plataforma y el idioma, como un archivo JSON que contenga un mapa de cada característica con metadatos sobre cómo se realiza el preprocesamiento. Puede encontrar más detalles sobre cómo se hace esto en la aplicación de ejemplo.

A continuación, le damos al modelo una entrada de prueba de la siguiente manera:

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

El modelo sugiere que sparky_armor es el mejor potenciador de IAP para este usuario en particular.

a3381dbcdbdf811e.png

Medir la precisión del modelo

Para medir la precisión de nuestro modelo, simplemente podemos realizar un seguimiento de las ofertas IAP predichas por nuestro modelo y si se hace clic en ellas mediante Firebase Analytics. Puedes usar esto junto con las pruebas A/B de Firebase para medir el rendimiento real del modelo. Yendo un paso más allá, también puedes realizar pruebas A/B en diferentes iteraciones del modelo. Puede obtener más información sobre las pruebas A/B con Firebase en la documentación Crear experimentos de configuración remota de Firebase con pruebas A/B .

9. (Opcional): Actualizar el modelo periódicamente con nuevos datos.

Si necesita actualizar su modelo a medida que ingresan nuevos datos, puede configurar una canalización para volver a entrenar su modelo de forma recurrente. Para hacer esto, primero debe asegurarse de tener nuevos datos para usar en el entrenamiento utilizando la estrategia épsilon-codiciosa que mencionamos anteriormente. (p. ej., utilizar el resultado de la predicción del modelo el 70 % de las veces y utilizar resultados aleatorios el 30 % de las veces).

Configurar una canalización para entrenar e implementar con nuevos datos está más allá del alcance de este codelab; puede consultar Google Cloud AI Platform y TFX para comenzar.

10. ¡Felicitaciones!

En este codelab, aprendiste cómo entrenar e implementar un modelo TFLite en el dispositivo para optimizar las compras dentro de la aplicación usando Firebase. Para obtener más información sobre TFLite y Firebase, consulte otros ejemplos de TFLite y las guías de introducción de Firebase.

Si tiene alguna pregunta, puede dejarla en Stack Overflow #firebase-machine-learning .

Lo que hemos cubierto

  • TensorFlow Lite
  • ML de base de fuego
  • Análisis de base de fuego
  • Gran consulta

Próximos pasos

  • Entrene e implemente un modelo optimizador para su aplicación.

Aprende más