Codelab em tempo real da otimização de compras no app no dispositivo

1. Visão geral

1cbf855eda62c306.png

Este é o codelab de otimização de compras no app em tempo real no dispositivo. Neste codelab, você aprenderá a usar o TensorFlow Lite e o Firebase para treinar e implantar um modelo de personalização personalizado no seu app.

Neste tutorial, mostramos como criar um modelo de machine learning para personalização, em especial um que prevê a oferta ideal de compra no app (IAP), de acordo com o estado do usuário atual. Este é um exemplo de problema do tipo contextual bandit, um tipo importante e amplamente aplicável de machine learning que você vai conhecer neste codelab.

Conteúdo

  • Coletar dados de análise usando o Firebase Analytics
  • Pré-processar dados de análise usando o BigQuery
  • Treinar um modelo de ML simples para otimização de compras no app (IAPs) no dispositivo
  • Implante modelos do TFLite para o Firebase ML e acesse-os pelo seu app
  • Avalie e teste modelos diferentes com o Teste A/B do Firebase
  • Treine e implante novos modelos usando os dados mais recentes em uma frequência recorrente

Pré-requisitos

  • Android Studio versão 3.4 ou mais recente
  • Um dispositivo de teste físico com o Android 2.3+ e o Google Play Services 9.8 ou posterior, ou um emulador com o Google Play Services 9.8 ou posterior
  • Se estiver usando um dispositivo de teste físico, um cabo de conexão
  • Conhecimento iniciante em ML

Como você vai usar este tutorial?

Apenas leitura Ler e fazer os exercícios

Como você classificaria sua experiência com a criação de apps Android?

Iniciante Intermediário Proficiente

2. Declaração do problema

Imagine que você desenvolve jogos e quer mostrar sugestões personalizadas de compra no app ao final de cada nível. Você só pode mostrar um número limitado de opções de compra no app por vez, e não sabe quais terão a melhor conversão. Considerando que cada usuário e cada sessão é diferente, como podemos encontrar a oferta de compra no app que ofereça a maior recompensa esperada?

3. Acessar o exemplo de código

Clone o repositório do GitHub (link em inglês) da linha de comando.

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

Esse repositório contém:

  1. Um notebook Jupyter (.ipynb) que treina o modelo de personalização e o empacota em um modelo do TFLite
  2. Um app Kotlin de exemplo que usa o modelo TFLite para fazer previsões no dispositivo.

4. Executar o app com o Firebase

Neste codelab, vamos trabalhar para otimizar as compras no app do nosso app de jogo fictício, o Flappy Sparky. É um jogo de rolagem lateral em que o jogador controla um Sparky e tenta voar entre colunas de paredes sem bater nelas. No início do nível, o usuário recebe uma oferta de compra no app que dá um poder. Neste codelab, vamos implementar somente a parte de otimização do IAP do app.

Você poderá aplicar o que aprender aqui ao seu próprio app conectado a um projeto do Firebase. Como alternativa, você pode criar um novo projeto do Firebase para este codelab. Se você precisar de ajuda para começar a usar o Firebase, consulte nossos tutoriais sobre esse tópico ( Android e iOS).

5. Coletar eventos de análise no seu app

Os eventos de análise fornecem insights sobre o comportamento do usuário e são usados para treinar o modelo de ML. Por exemplo, o modelo pode aprender que os usuários que jogam por mais tempo têm mais chances de fazer uma compra no app para ganhar vidas extras. O modelo de ML precisa de eventos de análise como entrada para aprender essas informações.

Alguns eventos de análise que convém registrar incluem:

  • Por quanto tempo o usuário joga o jogo
  • O nível em que o usuário atinge
  • Quantas moedas o usuário gasta
  • Quais itens o usuário compra

Fazer o download dos dados de amostra (opcional)

