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

1. Genel Bakış

1cbf855eda62c306.png

Cihaz üzerinde anlık uygulama içi satın alma optimizasyonu codelab'ine hoş geldiniz. Bu codelab'de, uygulamanızda özel bir kişiselleştirme modelini eğitmek ve dağıtmak için TensorFlow Lite ve Firebase'i nasıl kullanacağınızı öğreneceksiniz.

Bu eğiticide, kişiselleştirme için makine öğrenimi modelinin nasıl oluşturulacağı gösterilmektedir. Özellikle de mevcut kullanıcının bulunduğu duruma göre en uygun uygulama içi satın alma (IAP) teklifini tahmin eden bir modelin nasıl oluşturulacağı gösterilmektedir. Bu, bağlamsal çok kollu haydut problemine bir örnektir. Bu codelab'de hakkında daha fazla bilgi edineceğiniz, önemli ve yaygın olarak uygulanabilen bir makine öğrenimi problemidir.

Neler öğreneceksiniz?

  • Firebase Analytics ile analiz verilerini toplama
  • BigQuery kullanarak analiz verilerini ön işleme
  • Uygulama içi satın alma işlemlerinin (UİSA) cihaz üzerinde optimizasyonu için basit bir ML modeli eğitme
  • TFLite modellerini Firebase ML'ye dağıtma ve uygulamanızdan bu modellere erişme
  • Firebase A/B Testi ile farklı modelleri ölçme ve deneme
  • En son verileri kullanarak yeni modelleri düzenli olarak eğitme ve dağıtma

Gerekenler

  • Android Studio 3.4 veya sonraki bir sürümü
  • Android 2.3 veya sonraki sürümlerin ve Google Play Hizmetleri 9.8 ya da sonraki sürümlerin yüklü olduğu fiziksel bir test cihazı ya da Google Play Hizmetleri 9.8 ya da sonraki sürümlerin yüklü olduğu bir Emulator
  • Fiziksel test cihazı kullanılıyorsa bağlantı kablosu
  • Başlangıç düzeyinde makine öğrenimi bilgisi

Bu eğitimi nasıl kullanacaksınız?

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

Android uygulamaları oluşturma deneyiminizi nasıl değerlendirirsiniz?

Başlangıç Orta İleri

2. Sorun Açıklaması

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

3. Örnek kodu alın

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

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

Bu depoda şunlar bulunur:

  1. Kişiselleştirme modelini eğiten ve TFLite modeline paketleyen bir Jupyter not defteri (.ipynb)
  2. Cihaz üzerinde tahmin yapmak için TFLite modelini kullanan örnek bir Kotlin uygulaması

4. Uygulamayı Firebase ile çalıştırma

Bu codelab'de, kurgusal oyun uygulamamız Flappy Sparky'nin uygulama içi ürünlerini optimize etme üzerinde çalışacağız. Oyun, oyuncunun Sparky'yi kontrol ederek duvar sütunlarına çarpmadan aralarından uçmaya çalıştığı, yandan kaydırmalı bir oyundur. Kullanıcıya, seviyenin başında güçlendirme sağlayacak bir UİSA teklifi sunulur. Bu codelab'de uygulamanın yalnızca IAP optimizasyonu bölümünü uygulayacağız.

Burada öğrendiklerinizi, Firebase projesine bağlı kendi uygulamanıza uygulayabilirsiniz. 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 konudaki eğitimlerimize ( Android ve iOS) göz atın.

5. Uygulamanızda analiz etkinliklerini toplama

Analytics etkinlikleri, kullanıcı davranışları 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 fazladan can almak için uygulama içi satın alma işlemi yapma olasılığının daha yüksek olduğunu öğrenebilir. Makine öğrenimi modelinin bu bilgileri öğrenmesi için giriş olarak 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ığı düzey
  • Kullanıcının harcadığı jeton sayısı
  • Kullanıcının satın aldığı öğeler

Örnek verileri indirme (isteğe bağlı)

Aşağıdaki adımlarda, modelimizde kullanılacak analiz etkinliklerini kaydetmek için Firebase Analytics'i kullanacağız. Kullanmak istediğiniz analiz verileriniz varsa bu codelab'in "Optimizasyon modelini eğitme" bölümüne geçebilir ve örnek verilerimizi kullanarak devam edebilirsiniz.

Firebase Analytics SDK'sı ile Veri Toplama

Bu analiz etkinliklerinin toplanmasına yardımcı olmak için Firebase Analytics'i kullanırız. Firebase Analytics SDK'sı, bir dizi etkinliği ve kullanıcı özelliğini 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 dokümanındaki adımları uygulayarak 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 kaydetme

Firebase Analytics SDK'sını ayarladıktan sonra modelimizi eğitmek için gereken etkinlikleri günlüğe kaydetmeye başlayabiliriz.

Bunu yapmadan önce, ilgili kullanıcının uygulama içindeki mevcut verileriyle analiz verilerini ilişkilendirebilmemiz için analiz etkinliğinde bir kullanıcı kimliği ayarlamamız önemlidir.

MainActivity.kt

firebaseAnalytics.setUserId("player1")

