Codelab de optimización en tiempo real de las compras directas desde la aplicación 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 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 directa desde la aplicación (CDA) según el estado en el que se encuentra el usuario actual. Este es un ejemplo de un problema de bandit contextual, un tipo de problema de aprendizaje automático importante y ampliamente aplicable del que obtendrás más información en este codelab.

Qué aprenderás

  • Recopila datos de análisis con Firebase Analytics
  • Procesar previamente datos de análisis con BigQuery
  • Entrenar un modelo de AA simple para la optimización de compras directas desde la aplicación (IAP) en el dispositivo
  • Implementa modelos de TFLite en 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 de forma recurrente

Requisitos

  • Android Studio 3.4 o versiones posteriores
  • 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
  • Conocimiento del AA principiante

¿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 desarrollador de juegos y deseas mostrar sugerencias personalizadas de compras directas desde la aplicación (CDA) al final de cada nivel. Solo puedes mostrar una cantidad limitada de opciones de CDA 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 CDA que brinde la recompensa más alta esperada?

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 Kotlin de ejemplo que usa el modelo TFLite para hacer predicciones en el dispositivo

4. Ejecuta la app con Firebase

En este codelab, trabajaremos para optimizar las CDA de Flappy Sparky, nuestra app de juego ficticio. 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, el usuario ve una oferta de CDA que le dará un potenciador. En este codelab, solo implementaremos la parte de optimización de IAP de la app.

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

5. Cómo recopilar eventos de estadísticas en tu app

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

Estos son algunos de los eventos de estadísticas que podemos 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, utilizaremos Firebase Analytics para registrar los eventos de análisis y usarlos 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 podrás continuar 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 diversos eventos y propiedades de usuario. También te permite definir tus propios eventos personalizados para medir aquellos que son exclusivos de tu app.

Cómo instalar el SDK de Firebase Analytics

Puedes comenzar a usar Firebase Analytics en tu app siguiendo la documentación Comienza a usar 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 configurar un ID del usuario en el evento de Analytics para que podamos asociar los datos de estadísticas de ese usuario con sus datos existentes en la app.

MainActivity.kt

firebaseAnalytics.setUserId("player1")

Luego, podemos registrar los eventos del reproductor. Para la optimización de CDA, queremos registrar cada oferta de CDA que se presente al usuario y si este hace clic en ella. Esto nos dará dos eventos de estadísticas: offer_iap y offer_accepted. También realizaremos un seguimiento de un offer_id único para que podamos usarlo más adelante para combinar estos datos y 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 registros de eventos de Firebase Analytics.

6. Preprocesar datos en BigQuery

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

Para ello, tendremos que comenzar por 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.

(Opcional) Exporta tus colecciones de Firestore a BigQuery

En este paso, tienes la opción de exportar datos adicionales del usuario de Firestore a BigQuery para usarlos en el entrenamiento del modelo. Si deseas omitir este paso por ahora, ve a la sección "Prepara datos en BigQuery" de este codelab y puedes 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 aplicación que realizaste, los niveles del juego, las monedas en el saldo o cualquier otro atributo que podría 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 tablas en BigQuery para combinar estos datos con los de Google Analytics y utilízalos en tu modelo de personalización y en el resto de este codelab.

Prepara 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 CDA presentar en función del usuario y el estado del juego, necesitamos organizar los datos sobre lo siguiente:

  • el usuario
  • 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. Por suerte, BigQuery está configurado para ayudarnos a hacerlo.

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 estadísticos.

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

Exporta el 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 modelos.

888daa7ba4db8e44.png

14d22bf474fae455.png

7. Entrena el modelo de optimización

Datos de muestra

Usa tus datos del paso anterior, “Preprocesa datos en BigQuery” o los datos de muestra descargables que se proporcionan aquí para continuar con el resto de este codelab.

Definición del problema

Antes de empezar a entrenar el modelo, dediquemos algo de tiempo a definir nuestro problema de bandits contextuales.

Explicación de los bandits contextuales

Al comienzo de cada nivel de Flappy Sparky, al usuario se le presenta una oferta de CDA que le dará un potenciador. Solo podemos mostrar una opción de CDA 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 CDA que brinde la recompensa más alta esperada?

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

e7d3264141498bff.jpeg

Usaremos lo siguiente en la predicción:

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

Explotación frente a exploración

Para todos los problemas de multi-armed bandits, el algoritmo debe equilibrar la exploración (obtener más datos para determinar qué acción da el resultado óptimo) y la explotación (utilizar el resultado óptimo para obtener la recompensa más alta).

En nuestra versión del problema, simplificaremos esto para entrenar el modelo de forma periódica en la nube y solo realizar 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 aplicación (p.ej., un 30%). Esta estrategia de equilibrar la exploración y la explotación se denomina Epsilon-codicioso.

Entrenar el modelo

Puedes usar la secuencia de comandos de entrenamiento (training.ipynb) proporcionada con el codelab para comenzar. Nuestro objetivo es entrenar un modelo que prediga las recompensas esperadas para cada acción en función de un estado y, luego, encontraremos la acción que nos brinde las recompensas más altas esperadas.

Entrena localmente

La forma más fácil de comenzar a entrenar tu propio modelo es hacer una copia del notebook en la muestra de código de este codelab.

En este codelab, no necesitas una GPU, 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 de BigQuery. Luego, usamos los datos para empezar a entrenar nuestro modelo con Keras. Los detalles de cómo entrenar el modelo se pueden encontrar en los comentarios del notebook de Python.

Mide el rendimiento del modelo

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

Al final del entrenamiento, usamos datos en 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 a un sobreajuste. En este caso, el rendimiento del modelo es 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, en el caso de una app de producción, recomendamos que implementes el modelo en AA de Firebase y que Firebase aloje el modelo. Esto es útil por dos motivos principales:

  1. Podemos mantener un 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 regularidad y con un ciclo de lanzamiento diferente al de toda la app.

Si quieres aprender a implementar el modelo en el AA de Firebase, puedes seguir el codelab Agrega Firebase a tu app para Android con tecnología TFLite. Puedes realizar la implementación con Firebase console o la API de Python.

8. Realiza predicciones en el dispositivo

El siguiente paso es realizar predicciones con el modelo en el dispositivo. Puedes encontrar una app de ejemplo que descargue 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.

Debido a que aplicamos cierto 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 del lenguaje y la plataforma, como un archivo JSON que contiene un mapa de cada atributo a metadatos sobre cómo se realiza el procesamiento previo. Puedes obtener más información sobre cómo hacerlo en la app de ejemplo.

Luego, 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.

3381dbcdbdf811e.png

Mide la exactitud del modelo

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

9. Actualiza el modelo periódicamente con datos nuevos (opcional)

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 que tienes datos nuevos para usar en el entrenamiento con la estrategia épsilon-codiciosa que mencionamos antes. (p.ej., usar el resultado de predicción del modelo el 70% de las veces y usar resultados aleatorios el 30% de las veces).

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 AI Platform de Google Cloud 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 preguntas, puedes dejarlas 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