top of page

Python-周O生-音樂平台購買分析

KKBox音樂平台用戶購買分析

專案介紹

隨著流量紅利的消失,為了企業的銷售數字,重心轉變放在既有流量、既有客戶的經營上,機器學習可以在MarTech發光發熱。


The News Lens 游舒帆提到:在互聯網流量增速大於數位廣告增速時,透過廣告來獲取新客戶是相對容易的,但隨著流量紅利的消失,要獲取新流量、新客戶(增量)已經不再容易,要穩固企業的銷售數字與經營,就要把重心放到既有流量、既有客戶(存量)的經營上。


因此,如何提高消費者的「回購頻次」和「單次毛利」,從現有的會員基礎中挖掘出更多的新變現模式,企業回購率是一個衡量事業是否健康的重要指標,回購率代表你的客戶會回頭再買你的商品或服務,Martech 成為這一趨勢的解方。


在 Kaggle 機器學習競賽平台上,KKBox Churn Prediction Challenge 讓參賽者預測會員是否會繼續延續會員資格,案例恰與前述吻合,另外此案例包含五個資料表(tables),總資料量接近兩千萬筆資料,其複雜度遠大於一般教案只有一個資料表,在專案老師指導下,是一個很好的結業專案。


資料來源

參考資料: KKBox‘s Churn Prediction Challenge Data Description


  • 資料表資料欄位描述


研究過程
  • 過程1.將歌曲播放數欄位併入到訓練及測試資料集

  1. NUM_25: 播放長度少於25%的歌曲平均數

  2. NUM_50: 播放長度介於25~50%的歌曲平均數

  3. NUM_75: 播放長度介於50~75%的歌曲平均數

  4. NUM_985: 播放長度介於75~98.5%的歌曲平均數

  5. NUM_100: 播放長度大於98.5%的歌曲平均數

  6. Total_secs: 單日播放全部秒數平均數


UNQ_RATIO: 播放歌曲不重複比率

NUM_UNQ/NUM_25 + NUM_50 + NUM_75 + NUM_985 + NUM_100


  • 過程2.將會員資訊欄位併入訓練及測試資料集

  1. CITY: 城市

  2. BD: 年齡

  3. GENDER: 姓別

  4. REGISTERED_VIA: 註冊方式

  5. REGISTRATION_INIT_TIME: 第一次註冊時間

  6. EXPIRATION_DATE: 到期日



  • 過程3.將日期轉為序列數字

  1. EXPIRES_AT_SEQ:會員到期日

  2. PREVIOUS_EXPIRES_AT_SEQ:前一次到期日

  3. TRANSACTION_DATE_SEQ:交易日期

  4. REGISTRATION_INIT_TIME_SEQ:第一次註冊日期


  • 過程4.處理缺失值



  • 過程5.特徵選擇

依據各欄位與is_churn的 correlatio值,挑選絕對值大於0.05的欄位,所以篩選出共 11個欄位

(1) bd

(2) expires_at_seq gap_init_

(3) last_expire,

(4) gender_cat

(5) is_auto_renew

(6)is_cancel

(7)is_churn

(8) payment_method_id

(9) payment_plan_days

(10) plan_list_price

(11)previous_expires_at_seq


  • 過程6.選用XGBClassifier模型

本專案使用XGBoosting全名為eXtreme Gradient Boosting(極限梯度提升)模型,2014年華盛頓大學博士陳天奇開發的軟體。


Boosting 是集成學習(Ensemble learning)的概念,集成多種學習演算法,成為能獲得更好預測表現的演算法概念。起源於 1990年,由沙皮爾(Robert Schapire)提出,將許多的弱分類器,集合在一起,進而成為一個強分類器。


Boosting Process:

當訓練模型完成第一棵決策樹,會算出殘差(預測值與目標值的差異),接著會訓練第二棵決策樹並算出殘差,隨著樹的數目增加,模型的預測值會愈來愈接近目標值。


技術講解
  • XGBoost 優點

1.平行運算

可以執行多個執行緒,用來訓練模型。

2.高度客製化

開發人員可以自己定義客製化的 optimization objective 與 evaluation criteria。

3.缺失值處理

模型可以處理缺失值,不需要人為處理

4.剪枝

當XGBoost 樹的深度大於 max_depth,會根據設定超參數刪除不必要的節點。

5.原生的交叉驗證 (Built-in Cross-Validation)

XGBoost 逐步(迭代)建立決策樹過程中允許使用交叉驗證,以便於取得最佳的迭代次數。

6.延續已存在的模型 (Continue on Existing Model)

使用者可以從最後一次訓練的結果開始訓練模型。

7.正則化(Regulation)

使用Regulation降低對訓練資料集過擬合問題,標準的 Gradient Boosting Machine 沒有實作類似的正則化。


  • XGBoosting 參數