Ardından, oyuncu etkinliklerini günlüğe kaydedebiliriz. Uygulama içi ürün optimizasyonu için kullanıcıya sunulan her uygulama içi ürün teklifini ve kullanıcının bu teklifi tıklayıp tıklamadığını kaydetmek istiyoruz. Bu durumda iki analiz etkinliği (offer_iap ve offer_accepted) elde ederiz. Ayrıca, teklifin kabul edilip edilmediğini görmek için bu verileri daha sonra birleştirebilmemiz amacıyla benzersiz bir offer_id de takip ederiz.

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 kaydetme hakkında daha fazla bilgi için Firebase Analytics Log Events belgelerini inceleyin.

6. BigQuery'de verileri ön işleme

Son adımda, kullanıcıya hangi uygulama içi ürün teklifinin sunulduğu ve kullanıcının hangi uygulama içi ürün teklifini tıkladığıyla ilgili etkinlikleri topladık. Bu adımda, modelimizin eksiksiz bir resimden öğrenebilmesi için bu etkinlik verilerini kullanıcı verileriyle birleştireceğiz.

Bunu yapmak için öncelikle analiz etkinliklerini BigQuery'ye aktarmamız gerekir.

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 aktarma

Bu adımda, modeli eğitmek için kullanmak üzere Firestore'dan BigQuery'ye ek kullanıcı verileri aktarma seçeneğiniz vardır. Bu adımı şimdilik atlamak isterseniz bu codelab'in "BigQuery'de verileri hazırlama" bölümüne geçin. Son adımda kaydedilen Firebase Analytics etkinliklerini takip edebilirsiniz.

Firestore, kullanıcıların kaydolma tarihi, yapılan uygulama içi satın alma işlemleri, oyundaki seviyeler, bakiyedeki jetonlar veya modeli eğitmek için yararlı olabilecek diğer özelliklerin depolandığı yer olabilir.

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

BigQuery'de verileri hazırlama

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

Modelimizin, kullanıcıya ve oyun durumuna göre hangi uygulama içi ürün teklifini sunacağını öğrenmesi için aşağıdaki konularla ilgili verileri düzenlememiz gerekir:

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

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

BigQuery, sorgunuzu düzenli tutmak için "görünümler" oluşturmanıza olanak tanır. Görünüm, SQL sorgusuyla tanımlanan sanal bir tablodur. Görünüm oluşturduğunuzda, tablo sorguladığınız şekilde sorgularsınız. Bunu kullanarak önce analiz verilerimizi temizleyebiliriz.

Her uygulama içi satın alma teklifinin tıklanıp tıklanmadığını görmek için önceki adımda kaydettiğimiz offer_iap ve offer_accepted etkinliklerini birleştirmemiz 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, model eğitimimizde kullanabilmek için BigQuery veri kümesini GCS'ye aktarabiliriz.

888daa7ba4db8e44.png14d22bf474fae455.png

7. Optimizasyon modelini eğitme

Örnek veri

Bu kod laboratuvarının geri kalanını takip etmek için önceki adımda ("BigQuery'de verileri önceden işleme") kullandığınız verileri veya burada sağlanan indirilebilir örnek verileri kullanın.

Sorun tanımı

Modeli eğitmeye başlamadan önce bağlamsal çok kollu haydut problemimizi tanımlayalım.

Bağlamsal çok kollu haydutlar hakkında

Flappy Sparky'deki her seviyenin başında kullanıcıya, güçlendirme sağlayacak bir uygulama içi satın alma teklifi sunulur. Her seferinde yalnızca bir uygulama içi ürün seçeneği gösterebiliriz ve hangisinin en iyi dönüşümü sağlayacağını bilemeyiz. Her kullanıcı ve her oturum farklı olduğundan, en yüksek beklenen ödülü veren uygulama içi satın alma teklifini nasıl bulabiliriz?

Bu durumda, kullanıcı uygulama içi satın alma teklifini kabul etmezse ödül 0, kabul ederse uygulama içi satın alma değeri olsun. Ödülünüzü en üst düzeye çıkarmak için geçmiş verilerimizi kullanarak bir kullanıcıya verilen her işlem için beklenen ödülü tahmin eden bir modeli eğitebilir ve en yüksek ödüle sahip işlemi bulabiliriz.

e7d3264141498bff.jpeg

Tahminde kullanacağımız bilgiler şunlardır:

  • Durum: Kullanıcı ve mevcut oturumuyla ilgili bilgiler
  • İşlem: Göstermeyi seçebileceğimiz uygulama içi ürün teklifleri
  • Ödül: uygulama içi ürün teklifinin değeri

İstismar ve Keşif

Tüm çok kollu makine problemlerinde algoritmanın keşif (hangi işlemin optimum sonucu verdiğini öğrenmek için daha fazla veri elde etme) ve kullanma (en yüksek ödülü elde etmek için optimum sonucu kullanma) arasında denge kurması gerekir.

