即時設備內應用程式內購買優化 Codelab

1. 概述

1cbf855eda62c306.png

歡迎來到即時設備內應用程式內購買優化程式碼實驗室。在此 Codelab 中,您將學習如何使用 TensorFlow Lite 和 Firebase 訓練自訂個人化模型並將其部署到您的應用程式。

本教學展示如何建立用於個人化的機器學習模型,特別是在給定當前使用者所處狀態的情況下預測最佳應用程式內購買(IAP) 服務的模型。這是上下文強盜問題的範例,這是一個重要且重要的問題。廣泛適用的機器學習問題,您將在此 Codelab 中了解更多信息

你將學到什麼

  • 透過 Firebase 分析收集分析數據
  • 使用 BigQuery 預處理分析數據
  • 訓練一個簡單的 ML 模型來優化應用程式內購買 (IAP) 的裝置端
  • 將 TFLite 模型部署到 Firebase ML 並從您的應用程式存取它們
  • 透過 Firebase A/B 測試測量和試驗不同模型
  • 使用最新資料定期訓練和部署新模型

你需要什麼

  • Android Studio 版本 3.4+
  • 配備 Android 2.3+ 和 Google Play 服務 9.8 或更高版本的實體測試設備,或配備 Google Play 服務 9.8 或更高版本的模擬器
  • 如果使用實體測試設備,則需要一條連接電纜
  • 新手 ML 知識

您將如何使用本教學?

僅通讀一遍閱讀並完成練習

您如何評價您建立 Android 應用程式的體驗?

新手中間的精通

2. 問題陳述

假設您是遊戲開發者,希望在每個關卡結束時顯示個人化的應用程式內購買 (IAP) 建議。您每次只能顯示有限數量的 IAP 選項,並且您不知道哪些選項的轉換效果最好。鑑於每個用戶和每個會話都是不同的,我們如何找到提供最高預期獎勵的 IAP 優惠?

3. 取得範例程式碼

從命令列克隆GitHub 儲存庫

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

該倉庫包含:

  1. 用於訓練個人化模型並將其打包到 TFLite 模型中的 Jupyter 筆記本 (.ipynb)
  2. 使用 TFLite 模型在裝置上進行預測的範例 Kotlin 應用程式

4. 使用 Firebase 運行應用程式

在此 Codelab 中,我們將致力於優化虛構遊戲應用程式Flappy Sparky的 IAP。遊戲是一款橫向捲軸遊戲,玩家控制一個 Sparky,試圖在不撞到牆壁的情況下在牆壁之間飛行。在關卡開始時,用戶會看到一個 IAP 優惠,可以為他們提供能量。我們將在此 Codelab 中僅實作應用程式的 IAP 最佳化部分。

您將能夠將在這裡學到的知識應用到您自己的連接到 Firebase 專案的應用中。或者,您可以為此 Codelab 建立一個新的 Firebase 專案。如果您需要 Firebase 入門協助,請參閱我們關於此主題的教學課程( AndroidiOS )。

5. 在您的應用程式中收集分析事件

分析事件提供對使用者行為的洞察,並用於訓練 ML 模型。例如,該模型可能會了解到玩遊戲時間較長的使用者更有可能進行 IAP 以獲得額外的生命。 ML 模型需要分析事件作為輸入來學習此資訊。

我們可能想要記錄的一些分析事件包括:

  • 用戶玩遊戲的時長
  • 用戶達到什麼級別
  • 用戶花了多少金幣
  • 用戶購買哪些商品

下載樣本資料(可選)

在以下步驟中,我們將使用 Firebase Analytics 記錄分析事件以在我們的模型中使用。如果您已經擁有想要使用的分析數據,請跳到此 Codelab 的「訓練優化模型」部分,您可以按照我們的範例數據進行操作。

使用 Firebase Analytics SDK 收集數據

我們將使用 Firebase Analytics 來協助收集這些分析事件。 Firebase Analytics SDK 自動擷取許多事件和使用者屬性。它還允許您定義自己的自訂事件來測量您的應用程式特有的事件。

安裝 Firebase 分析 SDK

您可以按照Google Analytics 入門文件在您的應用程式中開始使用 Firebase Analytics。在此 Codelab 開頭複製的firebase-iap-optimization儲存庫已包含 Firebase Analytics SDK。

記錄自訂事件

設定 Firebase Analytics SDK 後,我們可以開始記錄訓練模型所需的事件。

在此之前,在分析事件中設定使用者 ID很重要,這樣我們就可以將該使用者的分析資料與其應用程式中的現有資料相關聯。

MainActivity.kt

firebaseAnalytics.setUserId("player1")