Nas etapas seguintes, usaremos o Firebase Analytics para registrar eventos de análise a serem usados no nosso modelo. Se você já tem dados de análise que gostaria de usar, vá para a seção "Treinar o modelo de otimização" deste codelab e acompanhe nossos dados de amostra.

Coletar dados com o SDK do Firebase Analytics

Usaremos o Firebase Analytics para coletar esses eventos de análise. O SDK do Firebase Analytics captura automaticamente uma série de eventos e propriedades do usuário. Ele também permite que você defina seus próprios eventos personalizados para medir os eventos exclusivos do seu app.

Como instalar o SDK do Firebase Analytics

Se quiser começar a usar o Firebase Analytics no seu app, siga as instruções da documentação de Introdução ao Google Analytics. O repositório firebase-iap-optimization clonado no início deste codelab já inclui o SDK do Firebase Analytics.

Registrar eventos personalizados

Depois de configurar o SDK do Firebase Analytics, podemos começar a registrar os eventos necessários para treinar o modelo.

Antes disso, é importante definir um User-ID no evento de análise para que possamos associar os dados de análise do usuário aos dados existentes no aplicativo.

MainActivity.kt (link em inglês)

firebaseAnalytics.setUserId("player1")

Em seguida, podemos registrar os eventos do jogador. Para a otimização de compra no app, queremos registrar cada oferta de compra no app apresentada ao usuário e se essa oferta recebeu um clique. Assim, teremos dois eventos de análise: offer_iap e offer_accepted. Também acompanharemos um offer_id exclusivo para que possamos usá-lo mais tarde para combinar esses dados e ver se uma oferta é aceita.

MainActivity.kt (link em inglês)

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 mais informações sobre como registrar eventos personalizados, acesse a documentação de eventos de registro do Firebase Analytics.

6. Pré-processar dados no BigQuery

Na última etapa, coletamos eventos sobre qual oferta de compra no app é apresentada ao usuário e qual delas é clicada. Nesta etapa, vamos combinar os dados desses eventos com os do usuário para que o modelo aprenda com uma visão completa.

Para fazer isso, precisamos começar exportando os eventos de análise para o BigQuery.

Para vincular seu projeto do Firebase e os aplicativos dele ao BigQuery, faça as seguintes ações:

  1. Faça login no Firebase.
  2. Clique em o ícone "Configurações" e selecione Configurações do projeto.
  3. Na página "Configurações do projeto", clique na guia "Integrações".
  4. No cartão do BigQuery, clique em "Vincular".

(Opcional) Exportar as coleções do Firestore para o BigQuery

Nesta etapa, você tem a opção de exportar outros dados do usuário do Firestore para o BigQuery para usar no treinamento do modelo. Se você quiser pular esta etapa por enquanto, vá para a seção "Como preparar dados no BigQuery" deste codelab e acompanhe os eventos do Firebase Analytics registrados na última etapa.

O Firestore pode ser o local onde você armazenou a data de inscrição dos usuários, as compras feitas no app, os níveis do jogo, as moedas em saldo ou qualquer outro atributo que possa ser útil para treinar o modelo.

Para exportar as coleções do Firestore para o BigQuery, instale a extensão BigQuery Export do Firestore. Em seguida, junte tabelas no BigQuery para combinar esses dados com os do Google Analytics e usá-los no seu modelo de personalização e no restante deste codelab.

Como preparar dados no BigQuery

Nas próximas etapas, usaremos o BigQuery para transformar nossos dados brutos de análise em dados utilizáveis para treinar o modelo.

Para que nosso modelo aprenda qual oferta de compra no app apresentar com base no usuário e no estado do jogo, precisamos organizar dados sobre o seguinte:

  • o usuário
  • o estado do jogo
  • a oferta apresentada
  • se a oferta apresentada foi clicada ou não

Todos esses dados precisarão ser organizados em uma única linha em uma tabela para que nosso modelo faça o processamento. Felizmente, o BigQuery está configurado para nos ajudar a fazer exatamente isso.