XGBoosting 參數可以分為三類

  1. 全域性參數(General): 套用於全域性運算

  2. Booster 參數: 套運於單一booster(決策樹/迴歸)迭代運算

  3. 學習工作參數(Learning Task): 設定學習類型(如: 迴歸/二元分類/多分類)與度量方式。


XGBoosting 參數 - 全域性參數(General)

booster [default=gbtree]

選擇每一次boosting迭代模型的類別

  • gbtree: tree-based models

  • gblinear: linear models

silent [default=0]:

  • 0: 顯示執行訊息1: 不顯示訊息

  • 顯示訊息可能有助於瞭解訓練模型

nthread [預設值為對大的CPU核數]

  • 此參數用於平行運算與作業系統CPU核數

  • 如果要使用全部CPU核數,此參數可以不用設定且xgboost會自動偵測


XGBoosting 參數 - Booster 參數

learning_rate [default=0.3]

  • 藉由降低每次迭代的權重使得訓練模型更為穩定

  • 標準值: 0.01-0.2

min_child_weight[default=1]

  • 定義子節點最小樣本數權重總和

  • 用於調控過擬合。較高的值可避免讓特定的樣本被選入一棵樹。

  • 太高的值可能導致欠擬合,可使用交叉驗證來調整。

max_depth[default=6]

  1. 決策樹最大深度。用於調控過擬合,較高的值允許模型去學習某些樣本特有的關聯性。

  2. 可使用交叉驗證來調整

  3. 標準值: 3-10

max_leaf_nodes [default=0.3]

  • 樹的最末端節點數或葉子數,可以用來取代 max_depth。

  • 如果模型使用 binary tree,一個深度為n的樹最多產生2^n葉子數。

  • 如果使用此參數,GBM會忽略 max_depth

gamma[default=0]

  • 當損失函數下降值大於0,才產生新的節點。gamma是定義產生新的節點,最小的損失函數下降值。

  • 此參數可以根據損失函數調整。

max_delta_step [default=0]

  • 這參數限制每棵樹權重改變的最大步長。如果這個參數的值為0,意味著沒有限制。如果大於0,那麽它會讓這個算法更加保守。

  • 一般情況下此參數可以不用設定。

subsample [default=1]

  • 設定每一棵樹隨機選取樣本比例。

  • 較低的設定值可以避免過擬合且會使得模型運算趨於保守,但設定值太小可能會導致欠擬合。

  • 標準設定值: 0.5-1

colsample_bytree [default=1]

  • 設定每一棵樹隨機選取欄位數的比例

  • 標準值: 0.5-1

colsample_bylevel [default=1]

  • 設定每一棵樹的各階層隨機選取欄位數的比例

  • subsample 與 colsample_bytree 會自動設定此參數,因此可以不用設定。

lambda [default=1]

  • L2 權重正則化(regulation),可以用於降低過擬合。

alpha [default=0]

  • L1 權重正則化,若用於很高維度的模型運算,演算法運行會比較快。

scale_post_weight [default=1]

  • 設定值大於0,在訓練集類別樣本數不平均的情況下,此參數有助於快速的收斂。



研究結果

超過0.1的重要特徵為: is_canceled 與 is_auto_renew



參考資料(References)

Jain A. 1 Mar 2016. Complete Guide to Parameter Tuning in XGBoost with codes in Python. [online]. Available from:

[Accessed 10 December 2021].


nttrungmt-wiki. 2008. Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python. [online]. Available from:

[Accessed 9 December 2021]


Shah I. 13 Feb 2020. Introduction to XGBoost in Python. [online]. Available from: https://blog.quantinsti.com/xgboost-python/

[Accessed 9 December 2021]



行銷資料科學. 6 Apr 2020. Boosting、AdaBoost、GBDT、XGBoosting與LightGBM(LGBM). [online]. Available from: https://aitmr1234567890.medium.com/boosting-adaboost-gbdt-xgboosting%E8%88%87lightgbm-lgbm-8ae05255aa56

[Accessed 15 December 2020]


Saad M. 18 Aug 2019. 15 Python DS XGBoosting Screencast 2019 08 17 12:09:49. [online]. Available from:

[Accessed 15 December 2020]


Gupta A. 28 Apr. XGBoost Hyperparameters — Explained. [online]. Available from:

[Accessed 14 December 2021]


專案心得&教學回饋:

專案共有五個資料表,如何整併在一起成為一個資料集,餵入訓練模型,剛開始完全沒有方向


Mike老師細心指導,給予方向,並傳授如何處理缺失值,特徵選擇及將日期轉為數列等技巧,並建議使用XGBClassifer,最後提交至kaggle,logloss 分數從2.7降至0.17。


Mike老師在簡報製作部分,也給許多實際的建議,節省學員在準備簡報時間。

123 次查看

Comments


bottom of page