Sorunun bizim versiyonumuzda, bunu yalnızca modeli bulutta düzenli olarak eğitmek ve modeli kullanıcının cihazında kullanırken tahminler yapmak (kullanıcının cihazında da eğitmek yerine) şeklinde 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 rastgele sonuçlar göstermemiz gerekir (ör. %30). Keşif ve kullanımdan yararlanma arasında denge kurma stratejisine Epsilon-açgözlü denir.

Model eğitme

Başlamak için Codelab ile birlikte verilen eğitim komut dosyasını (training.ipynb) kullanabilirsiniz. Amacımız, bir durum verildiğinde her işlem için beklenen ödülleri tahmin eden bir model eğitmek ve ardından bize en yüksek beklenen ödülleri veren işlemi bulmaktır.

Yerel olarak eğitim

Kendi modelinizi eğitmeye başlamanın en kolay yolu, bu codelab'deki kod örneği için 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 için bir AI Platform Notebook ö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 yineleyici oluşturduk. Ardından, Keras ile modelimizi eğitmeye başlamak için verileri kullandı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, uygulama içi satın alma tekliflerini rastgele seçen rastgele bir temsilciyle karşılaştırırız. Bu mantık ValidationCallback. altında bulunur.

Eğitimin sonunda, modelimizi tekrar test etmek için test.csv içindeki verileri kullanırız. Model bu verileri daha önce hiç görmediğinden sonucun aşırı uyumdan kaynaklanmadığından emin olabiliriz. Bu durumda model, rastgele aracıdan% 28 daha iyi performans gösteriyor.

TFLite modelini dışa aktarma

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

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)

Buradan modeli indirebilir ve uygulamanızla paketleyebilirsiniz.

İsteğe bağlı olarak, üretim uygulaması için modeli Firebase ML'ye dağıtmanızı ve modelinizin Firebase tarafından barındırılmasını öneririz. Bu, iki temel nedenden dolayı yararlıdır:

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

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

8. Cihaz üzerinde tahmin yapma

Bir sonraki adım, cihaz üzerindeki modeli kullanarak tahminler yapmaktır. İndirdiğiniz örnek kodun app klasöründe, Firebase ML'den model indiren bir örnek uygulama bulabilir ve bu uygulamayı kullanarak bazı istemci tarafı verileriyle çıkarım yapabilirsiniz.

Model eğitimi sırasında bazı ön işlemler uyguladığımız için cihaz üzerinde çalıştırırken model girişine aynı ön işlemleri uygulamamız gerekir. Bunu yapmanın basit bir yolu, her özelliğin ön işleme yöntemleriyle ilgili meta verilere eşlendiği bir JSON dosyası gibi platformdan ve dilden bağımsız bir biçim kullanmaktır. Bu işlemin nasıl yapıldığıyla ilgili daha fazla bilgiyi örnek uygulamada bulabilirsiniz.

Ardından, modele aşağıdaki gibi bir test girişi veriyoruz:

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, bu kullanıcı için en iyi UİSA güçlendirmesinin sparky_armor olduğunu öneriyor.

a3381dbcdbdf811e.png

Model doğruluğunu ölçme

Modelimizin doğruluğunu ölçmek için modelimiz tarafından tahmin edilen uygulama içi satın alma tekliflerini ve Firebase Analytics kullanılarak tıklanıp tıklanmadıklarını takip etmemiz yeterlidir. Modelin gerçek performansını ölçmek için bunu Firebase A/B testi ile birlikte kullanabilirsiniz. Bir adım daha ileri giderek modelin farklı yinelemeleri üzerinde de A/B testleri yapabilirsiniz. Firebase ile A/B testi hakkında daha fazla bilgiyi A/B testi ile Firebase Remote Config denemeleri oluşturma dokümanında bulabilirsiniz.

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

Yeni veriler geldikçe modelinizi güncellemeniz gerekiyorsa modelinizi düzenli olarak yeniden eğitmek için bir ardışık düzen oluşturabilirsiniz. Bunu yapmak için öncelikle yukarıda bahsettiğimiz epsilon-açgözlü stratejisini kullanarak eğitimde kullanacağınız yeni verilerinizin olduğundan emin olmanız gerekir. (ör. model tahmin sonucunu% 70, rastgele sonuçları% 30 oranında kullanma)

Yeni verilerle eğitme ve dağıtma için bir ardışık düzen yapılandırma bu codelab'in kapsamı dışındadır. Başlamak için Google Cloud AI Platformu ve TFX'i inceleyebilirsiniz.

10. Tebrikler!

Bu codelab'de, Firebase kullanarak uygulama içi satın alma işlemlerini optimize etmek için cihaz üzerinde TFLite modeli eğitip dağıtmayı öğrendiniz. TFLite ve Firebase hakkında daha fazla bilgi edinmek için diğer TFLite örneklerine ve Firebase'i kullanmaya başlama kılavuzlarına göz atın.

Sorularınızı Stack Overflow #firebase-machine-learning adresinde paylaşabilirsiniz.

İşlediğimiz konular

  • TensorFlow Lite
  • Firebase ML
  • Firebase Analytics
  • BigQuery

Sonraki adımlar

  • Uygulamanız için bir optimizasyon modeli eğitip dağıtın.

Daha Fazla Bilgi