Codelab de optimización de compras integradas en la app en tiempo real en el dispositivo

1. Descripción general

1cbf855eda62c306.png

Te damos la bienvenida al codelab sobre la optimización en tiempo real de las compras directas desde la app en el dispositivo. En este codelab, aprenderás a usar TensorFlow Lite y Firebase para entrenar e implementar un modelo de personalización personalizado en tu app.

En este instructivo, se muestra cómo compilar un modelo de aprendizaje automático para la personalización, en particular, uno que prediga la oferta óptima de compra integrada en la app (IAP) según el estado en el que se encuentra el usuario actual. Este es un ejemplo de un problema de bandido contextual, un tipo de problema de aprendizaje automático importante y ampliamente aplicable sobre el que aprenderás más en este codelab.

Qué aprenderás

  • Recopila datos de estadísticas a través de Firebase Analytics
  • Procesa previamente los datos de análisis con BigQuery
  • Entrena un modelo de AA simple para la optimización en el dispositivo de las compras directas desde la aplicación (CDA)
  • Implementa modelos de TFLite en el AA de Firebase y accede a ellos desde tu app
  • Mide y experimenta con diferentes modelos a través de Firebase A/B Testing
  • Entrenar e implementar modelos nuevos con los datos más recientes en una cadencia recurrente

Requisitos

  • Android Studio versión 3.4 o posterior
  • Un dispositivo de prueba físico con Android 2.3 o versiones posteriores y Servicios de Google Play 9.8 o versiones posteriores, o un emulador con Servicios de Google Play 9.8 o versiones posteriores
  • Si usas un dispositivo de prueba físico, un cable de conexión
  • Conocimientos básicos de AA

¿Cómo usarás este instructivo?

Leer Leer y completar los ejercicios

¿Cómo calificarías tu experiencia con la compilación de apps para Android?

Principiante Intermedio Avanzado

2. Planteamiento del problema

Supongamos que eres un desarrollador de juegos que desea mostrar sugerencias personalizadas de compras directas desde la aplicación (IAP) al final de cada nivel. Solo puedes mostrar una cantidad limitada de opciones de IAP cada vez, y no sabes cuáles tendrán la mejor conversión. Dado que cada usuario y cada sesión son diferentes, ¿cómo encontramos la oferta de IAP que brinda la recompensa esperada más alta?

3. Obtén el código de muestra

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

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

Este repo contiene lo siguiente:

  1. Un notebook de Jupyter (.ipynb) que entrena el modelo de personalización y lo empaqueta en un modelo de TFLite
  2. Una app de ejemplo en Kotlin que usa el modelo de TFLite para hacer predicciones en el dispositivo

4. Ejecuta la app con Firebase

En este codelab, trabajaremos en la optimización de las IAP de nuestra app de juego ficticia: Flappy Sparky. El juego es de desplazamiento lateral, en el que el jugador controla un Sparky que intenta volar entre columnas de paredes sin golpearlas. Al comienzo del nivel, se le presenta al usuario una oferta de CDA que le dará una potenciación. En este codelab, solo implementaremos la parte de la app relacionada con la optimización de las IAP.

Podrás aplicar lo que aprendas aquí a tu propia app conectada a un proyecto de Firebase. Como alternativa, puedes crear un proyecto de Firebase nuevo para este codelab. Si necesitas ayuda para comenzar a usar Firebase, consulta nuestros instructivos sobre este tema ( Android y iOS).

5. Recopila eventos de Analytics en tu app

Los eventos de Analytics proporcionan estadísticas sobre el comportamiento del usuario y se utilizan para entrenar el modelo de AA. Por ejemplo, el modelo puede aprender que los usuarios que juegan durante más tiempo tienen más probabilidades de realizar una IAP para obtener vidas adicionales. El modelo de AA necesita eventos de Analytics como entrada para aprender esta información.

Estos son algunos eventos de Analytics que podríamos querer registrar:

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

Descarga datos de muestra (opcional)

En los siguientes pasos, usaremos Firebase Analytics para registrar eventos de Analytics que se usarán en nuestro modelo. Si ya tienes datos de análisis que deseas usar, ve a la sección "Entrena el modelo de optimización" de este codelab y podrás seguir los pasos con nuestros datos de muestra.

Recopila datos con el SDK de Firebase Analytics

