1. Genel Bakış
Gerçek zamanlı cihaz içi uygulama içi satın alma optimizasyonu kod laboratuvarına 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, özellikle mevcut kullanıcının içinde bulunduğu durum göz önüne alındığında en uygun uygulama içi satın alma (IAP) teklifini tahmin eden bir makine öğrenimi modelinin nasıl oluşturulacağı gösterilmektedir. Bu, önemli ve önemli bir bağlamsal haydut sorununun örneğidir. Bu codelab'de hakkında daha fazla bilgi edineceğiniz, yaygın olarak uygulanabilir türde bir makine öğrenimi problemi
Ne öğreneceksin
- Firebase analitiği aracılığıyla analiz verilerini toplayın
- BigQuery'yi 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ğitin
- TFLite modellerini Firebase ML'ye dağıtın ve bunlara uygulamanızdan erişin
- Firebase A/B Testi aracılığıyla farklı modelleri ölçün ve deneyin
- Tekrarlanan bir tempoda en son verileri kullanarak yeni modelleri eğitin ve dağıtın
İhtiyacınız olan şey
- Android Studio sürüm 3.4+
- Android 2.3+ ve Google Play hizmetleri 9.8 veya sonraki sürümlere sahip bir fiziksel test cihazı ya da Google Play hizmetleri 9.8 veya sonraki sürümlere sahip bir Emülatör
- Fiziksel bir test cihazı kullanılıyorsa, bir bağlantı kablosu
- Acemi makine öğrenimi bilgisi
Bu öğreticiyi nasıl kullanacaksınız?
Android uygulamaları oluşturma deneyiminizi nasıl değerlendirirsiniz?
2. Sorun Bildirimi
Her seviyenin sonunda kişiselleştirilmiş uygulama içi satın alma (IAP) önerileri göstermek isteyen bir oyun geliştiricisi olduğunuzu varsayalım. Her seferinde yalnızca sınırlı sayıda IAP seçeneği gösterebilirsiniz ve hangilerinin en iyi dönüşümü sağlayacağını bilemezsiniz. Her kullanıcının ve her oturumun farklı olduğu göz önüne alındığında, beklenen en yüksek ödülü veren IAP teklifini nasıl bulacağız?
3. Örnek kodu alın
GitHub deposunu komut satırından kopyalayın.
git clone https://github.com/googlecodelabs/firebase-iap-optimization.git
Bu depo şunları içerir:
- Kişiselleştirme modelini eğiten ve onu bir TFLite modelinde paketleyen bir Jupyter not defteri (.ipynb)
- Cihazda tahminlerde 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 IAP'lerini optimize etmeye çalışacağız. Oyun, oyuncunun bir Sparky'yi kontrol ettiği ve duvar sütunları arasında onlara çarpmadan uçmaya çalıştığı bir yan kaydırma oyunudur. Seviyenin başında kullanıcıya, kendisine güç verecek bir IAP teklifi sunulur. Bu codelab'de uygulamanın yalnızca IAP optimizasyon bölümü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 konudaki eğitimlerimize bakın ( Android ve iOS ).
5. Uygulamanızda analiz etkinliklerini toplayın
Analytics olayları, kullanıcı davranışına ilişkin öngörü sağlar ve ML modelini eğitmek için kullanılır. Örneğin model, daha uzun süre oynayan kullanıcıların ekstra can kazanmak için IAP yapma olasılığının daha yüksek olduğunu öğrenebilir. ML modelinin bu bilgiyi öğrenmek için girdi olarak analiz olaylarına ihtiyacı vardır.
Günlüğe kaydetmek isteyebileceğimiz bazı analiz etkinlikleri şunları içerir:
- Kullanıcının oyunu ne kadar süre oynadığı
- Kullanıcının hangi seviyeye ulaştığı
- Kullanıcının harcadığı para miktarı
- Kullanıcının hangi ürünleri satın aldığı
Örnek verileri indirin (İsteğe bağlı)
Aşağıdaki adımlarda, modelimizde kullanılacak analiz olaylarını günlüğe kaydetmek için Firebase Analytics'i kullanacağız. Zaten kullanmak istediğiniz analiz verileriniz varsa bu codelab'in "Optimizasyon modelini eğitme" bölümüne geçin ve örnek verilerimizi takip edebilirsiniz.
Firebase Analytics SDK'sıyla Veri Toplayın
Bu analiz etkinliklerinin toplanmasına yardımcı olması için Firebase Analytics'i kullanacağı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'yı yükleme
Google Analytics'e Başlayın belgelerini takip ederek uygulamanızda Firebase Analytics'i kullanmaya başlayabilirsiniz. Bu codelab'in başında klonlanan firebase-iap-optimization
deposu zaten Firebase Analytics SDK'sını içeriyor.
Özel etkinlikleri günlüğe kaydet
Firebase Analytics SDK'yı kurduktan sonra modelimizi eğitmek için ihtiyacımız olan olayları kaydetmeye başlayabiliriz.
Bunu yapmadan önce, analiz etkinliğinde bir kullanıcı kimliği belirlemek önemlidir; böylece söz konusu kullanıcıya ait analiz verilerini, uygulamadaki mevcut verilerle ilişkilendirebiliriz.
MainActivity.kt
firebaseAnalytics.setUserId("player1")
Daha sonra oyuncu etkinliklerini günlüğe kaydedebiliriz. IAP optimizasyonu için, kullanıcıya sunulan her IAP teklifini ve bu teklifin kullanıcı tarafından tıklanıp tıklanmadığını kaydetmek istiyoruz. Bu bize iki analiz olayı verecektir - offer_iap
ve offer_accepted
. Ayrıca benzersiz bir teklif_id'sini de takip edeceğiz, böylece daha sonra bir teklifin kabul edilip edilmediğini görmek amacıyla bu verileri birleştirmek için bunu kullanabiliriz.
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 Günlük Olayları belgelerini ziyaret edin.
6. BigQuery'de verileri ön işleme
Son adımda kullanıcıya hangi IAP teklifinin sunulduğu ve kullanıcı tarafından hangi IAP teklifinin tıklandığı ile ilgili olayları topladık. Bu adımda, modelimizin tam bir resimden öğrenebilmesi için bu etkinlik verilerini kullanıcı verileriyle birleştireceğiz.
Bunu yapmak için analiz etkinliklerini BigQuery'ye aktararak başlamamız gerekecek.
Firebase projenizi BigQuery'ye bağlayın
Firebase projenizi ve uygulamalarını BigQuery'ye bağlamak için:
- Firebase'de oturum açın.
- Tıklamak ve ardından Proje Ayarları'nı seçin.
- Proje Ayarları sayfasında Entegrasyonlar sekmesine tıklayın.
- BigQuery kartında Bağlantı'ya tıklayın.
(İsteğe bağlı) Firestore koleksiyonlarınızı BigQuery'ye aktarın
Bu adımda, modelin eğitilmesine yardımcı olması amacıyla ek kullanıcı verilerini Firestore'dan BigQuery'ye aktarma seçeneğiniz vardır. Şimdilik bu adımı atlamak istiyorsanız bu codelab'in "BigQuery'de veri hazırlama" bölümüne geçin ve son adımda kaydedilen Firebase Analytics etkinliklerini takip edebilirsiniz.
Firestore, kullanıcıların kayıt tarihini, yapılan uygulama içi satın alma işlemlerini, oyundaki seviyeleri, bakiyedeki paraları veya modelin eğitilmesinde yararlı olabilecek diğer özellikleri depoladığınız yer olabilir.
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 verileriyle birleştirmek için BigQuery'deki tabloları birleştirin .
BigQuery'de veri hazırlama
Sonraki birkaç adımda ham analiz verilerimizi modelimizin eğitimi için kullanılabilecek verilere dönüştürmek için BigQuery'yi kullanacağız.
Modelimizin kullanıcıya ve oyun durumuna göre hangi IAP teklifini sunacağını öğrenmesi için aşağıdakilerle ilgili verileri düzenlememiz gerekiyor:
- Kullanıcı
- oyun durumu
- sunulan teklif
- sunulan teklifin tıklanıp tıklanmadığı
Modelimizin işleyebilmesi için tüm bu verilerin bir tabloda tek bir satırda düzenlenmesi gerekecektir. Neyse ki BigQuery tam da bunu yapmamıza yardımcı olacak şekilde kuruldu.
BigQuery, sorgunuzu düzenli tutmak için "görünümler" oluşturmanıza olanak tanır. Görünüm, bir SQL sorgusu tarafından tanımlanan sanal bir tablodur. Bir görünüm oluşturduğunuzda, onu bir tabloyu sorguladığınız gibi sorgularsınız. Bunu kullanarak ilk önce analitik verilerimizi temizleyebiliriz.
Her uygulama içi satın alma teklifinin tıklanıp tıklanmadığını görmek için önceki adımda oturum açtığımız offer_iap
ve offer_accepted
etkinliklerine katılmamız gerekecek.
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 aktarın
Son olarak bigquery veri setini GCS’ye aktarıp model eğitimimizde kullanabiliriz.
7. Optimizasyon modelini eğitin
Örnek veri
Bu codelab'in geri kalanıyla birlikte takip etmek için "BigQuery'de verileri ön işleme" adlı önceki adımdaki verilerinizi veya burada sağlanan indirilebilir örnek verileri kullanın.
Problem tanımı
Modeli eğitmeye başlamadan önce, bağlamsal eşkıya sorunumuzu tanımlamaya biraz zaman ayıralım.
Bağlamsal haydutlar açıklandı
Flappy Sparky'de her seviyenin başında kullanıcıya, kendisine güç kazandıracak bir IAP teklifi sunulur. Her seferinde yalnızca bir IAP seçeneği gösterebiliyoruz ve hangilerinin en iyi dönüşümü sağlayacağını bilmiyoruz. Her kullanıcının ve her oturumun farklı olduğu göz önüne alındığında, beklenen en yüksek ödülü veren IAP teklifini nasıl bulacağız?
Bu durumda kullanıcı IAP teklifini kabul etmezse ödülü 0, kabul ederse IAP değerini yapalım. Ödülünüzü en üst düzeye çıkarmaya çalışmak için, kullanıcıya verilen her eylem için beklenen ödülü tahmin eden bir model eğitmek ve en yüksek ödüle sahip eylemi bulmak için geçmiş verilerimizi kullanabiliriz.
Tahminde kullanacağımız şey şudur:
- Durum: kullanıcı ve mevcut oturumu hakkında bilgi
- Eylem: Göstermeyi seçebileceğimiz IAP teklifleri
- Ödül: IAP teklifinin değeri
Sömürü ve Keşif
Tüm çok kollu haydut sorunları için, algoritmanın keşif (hangi eylemin en iyi sonucu verdiğini öğrenmek için daha fazla veri elde etmek) ile istismar (en yüksek ödülü elde etmek için en iyi sonucu kullanmak) arasında denge kurması gerekir.
Sorunun bizim versiyonumuzda, modeli yalnızca periyodik olarak bulutta eğitmek ve yalnızca modeli kullanıcının cihazında kullanırken (kullanıcının cihazında eğitimin aksine) tahminler yapmak için bunu basitleştireceğiz. Modeli kullandıktan sonra yeterli eğitim verisine sahip olduğumuzdan emin olmak için bazen uygulama kullanıcılarımıza rastgele sonuçlar göstermemiz gerekir (örneğin %30). Keşif ve sömürüyü dengelemeye yönelik bu stratejiye Epsilon açgözlülüğü denir.
Modeli eğitmek
Başlamak için codelab ile birlikte sağlanan eğitim komut dosyasını ( training.ipynb
) kullanabilirsiniz. Amacımız, belirli bir durum için her eylem için beklenen ödülleri tahmin eden bir model geliştirmek, ardından bize beklenen en yüksek ödülleri veren eylemi bulmaktır.
Yerel olarak eğitim
Kendi modelinizi eğitmeye başlamanın en kolay yolu, bu codelab için kod örneğindeki not defterinin bir kopyasını oluşturmaktır.
Bu codelab için GPU'ya ihtiyacınız yok 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 alabilirsiniz.
Sağlanan eğitim komut dosyasında BigQuery'den dışa aktardığımız CSV dosyalarından eğitim verileri üreten bir yineleyici oluşturduk. Daha sonra modelimizi Keras ile eğitmeye başlamak için verileri kullandık. Modelin nasıl eğitileceğine ilişkin ayrıntılar Python not defterinin yorumlarında bulunabilir.
Model performansını ölçün
Modeli eğitirken, modelimizin gerçekten öğrenip öğrenmediğini görmek için onu IAP tekliflerini rastgele seçen rastgele bir aracıyla karşılaştıracağız. Bu mantık ValidationCallback
altında yaşar .
Eğitimin sonunda modelimizi tekrar test etmek için test.csv
verileri kullanıyoruz. Model bu verileri daha önce hiç görmediğinden sonucun aşırı uyumdan kaynaklanmadığından emin olabiliriz. Bu durumda model rastgele ajana göre %28 daha iyi performans göstermektedir.
TFLite modelini dışa aktarma
Şu anda TensorFlow formatında olması dışında, artık kullanıma hazır eğitimli bir modelimiz var. Mobil cihazlarda çalıştırılabilmesi için modeli TFLite formatında dışa aktarmamız gerekecek.
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 modeli uygulamanızla birlikte paketleyebilirsiniz.
İsteğe bağlı olarak, bir üretim uygulaması için modeli Firebase ML'ye dağıtmanızı ve modelinizi Firebase'in barındırmasını öneririz. Bu iki ana nedenden dolayı faydalıdır:
- Uygulama yükleme boyutunu küçük tutabilir ve modeli yalnızca ihtiyaç duyulduğunda indirebiliriz
- 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 Uygulama kod laboratuvarınıza ekleme bölümünü takip edebilirsiniz. Firebase konsolunu veya Python API'sini kullanarak dağıtım yapma seçeneğiniz vardır.
8. Cihaz üzerinde tahminlerde bulunmak
Bir sonraki adım, cihazdaki modeli kullanarak tahminler yapmaktır. İndirdiğiniz örnek kodun app
klasöründe Firebase ML'den model indiren örnek bir uygulama bulabilir ve bunu bazı istemci tarafı verilerle çıkarım yapmak için kullanabilirsiniz.
Model eğitimi sırasında bazı ön işlemeler uyguladığımız için, aynı ön işlemeyi cihazda çalıştırırken model girişine de uygulamamız gerekecek. Bunu yapmanın basit bir yolu, ön işlemenin nasıl yapıldığına ilişkin meta verilere kadar her özelliğin haritasını içeren JSON dosyası gibi platformdan ve dilden bağımsız bir format kullanmaktır. Örnek uygulamada bunun nasıl yapıldığına ilişkin daha fazla ayrıntı bulabilirsiniz.
Daha sonra 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, sparky_armor
bu kullanıcı için en iyi IAP güçlendirmesi olduğunu öne sürüyor.
Model doğruluğunu ölçün
Modelimizin doğruluğunu ölçmek için, modelimiz tarafından tahmin edilen IAP tekliflerini ve Firebase Analytics kullanılarak bunlara tıklanıp tıklanmadığını takip edebiliriz. Modelin gerçek performansını ölçmek için bunu Firebase A/B testiyle birlikte kullanabilirsiniz. Bir adım daha ileri giderek, modelin farklı yinelemelerinde A/B testleri de gerçekleştirebilirsiniz. Firebase ile A/B testi hakkında daha fazla bilgiyi A/B Testi ile Firebase Uzaktan Yapılandırma Deneyleri Oluşturma belgelerinde bulabilirsiniz.
9. (İsteğe Bağlı): Modelin düzenli olarak yeni verilerle güncellenmesi
Yeni veriler geldikçe modelinizi güncellemeniz gerekiyorsa modelinizi düzenli aralıklarla 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ğitim için kullanacağınız yeni verilere sahip olduğunuzdan emin olmanız gerekir. (örn. %70 oranında model tahmin sonucunun kullanılması ve %30 oranında rastgele sonuçların kullanılması).
Yeni verilerle eğitim ve dağıtım için bir 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 kullanarak uygulama içi satın alma işlemlerini optimize etmek için cihazdaki bir 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 bunları Stack Overflow #firebase-machine-learning adresinde bırakabilirsiniz.
Neleri ele aldık?
- TensorFlow Lite
- Firebase ML
- Firebase Analizi
- Büyük Sorgu
Sonraki adımlar
- Uygulamanız için bir optimize edici modeli eğitin ve dağıtın.