Com o BigQuery, é possível criar "visualizações" para manter suas consultas organizadas. uma tabela virtual definida por uma consulta SQL. Quando você cria uma visualização, a consulta é feita da mesma forma que uma tabela. Usando isso, podemos primeiro limpar nossos dados de análise.

Para ver se cada oferta de compra no app foi clicada, precisaremos mesclar os eventos offer_iap e offer_accepted registrados na etapa anterior.

all_offers_joined: visualização do 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: visualização do 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 conjunto de dados do BigQuery para o Google Cloud Storage

Por fim, é possível exportar o conjunto de dados do BigQuery para o GCS e usá-lo no treinamento do modelo.

888daa7ba4db8e44.png

14d22bf474fae455.png

7. Treine o modelo de otimização

Dados de amostra

Use seus dados da etapa anterior, "Pré-processar dados no BigQuery" ou os dados de exemplo para download fornecidos aqui para acompanhar o restante deste codelab.

Definição do problema

Antes de começarmos a treinar o modelo, vamos definir nosso problema de experimento tipo multi-armed bandit.

Explicações sobre bandidos contextuais

No início de cada nível no Flappy Sparky, o usuário recebe uma oferta de compra no app que lhe dará um power-up. Só podemos mostrar uma opção de compra no app por vez, e não sabemos quais terão a melhor conversão. Considerando que cada usuário e cada sessão é diferente, como podemos encontrar a oferta de compra no app que ofereça a maior recompensa esperada?

Nesse caso, vamos definir o prêmio 0 se o usuário não aceitar a oferta de compra no app, e o valor da compra se ele aceitar. Para tentar maximizar o prêmio, podemos usar nossos dados históricos para treinar um modelo que prevê a recompensa esperada para cada ação realizada por um usuário e encontrar a ação com o maior prêmio.

e7d3264141498bff.jpeg

Vamos usar o seguinte na previsão:

  • Estado: informações sobre o usuário e a sessão atual dele
  • Ação: Ofertas de compra no app que podemos mostrar
  • Prêmio: valor da oferta de compra no app

Exploração vs. Exploração

Para todos os problemas do tipo multi-armed bandits, o algoritmo precisa equilibrar a exploração (obter mais dados para saber qual ação gera o resultado ideal) e a exploração (usar o resultado ideal para receber a maior recompensa).

Na nossa versão do problema, vamos simplificar isso para treinar o modelo apenas periodicamente na nuvem e fazer previsões apenas ao usar o modelo no dispositivo do usuário (em vez de treinar no dispositivo do usuário também). Para garantir que tenhamos dados de treinamento suficientes após usar o modelo, vamos precisar mostrar resultados aleatórios aos usuários do app algumas vezes (por exemplo, 30%). Essa estratégia de balanceamento de exploração e exploração é chamada de Epsilon-greedy.

Treinamento do modelo

Para começar, use o script de treinamento (training.ipynb) fornecido com o codelab. Nosso objetivo é treinar um modelo que preveja as recompensas esperadas para cada ação em determinado estado. Depois, encontramos a ação que nos dá as maiores recompensas esperadas.

Como treinar localmente

A maneira mais fácil de começar a treinar seu próprio modelo é fazer uma cópia do notebook no exemplo de código deste codelab.

Você não precisa de uma GPU para este codelab, mas se precisar de uma máquina mais potente para explorar seus próprios dados e treinar seu próprio modelo, use uma instância de notebook da AI Platform para acelerar o treinamento.

No script de treinamento fornecido, criamos um iterador que gera dados de treinamento a partir dos arquivos CSV exportados do BigQuery. Em seguida, usamos os dados para começar a treinar nosso modelo com o Keras. Os detalhes de como treinar o modelo podem ser encontrados nos comentários do notebook Python.

Medir o desempenho do modelo

Durante o treinamento, vamos comparar o modelo com um agente aleatório que seleciona ofertas de compra no app de maneira aleatória para ver se o modelo está realmente aprendendo. Essa lógica fica em ValidationCallback.

