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

1. Genel Bakış

1cbf855eda62c306.png

Cihaz üzerinde gerçek zamanlı uygulama içi satın alma optimizasyonu codelab'ine hoş geldiniz. Bu codelab'de, TensorFlow Lite ve Firebase'i kullanarak uygulamanızda özel bir kişiselleştirme modelini nasıl eğiteceğinizi ve dağıtacağınızı öğreneceksiniz.

Bu eğiticide, kişiselleştirme için makine öğrenimi modeli oluşturma, ö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 model oluşturma gösterilmektedir. Bu, bağlamsal çok kollu haydut problemine bir örnektir. Bu önemli ve yaygın olarak uygulanabilen makine öğrenimi problemi türü hakkında daha fazla bilgiyi bu codelab'de bulabilirsiniz.

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 sürümler
  • 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ı veya 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
  • Makine öğrenimi konusunda başlangıç düzeyinde bilgi

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

Sadece 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 geçmeye çalıştığı, yandan kaydırmalı bir oyundur. Seviyenin başında kullanıcıya, güçlendirme sağlayacak bir UİSA teklifi sunulur. Bu codelab'de yalnızca uygulamanın 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 ekstra can almak için UİSA 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 ne kadar süreyle oynadığı
  • 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 kod laboratuvarının 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 analiz verilerini uygulamadaki mevcut verileriyle 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 bu teklifin kullanıcı tarafından tıklanıp tıklanmadığını günlüğe 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 edeceğiz.

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 Etkinlikleri Günlüğe Kaydetme 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 kayıt tarihi, 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

İlerleyen adımlarda, 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 teklifinin sunulacağını öğrenmesi için aşağıdakilerle 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.png

14d22bf474fae455.png

7. Optimizasyon modelini eğitme

Örnek veri

Bu codelab'in geri kalanını takip etmek için önceki adımda ("BigQuery'de verileri ön 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 hangilerinin 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 ürün teklifini kabul etmezse ödül 0, kabul ederse uygulama içi ürün 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 satın alma teklifinin değeri

İstismar ve keşif

Tüm çok kollu haydut 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, modeli yalnızca bulutta periyodik olarak eğitmek ve modeli kullanıcının cihazında kullanırken yalnızca tahmin yapmak (kullanıcının cihazında da eğitmek yerine) için 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 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, belirli bir durumda 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 verme

Kendi modelinizi eğitmeye başlamanın en kolay yolu, bu codelab'in kod örneğindeki 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ğitim sürecinizi 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, modelimizi Keras ile 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'de barındırılmasını öneririz. Bu durum 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 nasıl dağıtacağınızı öğ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 oluşturmaktı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 işleminin nasıl yapıldığıyla 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'i kullanarak 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 işlem hattı 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 işlem hattı 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ğitin ve dağıtın.

Daha Fazla Bilgi