Usaremos Firebase Analytics para recopilar estos eventos de estadísticas. El SDK de Firebase Analytics capta automáticamente varios eventos y propiedades del usuario. También te permite definir tus propios eventos personalizados para medir los eventos que son únicos para tu app.

Instala el SDK de Firebase Analytics

Para comenzar a usar Firebase Analytics en tu app, sigue la ​​documentación de Primeros pasos con Google Analytics. El repositorio firebase-iap-optimization clonado al comienzo de este codelab ya incluye el SDK de Firebase Analytics.

Registra 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 hacerlo, es importante establecer un ID de usuario en el evento de Analytics para que podamos asociar los datos de Analytics de ese usuario con sus datos existentes en la app.

MainActivity.kt

firebaseAnalytics.setUserId("player1")

A continuación, podemos registrar eventos del reproductor. Para la optimización de las IAP, queremos registrar cada oferta de IAP que se le presenta al usuario y si este hace clic en ella. Esto nos dará dos eventos de Analytics: offer_iap y offer_accepted. También haremos un seguimiento de un offer_id único para poder usarlo más adelante y combinar estos datos para ver si se acepta una oferta.

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

Para obtener más información sobre el registro de eventos personalizados, consulta la documentación de Firebase Analytics sobre el registro de eventos.

6. Procesa previamente los datos en BigQuery

En el último paso, recopilamos eventos sobre qué oferta de IAP se presenta al usuario y en qué oferta de IAP hace clic el usuario. En este paso, combinaremos estos datos de eventos con los datos del usuario para que nuestro modelo pueda aprender a partir de un panorama completo.

Para ello, primero exportaremos los eventos de Analytics a BigQuery.

Para vincular un proyecto de Firebase y sus apps a BigQuery, sigue estos pasos:

  1. Accede a Firebase.
  2. Haz clic en el ícono de configuración y, luego, selecciona Configuración del proyecto.
  3. En la página Configuración del proyecto, haz 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, tienes la opción de exportar datos de usuario adicionales de Firestore a BigQuery para ayudar a entrenar el modelo. Si deseas omitir este paso por ahora, ve a la sección "Cómo preparar datos en BigQuery" de este codelab y podrás seguir los eventos de Firebase Analytics registrados en el último paso.

Firestore puede ser el lugar donde almacenaste la fecha de registro de los usuarios, las compras directas desde la app que realizaron, los niveles del juego, las monedas en el saldo o cualquier otro atributo que pueda ser útil para entrenar el modelo.

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

Cómo preparar datos en BigQuery

En los próximos pasos, usaremos BigQuery para transformar nuestros datos de Analytics sin procesar en datos que se puedan usar para entrenar nuestro modelo.

Para que nuestro modelo aprenda qué oferta de IAP presentar según el usuario y el estado del juego, debemos organizar los 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 de una tabla para que nuestro modelo los procese. Por suerte, BigQuery está configurado para ayudarnos a hacer precisamente eso.

BigQuery permite crear "vistas" para mantener organizada tu consulta. Una vista es una tabla virtual definida por una consulta en SQL. Cuando creas una vista, la consultas de la misma manera que consultas una tabla. Con esta información, primero podemos limpiar nuestros datos de Analytics.

Para ver si se hace clic en cada oferta de compra directa desde la aplicación, deberemos unir 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;

Exporta un conjunto de datos de BigQuery a Google Cloud Storage

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

888daa7ba4db8e44.png

14d22bf474fae455.png

7. Entrena el modelo de optimización

Datos de muestra

Usa los datos del paso anterior, "Preprocesa los 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 de bandidos contextuales.

Explicación de los bandidos contextuales

Al comienzo de cada nivel de Flappy Sparky, se le presenta al usuario una oferta de IAP que le dará una potenciación. Solo podemos mostrar una opción de IAP por vez, y no sabemos cuáles tendrán la mejor conversión. Dado que cada usuario y cada sesión son diferentes, ¿cómo encontramos la oferta de IAP que brinda la recompensa esperada más alta?

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

e7d3264141498bff.jpeg

A continuación, se muestra lo que usaremos en la predicción:

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

Explotación vs. Exploración

En todos los problemas de bandidos multibrazo, el algoritmo debe equilibrar la exploración (obtener más datos para saber qué acción brinda el resultado óptimo) y la explotación (usar el resultado óptimo para obtener la mayor recompensa).

