Otimização de compras no aplicativo em tempo real no dispositivo Codelab

1. Visão Geral

1cbf855eda62c306.png

Bem-vindo ao codelab de otimização de compras no aplicativo 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.

Este tutorial mostra como construir um modelo de aprendizado de máquina para personalização, em particular um que preveja a oferta ideal de compra no aplicativo (IAP), dado o estado em que o usuário atual se encontra. tipo de problema de aprendizado de máquina amplamente aplicável, sobre o qual você aprenderá mais neste codelab

O que você aprenderá

  • Colete dados analíticos por meio do Firebase Analytics
  • Pré-processar dados analíticos usando o BigQuery
  • Treine um modelo simples de ML para otimização de compras no aplicativo (IAPs) no dispositivo
  • Implante modelos TFLite no Firebase ML e acesse-os no seu aplicativo
  • Meça e experimente diferentes modelos por meio do Firebase A/B Testing
  • Treine e implante novos modelos usando os dados mais recentes em uma cadência recorrente

O que você precisará

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

Como você usará este tutorial?

Leia apenas Leia e complete os exercícios

Como você avaliaria sua experiência na criação de aplicativos Android?

Novato Intermediário Proficiente

2. Declaração do problema

Digamos que você seja um desenvolvedor de jogos que deseja mostrar sugestões personalizadas de compras no aplicativo (IAP) no final de cada nível. Você só pode mostrar um número limitado de opções de IAP de cada vez e não sabe quais terão a melhor conversão. Dado que cada usuário e cada sessão são diferentes, como podemos encontrar a oferta IAP que oferece a maior recompensa esperada?

3. Obtenha o código de exemplo

Clone o repositório GitHub na linha de comando.

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

Este repositório contém:

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

4. Execute o aplicativo com Firebase

Neste codelab, trabalharemos na otimização dos IAPs do nosso aplicativo de jogo fictício: Flappy Sparky . O jogo é um side-scroller onde o jogador controla um Sparky, tentando voar entre colunas de paredes sem acertá-las. No início do nível, o usuário recebe uma oferta IAP que lhe dará um power-up. Implementaremos apenas a parte de otimização de IAP do app neste codelab.

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

5. Colete eventos analíticos em seu aplicativo

Os eventos analíticos fornecem informações 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 maior probabilidade de fazer um IAP para ganhar vidas extras. O modelo de ML precisa de eventos analíticos como entrada para aprender essas informações.

Alguns eventos analíticos que podemos querer registrar incluem:

  • Quanto tempo o usuário joga o jogo
  • Qual nível o usuário atinge
  • Quantas moedas o usuário gasta
  • Quais itens o usuário compra

Baixe dados de amostra (opcional)

Nas etapas a seguir, usaremos o Firebase Analytics para registrar eventos analíticos a serem usados ​​em nosso modelo. Se você já tem dados analíticos que deseja usar, vá para a seção "Treinar o modelo de otimização" deste codelab e acompanhe nossos dados de amostra.

Colete dados com o SDK do Firebase Analytics

Usaremos o Firebase Analytics para ajudar a coletar esses eventos analíticos. O SDK do Firebase Analytics captura automaticamente vários 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 aplicativo.

Instalando o SDK do Firebase Analytics

Você pode começar a usar o Firebase Analytics em seu aplicativo seguindo a documentação de primeiros passos com o 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 nosso modelo.

Antes de fazermos isso, é importante definir um ID de usuário no evento analítico, para que possamos associar os dados analíticos desse usuário aos dados existentes no aplicativo.

MainActivity.kt

firebaseAnalytics.setUserId("player1")

Em seguida, podemos registrar os eventos dos jogadores. Para otimização de IAP, queremos registrar cada oferta de IAP apresentada ao usuário e se essa oferta é clicada pelo usuário. Isso nos dará dois eventos analíticos - offer_iap e offer_accepted . Também acompanharemos um offer_id exclusivo para que possamos usá-lo posteriormente para combinar esses dados e ver se uma oferta é aceita.

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

6. Pré-processar dados no BigQuery

Na última etapa, coletamos eventos sobre qual oferta de IAP é apresentada ao usuário e qual oferta de IAP é clicada pelo usuário. Nesta etapa, combinaremos os dados do evento com os dados do usuário para que nosso modelo possa aprender com uma imagem completa.

Para fazer isso, precisaremos começar exportando os eventos analíticos para o BigQuery.

Para vincular seu projeto do Firebase e seus aplicativos ao BigQuery:

  1. Faça login no Firebase.
  2. Clique the Settings icon 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 Link.

(Opcional) Exporte suas coleções do Firestore para o BigQuery

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

O Firestore pode ser onde você armazenou a data de inscrição dos usuários, as compras feitas no aplicativo, os níveis do jogo, as moedas em saldo ou quaisquer outros atributos que possam ser úteis no treinamento do modelo.

Para exportar suas coleções do Firestore para o BigQuery, instale o Firestore BigQuery Export Extension . Em seguida, junte tabelas no BigQuery para combinar esses dados com os dados do Google Analytics para usar no seu modelo de personalização e no restante deste codelab.

Preparando dados no BigQuery

Nas próximas etapas, usaremos o BigQuery para transformar nossos dados analíticos brutos em dados utilizáveis ​​para treinar nosso modelo.

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

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

Todos esses dados precisarão ser organizados em uma única linha em uma tabela para que nosso modelo os processe. Felizmente, o BigQuery foi configurado para nos ajudar a fazer exatamente isso.

O BigQuery permite criar “visualizações” para manter sua consulta organizada. Uma visualização é uma tabela virtual definida por uma consulta SQL. Ao criar uma visualização, você a consulta da mesma forma que consulta uma tabela. Usando isso, podemos primeiro limpar nossos dados analíticos.

