Codelab de optimización de compras directas desde la aplicación en tiempo real integrada 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 con Firebase Analytics.
  • Procesar previamente los datos de estadísticas con BigQuery
  • Entrena un modelo de AA simple para que optimice las compras directas desde la aplicación (IAP) en el dispositivo
  • 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 nuevos modelos 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 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 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. Ejemplo de app de 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 CDA de nuestra app de juego ficticia 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 aprendas 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 necesita ayuda para comenzar a usar Firebase, consulte nuestros instructivos sobre este tema ( iOS y Android).

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 es más probable que los usuarios que juegan durante más tiempo realicen una CDA para obtener vidas adicionales. El modelo de AA necesita eventos de análisis como entrada para obtener esta información.

Estos son algunos de los eventos de estadísticas que podemos registrar:

  • Cuánto tiempo juega el usuario
  • A qué nivel llega 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 análisis y utilizarlos 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 seguir nuestros datos de muestra.

Recopila datos con el SDK de Firebase Analytics

Usaremos Firebase Analytics para recopilar estos eventos de análisis. El SDK de Firebase Analytics captura automáticamente diversos 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 sobre cómo comenzar 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 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 optimizar las CDA, queremos registrar cada oferta de CDA 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 realizaremos un seguimiento de un offer_id exclusivo para poder usarlo más adelante a fin de 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 el registro de eventos personalizados, visita la documentación de eventos de registro de Firebase Analytics.

6. Preprocesa datos en BigQuery

En el último paso, recopilamos eventos sobre qué oferta de CDA se presenta al usuario y en qué oferta de CDA el usuario 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, 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.

(Opcional) Exporta tus colecciones de Firestore a BigQuery

En este paso, tienes la opción de exportar datos del usuario adicionales de Firestore a BigQuery para usarlos en el entrenamiento del modelo. Si quieres 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.

En Firestore, puedes almacenar la fecha de registro de los usuarios, las compras directas desde la aplicación realizadas, los niveles del juego, las monedas en 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 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 los datos de estadísticas sin procesar en datos utilizables para entrenar nuestro modelo.

Para que nuestro modelo aprenda qué oferta de IAP debe presentar en función del 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 en 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 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 análisis.

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;

Exportar el 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 los datos del paso anterior, "Preprocesa datos en BigQuery", o bien 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, definamos nuestro problema contextual de bandits.

Explicación de 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 por cada acción dada a un usuario y encontrar la acción con la recompensa más alta.

e7d3264141498bff.jpeg

En la predicción, usaremos la siguiente informació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 vs. 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 de forma periódica en la nube y solo hacer predicciones cuando se use el modelo en el dispositivo del usuario (a diferencia del entrenamiento que se realiza en el dispositivo del usuario también). 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 por cada acción en un estado determinado y, luego, encontrar la acción que nos da 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 AI Platform Notebooks 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 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 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 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 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 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.

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 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 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 se hace esto 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 el mejor potenciador de IAP para este usuario en particular.

a3381dbcdbdf811e.png

Mide la exactitud del modelo

Para medir la precisión de nuestro modelo, simplemente podemos realizar un seguimiento de las ofertas de CDA que predice nuestro modelo y de si se hace clic en ellas con Firebase Analytics. Puedes usar esto 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 sobre las pruebas A/B con Firebase en la documentación Crea experimentos de Firebase Remote Config con A/B Testing.

9. Actualiza el modelo con frecuencia con datos nuevos (opcional)

Si necesitas actualizar tu modelo a medida que ingresan datos nuevos, puedes configurar una canalización para volver a entrenar el modelo de forma recurrente. Para hacer esto, primero debes asegurarte de que tienes nuevos datos para usar en el entrenamiento mediante la estrategia con codicia épsilon 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. 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 directas desde la aplicación con Firebase. Para obtener más información sobre TFLite y Firebase, consulta otros ejemplos 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 optimizador para tu app.

Más información