En nuestra versión del problema, simplificaremos esto para entrenar el modelo periódicamente en la nube y solo hacer predicciones cuando se 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 tendremos que mostrar resultados aleatorios a los usuarios de nuestra app (p.ej., el 30%). Esta estrategia para equilibrar la exploración y la explotación se denomina Epsilon-greedy.

Entrenar el modelo

Para comenzar, puedes usar la secuencia de comandos de entrenamiento (training.ipynb) que se proporciona con el codelab. Nuestro objetivo es entrenar un modelo que prediga las recompensas esperadas para cada acción dado un estado y, luego, encontrar la acción que nos brinde las recompensas esperadas más altas.

Entrenamiento local

La forma más sencilla de comenzar a entrenar tu propio modelo es hacer una copia del notebook 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 el entrenamiento.

En la secuencia de comandos de entrenamiento proporcionada, 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. Encontrarás detalles sobre cómo entrenar el modelo en los comentarios del notebook de Python.

Mide el rendimiento del modelo

Mientras entrenamos el modelo, lo compararemos con un agente aleatorio que selecciona ofertas de IAP de forma aleatoria para ver si nuestro modelo realmente está aprendiendo. Esta lógica se encuentra en ValidationCallback.

Al final del entrenamiento, usamos los datos de test.csv para volver a probar nuestro modelo. El modelo nunca antes había visto estos datos, por lo que podemos tener la certeza de que el resultado no se debe a un sobreajuste. En este caso, el modelo tiene un rendimiento un 28% mejor que el agente aleatorio.

Exporta el modelo de TFLite

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

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)

Desde aquí, puedes descargar el modelo y empaquetarlo con tu app.

De manera opcional, para una app de producción, te recomendamos que implementes el modelo en Firebase ML y que Firebase lo aloje. Esto es útil por dos motivos principales:

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

Para aprender a implementar el modelo en Firebase ML, puedes seguir el codelab Add Firebase to your TFLite-powered Android App. Tienes la opción de realizar la implementación con Firebase console o la API de Python.

8. Cómo hacer predicciones en el dispositivo

El siguiente paso es hacer predicciones con el modelo en el dispositivo. Puedes encontrar una app de ejemplo que descarga un modelo del AA de Firebase en la carpeta app del código de muestra que descargaste y usarla para realizar inferencias con algunos datos del cliente.

Como aplicamos un procesamiento previo durante el entrenamiento del modelo, deberemos aplicar el mismo procesamiento previo a la entrada del modelo cuando se ejecute en el dispositivo. Una forma sencilla de hacerlo es usar un formato independiente de la plataforma y el idioma, como un archivo JSON que contenga un mapa de cada función con metadatos sobre cómo se realiza el preprocesamiento. En la app de ejemplo, puedes encontrar más detalles sobre cómo se hace.

A continuación, le proporcionamos 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

Cómo medir la precisión del modelo

Para medir la precisión de nuestro modelo, podemos hacer un seguimiento de las ofertas de IAP que predice nuestro modelo y si se hace clic en ellas con Firebase Analytics. Puedes usar esta función junto con Firebase A/B Testing para medir el rendimiento real del modelo. Un paso más allá, también puedes realizar pruebas A/B en diferentes iteraciones del modelo. Puedes obtener más información sobre las pruebas A/B con Firebase en la documentación de Crea experimentos de Firebase Remote Config con A/B Testing.

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

Si necesitas actualizar tu modelo a medida que llegan datos nuevos, puedes configurar una canalización para volver a entrenar tu modelo de forma recurrente. Para ello, primero debes asegurarte de tener datos nuevos para usar en el entrenamiento con la estrategia épsilon-greedy que mencionamos anteriormente. (p. ej., usar el resultado de la predicción del modelo el 70% del tiempo y usar resultados aleatorios el 30% del tiempo)

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

10. ¡Felicitaciones!

En este codelab, aprendiste a entrenar e implementar un modelo de TFLite en el dispositivo para optimizar las compras integradas en la app con Firebase. Para obtener más información sobre TFLite y Firebase, consulta otras muestras de TFLite y las guías de inicio de Firebase.

Si tienes alguna pregunta, puedes dejarla en Stack Overflow #firebase-machine-learning.

Temas abordados

  • TensorFlow Lite
  • AA de Firebase
  • Firebase Analytics
  • BigQuery

Próximos pasos

  • Entrena e implementa un modelo de optimizador para tu app.

Más información