1. Übersicht
Willkommen im Codelab zur Echtzeit-In-App-Kaufoptimierung auf dem Gerät. In diesem Codelab erfahren Sie, wie Sie mit TensorFlow Lite und Firebase ein benutzerdefiniertes Personalisierungsmodell trainieren und für Ihre App bereitstellen.
Dieses Tutorial zeigt, wie man ein maschinelles Lernmodell für die Personalisierung erstellt, insbesondere eines, das das optimale In-App-Kaufangebot (IAP) anhand eines Zustands vorhersagt, in dem sich der aktuelle Benutzer befindet. Dies ist ein Beispiel für ein kontextbezogenes Bandit-Problem, ein wichtiges und wichtiges Problem weit verbreitetes maschinelles Lernproblem, über das Sie in diesem Codelab mehr erfahren
Was Sie lernen werden
- Sammeln Sie Analysedaten über Firebase Analytics
- Analysedaten mit BigQuery vorverarbeiten
- Trainieren Sie ein einfaches ML-Modell für die On-Device-Optimierung von In-App-Käufen (IAPs)
- Stellen Sie TFLite-Modelle in Firebase ML bereit und greifen Sie über Ihre App darauf zu
- Messen und experimentieren Sie mit verschiedenen Modellen über Firebase A/B Testing
- Trainieren und implementieren Sie neue Modelle mit den neuesten Daten in regelmäßigen Abständen
Was du brauchen wirst
- Android Studio-Version 3.4+
- Ein physisches Testgerät mit Android 2.3+ und Google Play-Diensten 9.8 oder höher oder ein Emulator mit Google Play-Diensten 9.8 oder höher
- Bei Verwendung eines physischen Testgeräts ein Verbindungskabel
- ML-Kenntnisse für Anfänger
Wie werden Sie dieses Tutorial nutzen?
Wie würden Sie Ihre Erfahrungen mit der Entwicklung von Android-Apps bewerten?
2. Problemstellung
Nehmen wir an, Sie sind ein Spieleentwickler, der am Ende jedes Levels personalisierte Vorschläge für In-App-Käufe (IAP) anzeigen möchte. Sie können jedes Mal nur eine begrenzte Anzahl von IAP-Optionen anzeigen und wissen nicht, welche die beste Conversion erzielen. Da jeder Benutzer und jede Sitzung anders ist, wie finden wir das IAP-Angebot, das die höchste erwartete Belohnung bringt?
3. Holen Sie sich den Beispielcode
Klonen Sie das GitHub-Repository über die Befehlszeile.
git clone https://github.com/googlecodelabs/firebase-iap-optimization.git
Dieses Repo enthält:
- Ein Jupyter-Notebook (.ipynb), das das Personalisierungsmodell trainiert und in ein TFLite-Modell verpackt
- Eine Beispiel-Kotlin-App, die das TFLite-Modell verwendet, um Vorhersagen auf dem Gerät zu treffen
4. Führen Sie die App mit Firebase aus
In diesem Codelab werden wir an der Optimierung der IAPs unserer fiktiven Spiele-App Flappy Sparky arbeiten. Das Spiel ist ein Side-Scroller-Spiel, bei dem der Spieler einen Sparky steuert und versucht, zwischen Mauersäulen hindurchzufliegen, ohne sie zu treffen. Zu Beginn des Levels wird dem Benutzer ein IAP-Angebot präsentiert, das ihm ein Power-Up verschafft. In diesem Codelab implementieren wir nur den IAP-Optimierungsteil der App.
Sie können das hier Gelernte auf Ihre eigene App anwenden, die mit einem Firebase-Projekt verbunden ist. Alternativ können Sie ein neues Firebase-Projekt für dieses Codelab erstellen. Wenn Sie Hilfe beim Einstieg in Firebase benötigen, sehen Sie sich bitte unsere Tutorials zu diesem Thema an ( Android und iOS ).
5. Sammeln Sie Analyseereignisse in Ihrer App
Analytics-Ereignisse bieten Einblicke in das Benutzerverhalten und werden zum Trainieren des ML-Modells verwendet. Beispielsweise kann das Modell lernen, dass Benutzer, die länger spielen, mit größerer Wahrscheinlichkeit einen IAP tätigen, um zusätzliche Leben zu erhalten. Das ML-Modell benötigt Analyseereignisse als Eingabe, um diese Informationen zu lernen.
Zu den Analyseereignissen, die wir möglicherweise protokollieren möchten, gehören:
- Wie lange der Benutzer das Spiel spielt
- Welches Level der Benutzer erreicht
- Wie viele Münzen gibt der Benutzer aus?
- Welche Artikel der Benutzer kauft
Beispieldaten herunterladen (optional)
In den folgenden Schritten verwenden wir Firebase Analytics, um Analyseereignisse zur Verwendung in unserem Modell zu protokollieren. Wenn Sie bereits über Analysedaten verfügen, die Sie verwenden möchten, springen Sie zum Abschnitt „Trainieren Sie das Optimierungsmodell“ dieses Codelabs und Sie können mit unseren Beispieldaten weitermachen.
Sammeln Sie Daten mit dem Firebase Analytics SDK
Wir werden Firebase Analytics verwenden, um diese Analyseereignisse zu erfassen. Das Firebase Analytics SDK erfasst automatisch eine Reihe von Ereignissen und Benutzereigenschaften. Außerdem können Sie Ihre eigenen benutzerdefinierten Ereignisse definieren, um die Ereignisse zu messen, die für Ihre App einzigartig sind.
Firebase Analytics SDK installieren
Sie können mit Firebase Analytics in Ihrer App beginnen, indem Sie der Dokumentation „Erste Schritte mit Google Analytics“ folgen. Das zu Beginn dieses Codelabs geklonte firebase-iap-optimization
Repository enthält bereits das Firebase Analytics SDK.
Benutzerdefinierte Ereignisse protokollieren
Nachdem wir das Firebase Analytics SDK eingerichtet haben, können wir mit der Protokollierung der Ereignisse beginnen, die wir zum Trainieren unseres Modells benötigen.
Bevor wir das tun, ist es wichtig, im Analyseereignis eine Benutzer-ID festzulegen , damit wir Analysedaten für diesen Benutzer mit seinen vorhandenen Daten in der App verknüpfen können.
MainActivity.kt
firebaseAnalytics.setUserId("player1")
Als nächstes können wir Spielerereignisse protokollieren. Zur IAP-Optimierung möchten wir jedes dem Benutzer präsentierte IAP-Angebot protokollieren und ob der Benutzer auf dieses Angebot klickt. Dadurch erhalten wir zwei Analyseereignisse – offer_iap
und offer_accepted
. Wir verfolgen auch eine eindeutige Angebots-ID, damit wir diese später zum Kombinieren dieser Daten verwenden können, um zu sehen, ob ein Angebot angenommen wird.
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)
}
}
Weitere Informationen zum Protokollieren benutzerdefinierter Ereignisse finden Sie in der Dokumentation zu Firebase Analytics-Protokollereignissen .
6. Daten in BigQuery vorverarbeiten
Im letzten Schritt haben wir Ereignisse darüber gesammelt, welches IAP-Angebot dem Nutzer präsentiert wird und welches IAP-Angebot vom Nutzer angeklickt wird. In diesem Schritt kombinieren wir diese Ereignisdaten mit Benutzerdaten, damit unser Modell aus einem vollständigen Bild lernen kann.
Dazu müssen wir zunächst die Analyseereignisse nach BigQuery exportieren.
Verknüpfen Sie Ihr Firebase-Projekt mit BigQuery
So verknüpfen Sie Ihr Firebase-Projekt und seine Apps mit BigQuery:
- Melden Sie sich bei Firebase an.
- Klicken , und wählen Sie dann Projekteinstellungen aus.
- Klicken Sie auf der Seite „Projekteinstellungen“ auf die Registerkarte „Integrationen“.
- Klicken Sie auf der BigQuery-Karte auf „Link“.
(Optional) Exportieren Sie Ihre Firestore-Sammlungen nach BigQuery
In diesem Schritt haben Sie die Möglichkeit, zusätzliche Benutzerdaten aus Firestore nach BigQuery zu exportieren, um sie zum Trainieren des Modells zu verwenden. Wenn Sie diesen Schritt vorerst überspringen möchten, fahren Sie mit dem Abschnitt „Daten in BigQuery vorbereiten“ dieses Codelabs fort und können die im letzten Schritt protokollierten Firebase Analytics-Ereignisse verfolgen.
Im Firestore haben Sie möglicherweise das Anmeldedatum der Benutzer, getätigte In-App-Käufe, Level im Spiel, Münzen auf dem Kontostand oder andere Attribute gespeichert, die beim Training des Modells nützlich sein könnten.
Um Ihre Firestore-Sammlungen nach BigQuery zu exportieren, können Sie die Firestore BigQuery-Exporterweiterung installieren. Verknüpfen Sie dann Tabellen in BigQuery , um diese Daten mit den Daten von Google Analytics zu kombinieren, um sie in Ihrem Personalisierungsmodell und im Rest dieses Codelabs zu verwenden.
Daten in BigQuery vorbereiten
In den nächsten Schritten werden wir BigQuery verwenden, um unsere Rohanalysedaten in Daten umzuwandeln, die für das Training unseres Modells verwendet werden können.
Damit unser Modell lernen kann, welches IAP-Angebot basierend auf dem Benutzer und dem Spielstatus präsentiert werden soll, müssen wir Daten zu Folgendem organisieren:
- der Benutzer
- der Spielstatus
- das vorgelegte Angebot
- ob das angezeigte Angebot angeklickt wird oder nicht
Alle diese Daten müssen in einer einzigen Zeile einer Tabelle organisiert werden, damit unser Modell sie verarbeiten kann. Glücklicherweise ist BigQuery so eingerichtet, dass es uns dabei hilft.
Mit BigQuery können Sie „Ansichten“ erstellen, um Ihre Abfrage zu organisieren. Eine Ansicht ist eine virtuelle Tabelle, die durch eine SQL-Abfrage definiert wird. Wenn Sie eine Ansicht erstellen, fragen Sie sie auf die gleiche Weise ab wie eine Tabelle. Damit können wir zunächst unsere Analysedaten bereinigen.
Um zu sehen, ob auf jedes In-App-Kaufangebot geklickt wird, müssen wir die Ereignisse offer_iap
und offer_accepted
verknüpfen, die wir im vorherigen Schritt protokolliert haben.
all_offers_joined – BigQuery-Ansicht
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-Ansicht
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-Datensatz in Google Cloud Storage exportieren
Schließlich können wir den BigQuery-Datensatz nach GCS exportieren , damit wir ihn in unserem Modelltraining verwenden können.
7. Trainieren Sie das Optimierungsmodell
Beispieldaten
Verwenden Sie entweder Ihre Daten aus dem vorherigen Schritt „Daten in BigQuery vorverarbeiten“ oder die hier bereitgestellten herunterladbaren Beispieldaten, um den Rest dieses Codelabs zu verfolgen.
Problem Definition
Bevor wir mit dem Training des Modells beginnen, sollten wir uns etwas Zeit nehmen, um unser kontextbezogenes Banditenproblem zu definieren.
Kontextuelle Banditen erklärt
Zu Beginn jedes Levels in Flappy Sparky wird dem Benutzer ein IAP-Angebot präsentiert, das ihm ein Power-Up verschafft. Wir können jedes Mal nur eine IAP-Option anzeigen und wissen nicht, welche die beste Conversion erzielt. Da jeder Benutzer und jede Sitzung anders ist, wie finden wir das IAP-Angebot, das die höchste erwartete Belohnung bringt?
In diesem Fall setzen wir die Belohnung auf 0, wenn der Benutzer das IAP-Angebot nicht annimmt, und den IAP-Wert, wenn er dies tut. Um zu versuchen, Ihre Belohnung zu maximieren, können wir anhand unserer historischen Daten ein Modell trainieren, das die erwartete Belohnung für jede Aktion eines Benutzers vorhersagt und die Aktion mit der höchsten Belohnung findet.
Folgendes werden wir in der Vorhersage verwenden:
- Status: Informationen über den Benutzer und seine aktuelle Sitzung
- Aktion: IAP-Angebote, die wir anzeigen können
- Belohnung: Wert des IAP-Angebots
Ausbeutung vs. Erkundung
Bei allen Problemen mit mehrarmigen Banditen muss der Algorithmus ein Gleichgewicht zwischen Erkundung (Beschaffung weiterer Daten, um herauszufinden, welche Aktion das optimale Ergebnis liefert) und Ausbeutung (Verwendung des optimalen Ergebnisses, um die höchste Belohnung zu erhalten) herstellen.
In unserer Version des Problems werden wir dies vereinfachen, indem wir das Modell nur regelmäßig in der Cloud trainieren und Vorhersagen nur dann treffen, wenn das Modell auf dem Gerät des Benutzers verwendet wird (im Gegensatz zum Training auch auf dem Gerät des Benutzers). Um sicherzustellen, dass wir nach der Verwendung des Modells über ausreichende Trainingsdaten verfügen, müssen wir unseren App-Benutzern manchmal (z. B. 30 %) zufällige Ergebnisse zeigen. Diese Strategie, Exploration und Ausbeutung in Einklang zu bringen, wird als Epsilon-Greedy bezeichnet.
Trainieren des Modells
Sie können zum Einstieg das mit dem Codelab bereitgestellte Trainingsskript ( training.ipynb
) verwenden. Unser Ziel ist es, ein Modell zu trainieren, das die erwarteten Belohnungen für jede Aktion in einem bestimmten Zustand vorhersagt. Anschließend finden wir die Aktion, die uns die höchsten erwarteten Belohnungen bringt.
Ausbildung vor Ort
Der einfachste Weg, mit dem Training Ihres eigenen Modells zu beginnen, besteht darin, eine Kopie des Notizbuchs im Codebeispiel für dieses Codelab zu erstellen.
Für dieses Codelab benötigen Sie keine GPU. Wenn Sie jedoch eine leistungsstärkere Maschine benötigen, um Ihre eigenen Daten zu untersuchen und Ihr eigenes Modell zu trainieren, können Sie eine AI Platform Notebook-Instanz erwerben, um Ihr Training zu beschleunigen.
Im bereitgestellten Trainingsskript haben wir einen Iterator erstellt, der Trainingsdaten aus den CSV-Dateien generiert, die wir aus BigQuery exportiert haben. Anschließend nutzten wir die Daten, um mit dem Training unseres Modells mit Keras zu beginnen. Einzelheiten zum Trainieren des Modells finden Sie in den Kommentaren des Python-Notizbuchs.
Messen Sie die Modellleistung
Während wir das Modell trainieren, vergleichen wir es mit einem zufälligen Agenten, der IAP-Angebote zufällig auswählt, um zu sehen, ob unser Modell tatsächlich lernt. Diese Logik befindet sich unter ValidationCallback
.
Am Ende des Trainings verwenden wir die Daten in test.csv
, um unser Modell erneut zu testen. Das Modell hat diese Daten noch nie zuvor gesehen, daher können wir sicher sein, dass das Ergebnis nicht auf eine Überanpassung zurückzuführen ist. In diesem Fall schneidet das Modell um 28 % besser ab als der Zufallsagent.
Exportieren Sie das TFLite-Modell
Jetzt haben wir ein trainiertes Modell, das wir verwenden können, allerdings liegt es derzeit im TensorFlow-Format vor. Wir müssen das Modell im TFLite- Format exportieren, damit es auf mobilen Geräten ausgeführt werden kann.
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)
Von hier aus können Sie das Modell herunterladen und mit Ihrer App bündeln.
Optional empfehlen wir für eine Produktions-App, dass Sie das Modell in Firebase ML bereitstellen und Ihr Modell von Firebase hosten lassen. Dies ist aus zwei Hauptgründen nützlich:
- Wir können die Installationsgröße der App klein halten und das Modell nur bei Bedarf herunterladen
- Das Modell kann regelmäßig und mit einem anderen Release-Zyklus als die gesamte App aktualisiert werden
Um zu erfahren, wie Sie das Modell in Firebase ML bereitstellen, können Sie dem Codelab „Firebase zu Ihrer TFLite-basierten Android-App hinzufügen“ folgen. Sie haben die Möglichkeit, die Bereitstellung über die Firebase-Konsole oder die Python-API durchzuführen.
8. Vorhersagen auf dem Gerät treffen
Der nächste Schritt besteht darin, mithilfe des Modells auf dem Gerät Vorhersagen zu treffen. Sie finden eine Beispiel-App, die ein Modell von Firebase ML herunterlädt, im app
Ordner des heruntergeladenen Beispielcodes und können diese verwenden, um Rückschlüsse auf einige clientseitige Daten zu ziehen.
Da wir während des Modelltrainings eine gewisse Vorverarbeitung durchgeführt haben, müssen wir bei der Ausführung auf dem Gerät dieselbe Vorverarbeitung auf die Modelleingabe anwenden. Eine einfache Möglichkeit hierfür ist die Verwendung eines plattform- und sprachunabhängigen Formats, beispielsweise einer JSON-Datei, die eine Zuordnung aller Features zu Metadaten darüber enthält, wie die Vorverarbeitung durchgeführt wird. Genaueres dazu finden Sie in der Beispiel-App.
Als nächstes geben wir dem Modell eine Testeingabe wie folgt:
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"
)
Das Modell legt nahe, dass sparky_armor
das beste IAP-Powerup für diesen bestimmten Benutzer ist.
Modellgenauigkeit messen
Um die Genauigkeit unseres Modells zu messen, können wir mithilfe von Firebase Analytics einfach die von unserem Modell vorhergesagten IAP-Angebote verfolgen und prüfen, ob sie angeklickt werden. Sie können dies zusammen mit Firebase A/B-Tests verwenden, um die tatsächliche Leistung des Modells zu messen. Um noch einen Schritt weiter zu gehen, können Sie auch A/B-Tests für verschiedene Iterationen des Modells durchführen. Weitere Informationen zu A/B-Tests mit Firebase finden Sie in der Dokumentation „Firebase-Remote-Konfigurationsexperimente mit A/B-Tests erstellen“ .
9. (Optional): Modell regelmäßig mit neuen Daten aktualisieren
Wenn Sie Ihr Modell aktualisieren müssen, sobald neue Daten eingehen, können Sie eine Pipeline einrichten, um Ihr Modell regelmäßig neu zu trainieren. Dazu müssen Sie zunächst sicherstellen, dass Sie über neue Daten verfügen, die Sie für das Training mithilfe der oben erwähnten Epsilon-Greedy-Strategie verwenden können. (z. B. in 70 % der Fälle das Ergebnis der Modellvorhersage und in 30 % der Fälle zufällige Ergebnisse verwenden).
Das Konfigurieren einer Pipeline für das Training und die Bereitstellung mit neuen Daten geht über den Rahmen dieses Codelabs hinaus. Sie können sich zunächst die Google Cloud AI Platform und TFX ansehen.
10. Herzlichen Glückwunsch!
In diesem Codelab haben Sie gelernt, wie Sie ein TFLite-Modell auf dem Gerät trainieren und bereitstellen, um In-App-Käufe mit Firebase zu optimieren. Um mehr über TFLite und Firebase zu erfahren, werfen Sie einen Blick auf andere TFLite-Beispiele und die Firebase-Einführungsleitfäden.
Wenn Sie Fragen haben, können Sie diese unter Stack Overflow #firebase-machine-learning hinterlassen.
Was wir abgedeckt haben
- TensorFlow Lite
- Firebase ML
- Firebase Analytics
- BigQuery
Nächste Schritte
- Trainieren und implementieren Sie ein Optimierungsmodell für Ihre App.