Cihaz üzerinde gerçek zamanlı uygulama içi satın alma optimizasyonu Codelab'i

1. Genel Bakış

1cbf855eda62c306.png

Gerçek zamanlı cihaz üzerinde uygulama içi satın alma optimizasyonu codelab'ine hoş geldiniz. Bu codelab'de, uygulamanıza özel bir kişiselleştirme modeli eğitmek ve dağıtmak için TensorFlow Lite ve Firebase'i nasıl kullanacağınızı öğreneceksiniz.

Bu eğitimde, kişiselleştirme için bir makine öğrenimi modelinin nasıl oluşturulacağı, özellikle de mevcut kullanıcının bulunduğu duruma göre optimum uygulama içi satın alma (UİSA) teklifinin tahmin edileceği bir modelin nasıl oluşturulacağı açıklanmaktadır. Bu, bağlamsal slot makinesi problemine bir örnektir. Önemli ve geniş çapta uygulanabilir bir makine öğrenimi problemi türüdür. Bu codelab'de hakkında daha fazla bilgi edineceksiniz

Neler öğreneceksiniz?

  • Firebase Analytics ile analiz verilerini toplama
  • BigQuery kullanarak analiz verilerini ön işleme
  • Uygulama içi satın almaların (IAP'ler) cihaz üzerinde optimizasyonu için basit bir makine öğrenimi modeli eğitme
  • TFLite modellerini Firebase ML'ye dağıtın ve bu modellere uygulamanızdan erişin
  • Firebase A/B Testi aracılığıyla farklı modellerle ölçüm ve deneme yapın
  • Yinelenen bir tempoda en son verileri kullanarak yeni modelleri eğitin ve dağıtın

Gerekenler

  • Android Studio 3.4 sürümü veya daha yeni bir sürüm
  • Android 2.3 veya sonraki bir sürüme ve Google Play Hizmetleri 9.8 veya sonraki sürümlerine sahip bir fiziksel test cihazı ya da Google Play Hizmetleri 9.8 veya sonraki sürümleri olan bir Emülatör
  • Fiziksel test cihazı kullanıyorsanız bağlantı kablosu
  • Acemi makine öğrenimi bilgileri

Bu eğiticiden nasıl yararlanacaksınız?

Yalnızca okuma Okuyun ve alıştırmaları tamamlayın

Android uygulamaları geliştirme deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

2. Sorun Bildirimi

Her seviyenin sonunda kişiselleştirilmiş uygulama içi satın alma (UİSA) önerileri göstermek isteyen bir oyun geliştirici olduğunuzu varsayalım. Her seferinde yalnızca sınırlı sayıda UİSA seçeneği gösterebilirsiniz ve hangilerinin en iyi dönüşümü sağlayacağını bilemezsiniz. Her kullanıcı ve her oturum farklı olduğunu düşünerek beklenen en yüksek ödülü veren UİSA teklifini nasıl bulmaya çalışırız?

3. Örnek kodu alın

Komut satırından GitHub deposunu klonlayın.

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

Bu depo şunları içeriyor:

  1. Kişiselleştirme modelini eğiten ve TFLite modeli olarak paketleyen bir Jupyter not defteri (.ipynb)
  2. Cihazda tahminde bulunmak için TFLite modelini kullanan örnek bir Kotlin uygulaması

4. Uygulamayı Firebase ile çalıştırın

Bu codelab'de, kurgusal oyun uygulamamız Flappy Sparky'nin UİSA'larını optimize etmek için çalışacağız. Oyunda, oyuncunun Sparky'yi kontrol ettiği ve sütuna çarpmadan duvar sütunları arasında uçmaya çalıştığı bir yana kaydırmalı oyundur. Seviyenin başında, kullanıcıya güç kazandıracak bir UİSA teklifi sunulur. Bu codelab'de uygulamanın yalnızca UİSA optimizasyon kısmını uygulayacağız.

Burada öğrendiklerinizi bir Firebase projesine bağlı kendi uygulamanıza uygulayabileceksiniz. Alternatif olarak, bu codelab için yeni bir Firebase projesi oluşturabilirsiniz. Firebase'i kullanmaya başlama konusunda yardıma ihtiyacınız varsa lütfen bu konuyla ilgili eğiticilerimize göz atın ( Android ve iOS).

5. Uygulamanızda analiz etkinliklerini toplayın

Analytics etkinlikleri, kullanıcı davranışı hakkında bilgi sağlar ve makine öğrenimi modelini eğitmek için kullanılır. Örneğin model, daha uzun süre oynayan kullanıcıların daha fazla can kazanmak için UİSA tamamlama ihtimalinin daha yüksek olduğunu öğrenebilir. ML modelinin bu bilgileri öğrenmek için analiz etkinliklerine ihtiyacı vardır.

Günlüğe kaydetmek isteyebileceğimiz bazı analiz etkinlikleri şunlardır:

  • Kullanıcının oyunu oynadığı süre
  • Kullanıcının ulaştığı seviye
  • Kullanıcının harcadığı jeton sayısı
  • Kullanıcının satın aldığı öğeler

Örnek verileri indirin (İsteğe bağlı)

Aşağıdaki adımlarda, modelimizde kullanmak üzere Analytics etkinliklerini günlüğe kaydetmek için Firebase Analytics'i kullanacağız. Kullanmak istediğiniz analiz verileriniz zaten varsa "Optimizasyon modelini eğitme" bölümüne gidin bölümüne göz atın. Örnek verilerimizi inceleyebilirsiniz.

Firebase Analytics SDK'sı ile Veri Toplama

Bu analiz etkinliklerini toplamak için Firebase Analytics'i kullanırız. Firebase Analytics SDK'sı çeşitli etkinlikleri ve kullanıcı özelliklerini otomatik olarak yakalar. Ayrıca, uygulamanıza özgü etkinlikleri ölçmek için kendi özel etkinliklerinizi tanımlamanıza da olanak tanır.

Firebase Analytics SDK'sını yükleme

Google Analytics'i Kullanmaya Başlama belgelerini izleyerek uygulamanızda Firebase Analytics'i kullanmaya başlayabilirsiniz. Bu codelab'in başında klonlanan firebase-iap-optimization deposu, Firebase Analytics SDK'sını zaten içeriyor.

Özel etkinlikleri günlüğe kaydedin

Firebase Analytics SDK'sını kurduktan sonra, modelimizi eğitmek için ihtiyacımız olan etkinlikleri günlüğe kaydetmeye başlayabiliriz.

Bunu yapmadan önce, Analytics etkinliğinde bir kullanıcı kimliği ayarlamanız önemlidir. Böylece, ilgili kullanıcının analiz verilerini kullanıcının uygulamadaki mevcut verileriyle ilişkilendirebiliriz.

MainActivity.kt

firebaseAnalytics.setUserId("player1")

Daha sonra oyuncu etkinliklerini günlüğe kaydedebiliriz. IAP optimizasyonu için, kullanıcıya sunulan her UİSA teklifini ve bu teklifin kullanıcı tarafından tıklanıp tıklanmadığını günlüğe kaydetmek istiyoruz. Bu işlem bize iki analiz etkinliği kazandırır: offer_iap ve offer_accepted. Ayrıca, bir teklifin kabul edilip edilmediğini görmek amacıyla bu verileri birleştirmek için daha sonra kullanmak amacıyla benzersiz offer_id değerini de tutarız.

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

Özel etkinlikleri günlüğe kaydetmeyle ilgili daha fazla bilgi için Firebase Analytics Günlük Etkinlikleri belgelerini inceleyin.

6. BigQuery'de verileri ön işleme

Son adımda, kullanıcıya hangi UİSA teklifinin sunulduğu ve hangi UİSA teklifinin tıklandığı ile ilgili etkinlikleri topladık. Bu adımda, modelimizin kapsamlı bir görünümden öğrenebilmesi için bu etkinlik verilerini kullanıcı verileriyle birleştireceğiz.

Bunun için öncelikle analiz etkinliklerini BigQuery'ye aktarmamız gerekiyor.

Firebase projenizi ve bu projedeki uygulamaları BigQuery'ye bağlamak için:

  1. Firebase'de oturum açın.
  2. Ayarlar simgesi simgesini tıklayın ve Proje Ayarları'nı seçin.
  3. Proje Ayarları sayfasında Entegrasyonlar sekmesini tıklayın.
  4. BigQuery kartında Bağla'yı tıklayın.

(İsteğe bağlı) Firestore koleksiyonlarınızı BigQuery'ye aktarın

Bu adımda, modeli eğitmeye yardımcı olması için ek kullanıcı verilerini Firestore'dan BigQuery'ye aktarabilirsiniz. Bu adımı şimdilik atlamak istiyorsanız "BigQuery'de veri hazırlama" bölümüne gidin bölümüne göz atın. Son adımda günlüğe kaydedilen Firebase Analytics etkinliklerini inceleyebilirsiniz.

Kullanıcıların depoladığı yer Firestore olabilir kaydolma tarihi, yapılan uygulama içi satın alma işlemleri, oyundaki seviyeler, bakiyedeki paralar veya modeli eğitmek için faydalı olabilecek diğer özellikler.

Firestore koleksiyonlarınızı BigQuery'ye aktarmak için Firestore BigQuery Export Uzantısı'nı yükleyebilirsiniz. Ardından, kişiselleştirme modelinizde ve bu codelab'in geri kalanında kullanmak üzere bu verileri Google Analytics'ten alınan verilerle birleştirmek için BigQuery'de tabloları birleştirin.

BigQuery'de veri hazırlama

Sonraki birkaç adımda, ham analiz verilerimizi modelimizi eğitmek için kullanılabilecek verilere dönüştürmek amacıyla BigQuery'yi kullanacağız.

Modelimizin, kullanıcıya ve oyun durumuna göre hangi UİSA teklifini sunacağını öğrenmesi için aşağıdakiler hakkındaki verileri düzenlememiz gerekir:

  • kullanıcı
  • oyun durumu
  • sunulan teklif
  • Sunulan teklifin tıklanıp tıklanmadığı

Modelimizin işleyebilmesi için tüm bu verilerin tabloda tek bir satırda düzenlenmesi gerekir. Neyse ki BigQuery tam da bunu yapmamıza yardımcı olacak şekilde ayarlanmış.

BigQuery, "görünümler" oluşturmaya olanak tanır kullanmanızı öneririz. Görünüm, bir SQL sorgusu tarafından tanımlanan sanal bir tablodur. Bir görünüm oluşturduğunuzda, bu görünümü, bir tabloyu sorguladığınız şekilde sorgularsınız. Bunu kullanarak önce analiz verilerimizi temizleyebiliriz.

Her bir uygulama içi satın alma fırsatının tıklanıp tıklanmadığını görmek için önceki adımda kaydettiğimiz offer_iap ve offer_accepted etkinliklerine katılmamız gerekir.

all_offers_joined - BigQuery görünümü

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 - BigQuery görünümü

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;

bigQuery veri kümesini Google Cloud Storage'a aktarma

Son olarak, bigquery veri kümesini GCS'ye aktarabilir ve böylece model eğitimimizde kullanabiliriz.

888daa7ba4db8e44.png

14d22bf474fae455.png

7. Optimizasyon modelini eğitme

Örnek veri

Önceki adım olan "BigQuery'de verileri ön işleme" adımındaki verilerinizi kullanın. veya burada sağlanan indirilebilir örnek verileri inceleyerek bu codelab'in diğer bölümleriyle birlikte izleyebilirsiniz.

Sorunun tanımı

Modeli eğitmeye başlamadan önce, içeriğe dayalı slot makinesi sorunumuzu tanımlayarak biraz zaman geçirelim.

İçeriğe dayalı slot makinesi açıklaması

Flappy Sparky'deki her seviyenin başında, kullanıcıya güçlendirme yapacak bir UİSA teklifi sunulur. Her seferinde yalnızca bir UİSA seçeneği gösterilebiliyor ve hangisinin en iyi dönüşüme sahip olacağını bilmiyoruz. Her kullanıcı ve her oturum farklı olduğunu düşünerek beklenen en yüksek ödülü veren UİSA teklifini nasıl bulmaya çalışırız?

Bu durumda, kullanıcı UİSA teklifini kabul etmezse ödülü 0, kabul ederse UİSA değerini de yapalım. Ödülünüzü en üst düzeye çıkarmak amacıyla, geçmiş verilerimizi kullanarak kullanıcıya verilen her işlem için beklenen ödülü tahmin eden bir model eğitebilir ve en yüksek ödülü veren işlemi bulabiliriz.

e7d3264141498bff.jpeg

Tahminde şunları kullanacağız:

  • Durum: Kullanıcı ve mevcut oturumuyla ilgili bilgiler
  • İşlem: Göstermeyi seçebileceğimiz UİSA teklifleri
  • Ödül: UİSA fırsatının değeri

İstismar ve keşif karşılaştırması

Algoritmanın, birden çok slot makinesi problemlerinde keşif (hangi işlemin en iyi sonucu verdiğini öğrenmek için daha fazla veri elde etme) ile kötüye kullanım (en yüksek ödülü elde etmek için optimum sonucu kullanma) arasında bir denge kurması gerekir.

Bizim sorunu sürümünde, modeli bulutta yalnızca düzenli aralıklarla eğitmek ve modeli yalnızca kullanıcının cihazında kullanırken tahminde bulunmak (kullanıcının cihazında eğitim vermek yerine) bunu basitleştireceğiz. Modeli kullandıktan sonra yeterli eğitim verisine sahip olduğumuzdan emin olmak için uygulama kullanıcılarımıza bazen (ör. %30) rastgele sonuçlar göstermemiz gerekir. Keşif ile istismar arasında denge kurmaya yönelik bu stratejiye Epsilon-greedy denir.

Model eğitme

Başlamak için codelab'de sağlanan eğitim komut dosyasını (training.ipynb) kullanabilirsiniz. Amacımız, belirli durumlarda her işlem için beklenen ödülleri tahmin eden bir model eğitmek. Ardından, bize beklenen en yüksek ödülleri veren işlemi buluruz.

Yerel olarak eğitim

Kendi modelinizi eğitmeye başlamanın en kolay yolu, bu codelab'in kod örneğinde not defterinin bir kopyasını oluşturmaktır.

Bu codelab için GPU'ya ihtiyacınız yoktur. Ancak kendi verilerinizi keşfetmek ve kendi modelinizi eğitmek için daha güçlü bir makineye ihtiyacınız varsa eğitiminizi hızlandırmak amacıyla bir AI Platform Notebooks örneği edinebilirsiniz.

Sağlanan eğitim komut dosyasında, BigQuery'den dışa aktardığımız CSV dosyalarından eğitim verileri oluşturan bir iteratör oluşturduk. Ardından verileri kullanarak modelimizi Keras ile eğitmeye başladık. Modelin nasıl eğitileceğiyle ilgili ayrıntıları Python not defterinin yorumlarında bulabilirsiniz.

Model performansını ölçme

Modeli eğitirken, modelimizin gerçekten öğrenip öğrenmediğini görmek için modeli, IAP tekliflerini rastgele seçen rastgele bir temsilciyle karşılaştırırız. Bu mantık ValidationCallback. kapsamındadır

Eğitimin sonunda, modelimizi tekrar test etmek için test.csv uygulamasındaki verileri kullanırız. Model bu verileri daha önce hiç görmediği için sonucun fazla uyum'dan kaynaklanmadığından emin olabiliriz. Bu durumda, model rastgele aracıdan% 28 daha iyi performans gösterir.

TFLite modelini dışa aktarma

Şimdi, eğitilmiş bir modelimiz kullanıma hazır ancak şu anda TensorFlow biçimindedir. Modelin mobil cihazlarda çalıştırılabilmesi için TFLite biçiminde dışa aktarılması gerekir.

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

Buradan modeli indirebilir ve uygulamanızla birlikte paket haline getirebilirsiniz.

İsteğe bağlı olarak, bir üretim uygulaması için modeli Firebase ML'ye dağıtmanızı ve modelinizi Firebase'de barındırmanızı öneririz. Bu, iki ana nedenden dolayı yararlıdır:

  1. Uygulama yükleme boyutunu küçük tutup modeli yalnızca gerektiğinde indirebiliriz.
  2. Model, düzenli olarak ve uygulamanın tamamından farklı bir sürüm döngüsüyle güncellenebilir.

Modeli Firebase ML'ye nasıl dağıtacağınızı öğrenmek için Firebase'i TFLite destekli Android uygulamanıza ekleme codelab'ini inceleyebilirsiniz. Firebase konsolunu veya Python API'yi kullanarak dağıtım yapabilirsiniz.

8. Cihazda tahminde bulunma

Bir sonraki adım, cihazdaki modeli kullanarak tahmin yapmaktır. İndirdiğiniz örnek kodun app klasöründe Firebase ML'den bir model indiren örnek bir uygulama bulabilir ve bu uygulamayı, bazı istemci taraflı verilerle çıkarım yapmak için kullanabilirsiniz.

Model eğitimi sırasında bir miktar ön işleme uyguladığımızdan, cihaz üzerinde çalışırken model girişine de aynı ön işlemeyi uygulamamız gerekir. Bunu yapmanın basit bir yolu, ön işlemenin nasıl yapıldığına ilişkin her özelliğin meta verileri ile haritasını içeren JSON dosyası gibi platformdan ve dilden bağımsız bir biçim kullanmaktır. Örnek uygulamada bunun nasıl yapıldığı konusunda daha ayrıntılı bilgi bulabilirsiniz.

Daha sonra, modele aşağıdaki gibi bir test girişi veririz:

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

Model, sparky_armor ürününün bu kullanıcı için en iyi IAP güçlendirmesi olduğunu gösteriyor.

a3381dbcdbdf811e.png

Model doğruluğunu ölçme

Modellerimizin doğruluğunu ölçmek için, modelimizin tahmin ettiği IAP tekliflerini ve Firebase Analytics kullanılırken tıklanıp tıklanmadıklarını takip edebiliriz. Modelin gerçek performansını ölçmek için bunu Firebase A/B Testi ile birlikte kullanabilirsiniz. Bunu bir adım daha ileri taşıyarak, modelin farklı iterasyonlarında A/B testleri de yapabilirsiniz. Firebase ile A/B testi hakkında daha fazla bilgi edinmek için A/B Testi ile Firebase Remote Config Denemeleri Oluşturma başlıklı belgelere göz atabilirsiniz.

9. (İsteğe bağlı): Modeli düzenli olarak yeni verilerle güncelleme

Yeni veriler geldikçe modelinizi güncellemeniz gerekiyorsa modelinizi yinelenen bir şekilde yeniden eğitmek için bir ardışık düzen oluşturabilirsiniz. Bunu yapmak için öncelikle yukarıda bahsettiğimiz epsilon-greedy stratejisini kullanarak eğitimde kullanacağınız yeni verilere sahip olduğunuzdan emin olmanız gerekir. (ör. zamanın% 70'inde model tahmini kullanılması ve% 30'unda rastgele sonuçlar kullanılması).

Yeni verilerle eğitim ve dağıtım için ardışık düzen yapılandırmak, bu codelab'in kapsamı dışındadır. Başlamak için Google Cloud AI Platform ve TFX'e göz atabilirsiniz.

10. Tebrikler!

Bu codelab'de, Firebase'i kullanarak uygulama içi satın almaları optimize etmek için cihaz üzerinde TFLite modelini nasıl eğiteceğinizi ve dağıtacağınızı öğrendiniz. TFLite ve Firebase hakkında daha fazla bilgi edinmek için diğer TFLite örneklerine ve Firebase başlangıç kılavuzlarına göz atın.

Sorularınız varsa Stack Overflow #firebase-machine-learning adresinde bırakabilirsiniz.

İşlediğimiz konular

  • TensorFlow Lite
  • Firebase ML
  • Firebase Analytics
  • BigQuery

Sonraki adımlar

  • Uygulamanız için bir optimize edici modeli eğitin ve dağıtın.

Daha Fazla Bilgi