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 de optimización de compras directas desde la aplicación en tiempo real en el dispositivo. En este codelab, aprenderás a usar TensorFlow Lite y Firebase para entrenar y, luego, 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 compras directas desde la aplicación (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 de amplia aplicación del que obtendrás más información en este codelab.

Qué aprenderás

  • Recopila datos de estadísticas a través de Firebase Analytics
  • Procesa datos de estadísticas con BigQuery
  • Entrena un modelo de AA simple para la optimización integrada 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
  • Entrena e implementa modelos nuevos con los datos más recientes en una cadencia recurrente

Requisitos

  • Android Studio versión 3.4 o superior
  • 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 cuando compilas apps para Android?

Principiante Intermedio Avanzado

2. Planteamiento del problema

Supongamos que eres un desarrollador de juegos que quiere 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 podemos encontrar la oferta de IAP que brinde 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 de Kotlin que usa el modelo de TFLite para hacer predicciones en el dispositivo

4. Ejecuta la app con Firebase

En este codelab, trabajaremos para optimizar las compras integradas en la aplicación de nuestro juego ficticio: Flappy Sparky. El juego es un desplazamiento lateral en el que el jugador controla a Sparky y trata de volar entre columnas de paredes sin golpearlas. Al comienzo del nivel, se le presenta al usuario una oferta de CDA que le otorgará un potenciador. En este codelab, solo implementaremos la parte de optimización de IAP de la app.

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 estadísticas en tu app

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

Estos son algunos eventos de estadísticas que tal vez quieras registrar:

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

Descargar datos de muestra (opcional)

En los siguientes pasos, usaremos Firebase Analytics para registrar los eventos de estadísticas que usaremos en nuestro modelo. Si ya tienes datos de estadísticas que deseas usar, ve a la sección "Entrena el modelo de optimización" de este codelab y puedes seguir 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 captura automáticamente varios eventos y propiedades del usuario. También te permite definir tus propios eventos personalizados para medir los eventos que son exclusivos de tu aplicación.

Cómo instalar 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 que se clonó 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 aplicación.

MainActivity.kt

firebaseAnalytics.setUserId("player1")

A continuación, podemos registrar los eventos del jugador. Para la optimización de IAP, queremos registrar cada oferta de IAP que se presenta al usuario y si el usuario hace clic en ella. Esto nos dará dos eventos de estadísticas: 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 cómo registrar eventos personalizados, consulta la documentación de Registro de eventos de Firebase Analytics.

6. Procesa datos previamente en BigQuery

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

Para ello, primero debemos exportar los eventos de estadísticas 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.

Exporta tus colecciones de Firestore a BigQuery (opcional)

En este paso, tienes la opción de exportar datos de usuario adicionales de Firestore a BigQuery para usarlos y ayudar a entrenar el modelo. Si quieres omitir este paso por ahora, ve a la sección "Cómo preparar los datos en BigQuery" de este codelab y puedes seguir los eventos de Firebase Analytics registrados en el último paso.

Es posible que hayas almacenado la fecha de registro de los usuarios, las compras directas desde la aplicación realizadas, los niveles del juego, las monedas en el saldo o cualquier otro atributo que pueda ser útil para entrenar el modelo en Firestore.

Para exportar tus colecciones de Firestore a BigQuery, puedes instalar la extensión de exportación de BigQuery de Firestore. Luego, une 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.

Preparación de datos en BigQuery

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

Para que nuestro modelo aprenda qué oferta de IAP presentar en función del usuario y el estado del juego, debemos organizar los datos sobre lo siguiente:

  • al 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 exactamente eso.

BigQuery permite crear "vistas" para mantener tu consulta organizada. 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 esto, primero podemos limpiar nuestros datos de Analytics.

Para ver si se hace clic en cada oferta de compra directa desde la aplicación, tendremos que 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 tus 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 otorgará un potenciador. Solo podemos mostrar una opción de 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 podemos encontrar la oferta de IAP que brinde la recompensa esperada más alta?

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

e7d3264141498bff.jpeg

Esto es lo que usaremos en la predicción:

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

Explotación frente a exploración

Para todos los problemas de bandidos multiarma, el algoritmo debe equilibrar la exploración (obtener más datos para saber qué acción produce el resultado óptimo) y la 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 periódicamente en la nube y solo hacer predicciones cuando se use el modelo en el dispositivo del usuario (en lugar de entrenarlo 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 de equilibrio entre exploración y 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 en un estado determinado y, luego, encontrar la acción que nos brinde las recompensas esperadas más altas.

Cómo entrenar de forma local

La forma más fácil de comenzar a entrenar tu propio modelo es hacer una copia del notebook en el código de muestra 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 Notebook de AI Platform 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 de BigQuery. Luego, usamos los datos para comenzar a entrenar nuestro modelo con Keras. Puedes encontrar 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 vio estos datos, por lo que podemos estar seguros de que el resultado no se debe al 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 TensorFlow. Tendremos que exportar el modelo como 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 razones principales:

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

Para aprender a implementar el modelo en el AA de Firebase, puedes seguir el codelab Agrega Firebase a tu app para Android con la tecnología de TFLite. Puedes implementar la app 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 integrado en el dispositivo. Puedes encontrar una app de ejemplo que descarga un modelo de AA de Firebase en la carpeta app del código de muestra que descargaste y usarla para realizar inferencias con algunos datos del cliente.

Debido a que aplicamos un procesamiento previo durante el entrenamiento del modelo, tendremos que 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 lenguaje, como un archivo JSON que contenga un mapa de cada componente con metadatos sobre cómo se realiza el procesamiento previo. Puedes encontrar más detalles sobre cómo hacerlo en la app 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 la mejor mejora de IAP para este usuario en particular.

a3381dbcdbdf811e.png

Mide la precisión del modelo

Para medir la exactitud 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. Si quieres ir 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 Crea experimentos de Firebase Remote Config con A/B Testing.

9. (Opcional): Actualiza el modelo con frecuencia con datos nuevos

Si necesitas actualizar tu modelo a medida que llegan datos nuevos, puedes configurar una canalización para volver a entrenarlo de forma recurrente. Para ello, primero debes asegurarte de tener datos nuevos para usar en el entrenamiento con la estrategia de epsilon-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).

La configuración de una canalización para el entrenamiento y la implementación con datos nuevos está fuera del alcance de este codelab. Para comenzar, puedes consultar Google Cloud AI Platform y TFX.

10. ¡Felicitaciones!

En este codelab, aprendiste a entrenar e implementar un modelo de TFLite integrado en el dispositivo para optimizar las compras directas desde la aplicación con Firebase. Para obtener más información sobre TFLite y Firebase, consulta otras muestras de TFLite y las guías de introducción 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