接下來我們可以記錄玩家事件。對於 IAP 最佳化,我們希望記錄向使用者提供的每個 IAP 優惠以及使用者是否點擊該優惠。這將為我們提供兩個分析事件 - offer_iapoffer_accepted 。我們還將追蹤唯一的 Offer_id,以便稍後使用它來組合這些數據以查看報價是否被接受。

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

有關記錄自訂事件的更多信息,請訪問Firebase Analytics 日誌事件文件

6. 在 BigQuery 中預處理數據

在最後一步中,我們收集了有關向使用者呈現哪個 IAP 優惠以及使用者點擊哪個 IAP 優惠的事件。在此步驟中,我們將將此事件資料與使用者資料結合起來,以便我們的模型可以從完整的圖片中學習。

為此,我們需要先將分析事件匯出到 BigQuery。

若要將您的 Firebase 專案及其應用程式連結到 BigQuery,請執行以下操作:

  1. 登入 Firebase。
  2. 點選the Settings icon ,然後選擇項目設定。
  3. 在「專案設定」頁面上,按一下「整合」標籤。
  4. 在 BigQuery 卡片上,點擊「連結」。

(可選)將 Firestore 集合匯出到 BigQuery

在此步驟中,您可以選擇將其他使用者資料從 Firestore 匯出到 BigQuery 以協助訓練模型。如果您想暫時跳過此步驟,請跳到此 Codelab 的「在 BigQuery 中準備資料」部分,然後您可以按照上一個步驟中記錄的 Firebase Analytics 事件進行操作。

Firestore 可能是您儲存使用者註冊日期、應用程式內購買、遊戲等級、餘額硬幣或可能對訓練模型有用的任何其他屬性的位置。

要將 Firestore 集合匯出到 BigQuery,您可以安裝Firestore BigQuery Export Extension 。然後,連接 BigQuery 中的表,將此數據與 Google Analytics 中的數據結合起來,以便在您的個人化模型以及本 Codelab 的其餘部分中使用。

在 BigQuery 中準備數據

在接下來的幾個步驟中,我們將使用 BigQuery 將原始分析資料轉換為可用於訓練模型的資料。

為了讓我們的模型了解根據使用者和遊戲狀態呈現哪些 IAP 優惠,我們需要組織以下數據:

  • 使用者
  • 遊戲狀態
  • 提出的報價
  • 所提供的報價是否被點擊

所有這些資料都需要組織成表中的一行,以便我們的模型可以處理。幸運的是,BigQuery 的設定就是為了幫助我們做到這一點。

BigQuery 允許建立「檢視」以保持查詢井井有條。視圖是由 SQL 查詢定義的虛擬表。建立檢視時,您可以像查詢表一樣對其進行查詢。使用它,我們可以先清理我們的分析資料。

要查看是否點擊了每個應用程式內購買優惠,我們需要加入我們在上一個步驟中記錄的offer_iapoffer_accepted事件。

all_offers_joined - BigQuery 視圖

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 視圖

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 資料集匯出到 Google Cloud Storage

最後,我們可以將 bigquery 資料集匯出到 GCS ,以便我們可以在模型訓練中使用它。

888daa7ba4db8e44.png

14d22bf474fae455.png

7. 訓練最佳化模型

樣本數據

使用上一步驟「在 BigQuery 中預處理資料」中的資料或此處提供的可下載範例資料來完成本 Codelab 的其餘部分。

問題定義

在開始訓練模型之前,讓我們花一些時間定義上下文強盜問題。

上下文強盜解釋

在 Flappy Sparky 的每個關卡開始時,使用者都會看到一個 IAP 優惠,可以為他們提供能量。我們每次只能顯示一個 IAP 選項,我們不知道哪些選項的轉換效果最好。鑑於每個用戶和每個會話都是不同的,我們如何找到提供最高預期獎勵的 IAP 優惠?

在這種情況下,如果使用者不接受 IAP 優惠,我們將獎勵設為 0;如果使用者接受,則將 IAP 值設為 0。為了最大化您的獎勵,我們可以使用歷史資料來訓練一個模型,該模型可以預測給定使用者的每個操作的預期獎勵,並找到獎勵最高的操作。

e7d3264141498bff.jpeg

以下是我們將在預測中使用的內容:

  • 狀態:有關使用者及其當前會話的信息
  • 行動:我們可以選擇顯示的 IAP 優惠
  • 獎勵:IAP 優惠的價值

開發與探索

對於所有多臂老虎機問題,演算法需要在探索(獲取更多數據以了解哪個動作給出最佳結果)和利用(使用最佳結果獲得最高獎勵)之間取得平衡。