Para ver se cada oferta de compra no aplicativo foi clicada, precisaremos ingressar nos eventos offer_iap e offer_accepted que registramos 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 último, podemos exportar o conjunto de dados do bigquery para o GCS para que possamos usá-lo no treinamento do nosso modelo.

888daa7ba4db8e44.png

14d22bf474fae455.png

7. Treine o modelo de otimização

Dados de amostra

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

Definição de problema

Antes de começarmos a treinar o modelo, vamos passar algum tempo definindo nosso problema contextual de bandidos.

Bandidos contextuais

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

Nesse caso, vamos definir a recompensa como 0 se o usuário não aceitar a oferta do IAP, e o valor do IAP se aceitar. Para tentar maximizar sua recompensa, podemos usar nossos dados históricos para treinar um modelo que prevê a recompensa esperada para cada ação dada a um usuário e encontrar a ação com a maior recompensa.

e7d3264141498bff.jpeg

A seguir está o que usaremos na previsão:

  • Estado: informações sobre o usuário e sua sessão atual
  • Ação: ofertas de IAP que podemos optar por exibir
  • Recompensa: valor da oferta IAP

Exploração vs Exploração

Para todos os problemas de bandidos multi-armados, o algoritmo precisa equilibrar entre exploração (obter mais dados para saber qual ação dá o resultado ideal) e exploração (usar o resultado ideal para obter a recompensa mais alta).

Em nossa versão do problema, simplificaremos isso para treinar o modelo apenas periodicamente na nuvem e apenas fazer previsões ao usar o modelo no dispositivo do usuário (em vez de treinar também no dispositivo do usuário). Para garantir que teremos dados de treinamento suficientes depois de usar o modelo, precisaremos mostrar resultados aleatórios aos usuários do nosso aplicativo às vezes (por exemplo, 30%). Esta estratégia de equilibrar exploração e exploração é chamada de Epsilon-ganancioso .

Treinando o modelo

Você pode usar o script de treinamento ( training.ipynb ) fornecido com o codelab para começar. Nosso objetivo é treinar um modelo que preveja as recompensas esperadas para cada ação dado um estado, então encontramos a ação que nos dá as maiores recompensas esperadas.

Treinamento local

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 poderosa para explorar seus próprios dados e treinar seu próprio modelo, poderá obter uma instância do AI Platform Notebook para acelerar seu treinamento.

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

Meça o desempenho do modelo

Ao treinar o modelo, iremos compará-lo com um agente aleatório que seleciona ofertas de IAP aleatoriamente para ver se nosso modelo está realmente aprendendo. Essa lógica reside em ValidationCallback .

No final do treinamento, usamos os dados em test.csv para testar nosso modelo novamente. O modelo nunca viu esses dados antes, então podemos ter certeza de que o resultado não se deve ao sobreajuste . Nesse caso, o modelo tem desempenho 28% melhor que o agente aleatório.

Exportar o modelo TFLite

Agora temos um modelo treinado pronto para uso, exceto que atualmente está no formato TensorFlow. Precisaremos exportar o modelo no formato TFLite para que possa ser executado em dispositivos móveis.

treinar.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)

A partir daqui, você pode baixar o modelo e agrupá-lo com seu aplicativo.

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

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

Para saber como implantar o modelo no Firebase ML, siga o codelab Adicionar Firebase ao seu aplicativo Android com tecnologia 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. Você pode encontrar um aplicativo de exemplo que faz download de um modelo do Firebase ML na pasta do app do código de amostra baixado e usá-lo para realizar inferência com alguns dados do lado do cliente.

Como aplicamos algum pré-processamento durante o treinamento do modelo, precisaremos aplicar o mesmo pré-processamento à entrada do modelo durante a execução no dispositivo. Uma maneira simples de fazer isso é usar um formato independente de plataforma e linguagem, como um arquivo JSON contendo um mapa de cada recurso para metadados sobre como o pré-processamento é feito. Você pode encontrar mais detalhes sobre como isso é feito no aplicativo de exemplo.

A seguir, damos ao modelo uma entrada de teste como segue:

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

O modelo sugere que sparky_armor é o melhor powerup IAP para este usuário específico.

a3381dbcdbdf811e.png

Medir a precisão do modelo

Para medir a precisão do nosso modelo, podemos simplesmente acompanhar as ofertas de IAP previstas pelo nosso modelo e se elas são clicadas usando o Firebase Analytics. Você pode usar isso junto com os testes A/B do Firebase para medir o desempenho real do modelo. Indo um passo adiante, você também pode realizar testes A/B em diferentes iterações do modelo. Você pode saber mais sobre testes A/B com o Firebase na documentação Criar experimentos de configuração remota do Firebase com testes A/B .

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

Se precisar atualizar seu modelo à medida que novos dados chegam, você pode configurar um pipeline para treinar novamente seu modelo de forma recorrente. Para fazer isso, primeiro você precisa ter certeza de que possui novos dados para usar no treinamento usando a estratégia épsilon gananciosa que mencionamos acima. (por exemplo, usar o resultado da previsão do modelo 70% das vezes e usar resultados aleatórios 30% das vezes).

Configurar 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 TFLite no dispositivo para otimizar compras no aplicativo usando o Firebase. Para saber mais sobre o TFLite e o Firebase, dê uma olhada em outros exemplos do TFLite e nos guias de primeiros passos do Firebase.

Se você tiver alguma dúvida, pode deixá-la em Stack Overflow #firebase-machine-learning .

O que cobrimos

  • TensorFlow Lite
  • FirebaseML
  • Análise do Firebase
  • BigQuery

Próximos passos

  • Treine e implante um modelo de otimizador para seu aplicativo.

Saber mais