No final do treinamento, usamos dados em test.csv para testar o modelo novamente. O modelo nunca viu esses dados antes. Por isso, podemos ter certeza de que o resultado não é causado por overfitting (link em inglês). Neste caso, o desempenho do modelo é 28% melhor do que o agente aleatório.

Exportar o modelo do TFLite

Agora temos um modelo treinado pronto para uso, mas que está no formato TensorFlow. Precisamos exportar o modelo como o formato TFLite para execução em dispositivos móveis.

train.ipynb (link em inglês)

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)

Aqui, é possível fazer o download do modelo e agrupá-lo com o app.

Opcionalmente, para um aplicativo de produção, recomendamos que você implante o modelo no Firebase ML e faça com que o Firebase hospede seu modelo. Isso é útil por dois motivos principais:

  1. Podemos manter o tamanho da instalação do app pequeno e fazer o download do modelo apenas se necessário
  2. O modelo pode ser atualizado regularmente e com um ciclo de lançamento diferente do que todo o app

Para saber como implantar o modelo no Firebase ML, siga o codelab Adicionar o Firebase ao app Android com TFLite. Você tem a opção de implantar usando o Console do Firebase ou a API Python.

8. Fazendo previsões no dispositivo

A próxima etapa é fazer previsões usando o modelo no dispositivo. Encontre um app de exemplo que faz o download de um modelo do Firebase ML na pasta app do código de amostra transferido e use-o para realizar inferência com alguns dados do lado do cliente.

Como parte do pré-processamento foi aplicada durante o treinamento do modelo, é preciso aplicar o mesmo pré-processamento à entrada do modelo quando a execução for no dispositivo. Uma maneira simples de fazer isso é usar um formato independente de plataforma e linguagem, como um arquivo JSON contendo um mapa de todos os elementos para metadados sobre como o pré-processamento é feito. Confira mais detalhes sobre como isso é feito no app de exemplo.

Depois, inserimos uma entrada de teste no modelo, como mostrado a seguir:

IapOptimzer.kt (link em inglês)

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

O modelo sugere que sparky_armor é o melhor poder de compra no app para esse usuário específico.

a3381dbcdbdf811e.png

Medir a acurácia do modelo

Para medir a precisão do nosso modelo, podemos simplesmente acompanhar as ofertas de IAP previstas pelo modelo e se elas são clicadas usando o Firebase Analytics. Você pode usar isso com o Teste A/B do Firebase para medir o desempenho real do modelo. Além disso, também é possível realizar testes A/B em diferentes iterações do modelo. Saiba mais sobre o teste A/B com o Firebase na documentação Criar experimentos de Configuração remota do Firebase com o Teste A/B.

9. (Opcional): atualizar o modelo regularmente com novos dados

Se você precisar atualizar o modelo à medida que novos dados chegarem, configure um pipeline para treiná-lo novamente de maneira recorrente. Para isso, primeiro verifique se você tem novos dados para usar no treinamento com a estratégia épsilon-greedy mencionada acima. Por exemplo, usar o resultado de previsão do modelo 70% das vezes e usar resultados aleatórios em 30% das vezes.

A configuração de um pipeline para treinamento e implantação com novos dados está além do escopo deste codelab. Confira o Google Cloud AI Platform e o TFX para começar.

10. Parabéns!

Neste codelab, você aprendeu a treinar e implantar um modelo do TFLite no dispositivo para otimizar as compras no app usando o Firebase. Para saber mais sobre o TFLite e o Firebase, confira outros exemplos do TFLite e os guias de iniciação do Firebase.

Em caso de dúvidas, acesse o site Stack Overflow #firebase-machine-learning.

O que aprendemos

  • TensorFlow Lite
  • Firebase ML
  • Firebase Analytics
  • BigQuery

Próximas etapas

  • Treine e implante um modelo otimizador para seu aplicativo.

Saiba mais