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 en tiempo real de las compras directas desde la aplicación 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 crear 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) en función del estado en el que se encuentra el usuario actual. Este es un ejemplo de un problema de bandit contextual, un tipo importante y ampliamente aplicable de problema de aprendizaje automático sobre el que aprenderás más en este codelab

Qué aprenderás

  • Recopila datos de estadísticas a través de Firebase Analytics
  • Procesar previamente los datos de estadísticas 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
  • Entrena e implementa modelos nuevos con los datos más recientes en una cadencia recurrente

Requisitos

  • Android Studio 3.4 o versiones posteriores
  • Un dispositivo de prueba físico con Android 2.3 o versiones posteriores y los 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 físico de prueba, un cable de conexión
  • Conocimientos principiantes sobre 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 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 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 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 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. Se trata de un juego de desplazamiento lateral en el que el jugador controla a un Sparky mientras intenta volar entre columnas de paredes sin golpearlas. Al principio del nivel, se presenta al usuario 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 aprendiste aquí a tu propia app que esté 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 análisis como entrada para obtener 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

Descarga 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 una serie de 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 sobre cómo comenzar a usar 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 configurar 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")

Luego, podemos registrar los eventos del reproductor. 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. Preprocesa datos 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 del panorama completo.

Para ello, tendremos que empezar por exportar los eventos de análisis 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 “Prepara datos en BigQuery”. de este codelab, y podrás 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 BigQuery Export de Firestore. Luego, une tablas en BigQuery para combinar estos datos con los de Google Analytics para usarlos 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 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 en 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, debemos 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 un 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 nuestro entrenamiento de modelos.

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 empezar a entrenar el modelo, definamos nuestro problema contextual de bandits.

Explicación de los bandidos contextuales

Al comienzo de cada nivel en 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, estableceremos la recompensa como 0 si el usuario no acepta la oferta de CDA y el valor de CDA si lo hace. Para intentar maximizar tu recompensa, podemos usar nuestros datos históricos para entrenar un modelo que prediga la recompensa esperada para cada acción en 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 CDA que podemos mostrar
  • Recompensa: El valor de la oferta de CDA

Explotación frente a exploración

Para todos los problemas multi-armed bandits, el algoritmo debe equilibrar la exploración (obtener más datos para saber qué acción da el resultado óptimo) y la explotación (mediante el uso del 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, algunas veces tendremos que mostrar resultados aleatorizados a los usuarios de nuestra app (p.ej., un 30%). Esta estrategia de equilibrar la exploración y la explotación se denomina codicia épsilon.

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.

Entrenamiento local

La manera 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.

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 que se proporcionó, 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 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 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 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 TensorFlow. Deberemos 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 el AA de Firebase y que Firebase aloje tu modelo. Esto es útil por dos razones principales:

  1. Podemos mantener el tamaño de instalación de la app pequeño y descargar el modelo solo si es necesario.
  2. El modelo se puede actualizar con regularidad 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 Cómo agregar Firebase a tu app para Android con tecnología de TFLite. Tienes la opción de implementar con Firebase console o la API de Python.

8. Realiza predicciones en el dispositivo

El siguiente paso es realizar 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 algún 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 del lenguaje, como un archivo JSON que contiene una asignación de cada atributo a 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 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 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 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