在我們的問題版本中,我們將簡化為僅在雲端中定期訓練模型,並且僅在用戶設備上使用模型時進行預測(而不是在用戶設備上進行訓練)。為了確保我們在使用模型後擁有足夠的訓練數據,有時我們需要向應用程式使用者顯示隨機結果(例如 30%)。這種平衡探索和利用的策略稱為Epsilon-greedy

訓練模型

您可以使用 Codelab 提供的訓練腳本 ( training.ipynb ) 開始使用。我們的目標是訓練一個模型,預測給定狀態下每個動作的預期獎勵,然後找到給我們最高預期獎勵的動作。

本地培訓

開始訓練自己的模型的最簡單方法是複製此 Codelab 的程式碼範例中的筆記本。

此 Codelab 不需要 GPU,但如果您需要更強大的機器來探索自己的資料並訓練自己的模型,您可以獲得AI Platform Notebook 實例來加快訓練速度。

在提供的訓練腳本中,我們建立了一個迭代器,用於根據從 BigQuery 匯出的 CSV 檔案產生訓練資料。然後我們使用這些資料開始使用 Keras 訓練我們的模型。有關如何訓練模型的詳細資訊可以在Python筆記本的註釋中找到。

衡量模型性能

在訓練模型時,我們會將其與隨機選擇 IAP 選項的隨機代理進行比較,以查看我們的模型是否真正在學習。該邏輯位於ValidationCallback.

訓練結束時,我們使用test.csv中的資料再次測試我們的模型。該模型以前從未見過這些數據,因此我們可以確信結果不是由於過度擬合造成的。在這種情況下,模型的性能比隨機代理好 28%。

匯出 TFLite 模型

現在我們已經有了一個可以使用的經過訓練的模型,只不過它目前採用的是 TensorFlow 格式。我們需要將模型匯出為TFLite格式,以便它可以在行動裝置上運行。

火車.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)

從這裡,您可以下載模型並將模型與您的應用程式捆綁在一起。

(可選)對於生產應用,我們建議您將模型部署到 Firebase ML 並讓 Firebase 託管您的模型。這很有用,主要有兩個原因:

  1. 我們可以保持應用程式安裝較小,僅在需要時下載模型
  2. 該模型可以定期更新,並且發布週期與整個應用程式不同

若要了解如何將模型部署到 Firebase ML,您可以按照將 Firebase 新增至 TFLite 支援的 Android 應用程式Codelab 進行操作。您可以選擇使用 Firebase 控制台或 Python API 進行部署。

8. 在設備上進行預測

下一步是使用裝置上的模型進行預測。您可以在下載的範例程式碼的app資料夾中找到一個從 Firebase ML 下載模型的範例應用,並使用它對一些客戶端資料執行推理。

由於我們在模型訓練期間應用了一些預處理,因此在設備上運行時,我們需要對模型輸入應用相同的預處理。實現此目的的一個簡單方法是使用獨立於平台和語言的格式,例如 JSON 文件,其中包含每個功能到有關如何完成預處理的元資料的對應。您可以在範例應用程式中找到有關如何完成此操作的更多詳細資訊。

接下來,我們為模型提供測試輸入,如下所示:

Iap優化器.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"
  )

該模型表明, sparky_armor是該特定使用者的最佳 IAP 強化道具。

a3381dbcdbdf811e.png

測量模型精度

為了衡量我們的模型準確性,我們可以簡單地追蹤我們的模型預測的 IAP 優惠以及它們是否使用 Firebase Analytics 被點擊。您可以將其與 Firebase A/B 測試結合使用來衡量模型的實際效能。更進一步,您也可以對模型的不同迭代執行 A/B 測試。您可以在使用 A/B 測試建立 Firebase 遠端設定實驗文件中了解有關使用 Firebase 進行 A/B 測試的更多資訊。

9.(可選):使用新資料定期更新模型

如果您需要在新資料進入時更新模型,您可以設定管道來定期重新訓練模型。為此,您需要先確保有新資料可用於使用我們上面提到的 epsilon-greedy 策略進行訓練。 (例如,70% 的時間使用模型預測結果,30% 的時間使用隨機結果)。

配置用於訓練和部署新資料的管道超出了本 Codelab 的範圍,您可以查看Google Cloud AI PlatformTFX來開始使用。

10. 恭喜!

在此 Codelab 中,您學習如何使用 Firebase 訓練和部署裝置上 TFLite 模型來優化應用程式內購買。要了解有關 TFLite 和 Firebase 的更多信息,請查看其他 TFLite 範例和 Firebase 入門指南。

如果您有任何疑問,可以將其留在Stack Overflow #firebase-machine-learning

我們涵蓋的內容

  • TensorFlow Lite
  • Firebase 機器學習
  • Firebase 分析
  • 大查詢

下一步

  • 為您的應用程式訓練和部署優化器模型。

了解更多