1. 程式人生 > >天池O2O優惠券使用預測比賽--總結

天池O2O優惠券使用預測比賽--總結

1.        賽題簡介

以優惠券盤活老使用者或吸引新客戶進店消費是O2O的一種重要營銷方式。然而隨機投放的優惠券對多數使用者造成無意義的干擾。對商家而言,濫發的優惠券可能降低品牌聲譽,同時難以估算營銷成本。 個性化投放是提高優惠券核銷率的重要技術,它可以讓具有一定偏好的消費者得到真正的實惠,同時賦予商家更強的營銷能力。

本次大賽為參賽選手提供了O2O場景相關的豐富資料,希望參賽選手通過分析建模,精準預測使用者是否會在規定時間內使用相應優惠券。

2.     資料

本賽題提供使用者在201611日至2016630日之間真實線上線下消費行為,預測使用者在20167月領取優惠券後15天以內的使用情況。




3.        資料分析

訓練集所有使用者中,約1/4的使用者參與了線上及線下的活動,約1/4僅參與了線下,約1/2僅參與了線上

測試集中使用者幾乎被訓練集中參與過線下活動的使用者全部覆蓋,有一小半是活躍使用者<線上線下都參加>

線上與線下的商家完全沒有交集

測試集中商家幾乎被訓練集中線下商家全部覆蓋

測試集中全部是全新的優惠券<優惠券ID是不同的,所以對於優惠券的特徵描述應當是其商家、折扣率等,與ID無關。

根據經驗,我們知道活躍使用者更可能使用優惠券,活躍商家所發出的優惠券更可能被使用,使用者對某個商家的喜愛程度越高越可能使用這個商家發的優惠券

使用者在週末更有時間更可能使用優惠券

4.        提取特徵(pandas,numpy)

1)        優惠券相關特徵,從預測樣本的discount_rate,data_received提取:

Day_of_week //優惠券領取日期屬於周幾,使用獨熱編碼

Is_weekend //優惠券領取日期是否屬於週末

Day_of_month //優惠券領取日期屬於一月中的哪天

Days_distance //優惠券領取日期離要預測的開始日期間隔天數

Discount_man //提取滿減優惠券中滿多少元

Discount_jian //提取滿減優惠券中減多少元

Discout_rate //優惠券折扣率

2)        商戶相關特徵,從訓練樣本的distance,date_received,date提取:

Total_sales //商戶被消費次數

Sales_use_coupon //商戶使用優惠券被消費次數

Total_coupon //商戶發放優惠券次數

Merchant_min_distance //所有使用優惠券消費的使用者與商戶的最小距離

Merchant_max_distance //所有使用優惠券消費的使用者與商戶的最大距離

Merchant_mean_distance //所有使用優惠券消費的使用者與商戶的平均距離

Use_coupon_rate //商戶使用優惠券消費比例,等於sales_use_coupon/total_sales

Transfer_rate //商戶優惠券轉化率,等於sales_use_coupon/tatal_coupon

3)        使用者相關特徵,從訓練樣本的discount_rate, distance, data_received, data提取:

Count_merchant //使用者消費商戶數量

Buy_use_coupon //使用者使用優惠券消費次數

Buy_total //使用者消費次數

Coupon_received //使用者領取優惠券次數

User_min_distance //所有使用優惠券消費的商戶與使用者的最小距離

User_max_distance //所有使用優惠券消費的商戶與使用者的最大距離

User_mean_distance //所有使用優惠券消費的商戶與使用者的平均距離

Avg_user_date_datereceived_gap //使用者從領取優惠券到消費的平均時間間隔

Min_user_date_datereceived_gap //使用者從領取優惠券到消費的最小時間間隔

Max_user_date_datereceived_gap //使用者從領取優惠券到消費的最大時間間隔

Buy_use_coupon_rate //使用者使用優惠券消費佔總消費的比例

User_coupon_transfer_rate //使用者優惠券轉化為實際消費比例

4)        使用者-商戶相關特徵,從訓練樣本date,date_received提取特徵:

User_merchant_buy_total //使用者在商戶消費次數

User_merchant_received //使用者領取商戶優惠券次數

User_merchant_buy_use_coupon //使用者在商戶使用優惠券消費次數

User_merchant_buy_common //使用者在商戶普通消費次數

User_merchant_coupon_transfer_rate //使用者對商戶的優惠券轉化率

User_merchant_rate //使用者對商戶消費佔總互動比例

User_merchant_common_buy_rate //使用者對商戶普通消費佔總消費比例

User_merchant_coupon_buy_rate //使用者對商戶使用優惠券消費佔總消費比例

5. 訓練模型(xgboost, sklearn)

選擇xgboost模型,xgboost是一種迭代提升方法,由多個弱分類器組成的效果較好的強分類器,其中底層的弱分類器一般是由決策樹實現的,每棵樹所學習的是上一棵樹的殘差。

它的優勢主要有:

使用L1、L2範數進行正則化,防止過擬合;

實現樹節點粒度的平行計算;

允許自定義損失函式和評價標準;

XGBoost會一直分裂到指定的最大深度(max_depth),然後回過頭來剪枝。如果某個節點之後不再有正值,它會去除這個分裂。 這種做法的優點,當一個負損失(如-2)後面有個正損失(如+10)的時候,就顯現出來了。XGBoost會繼續分裂,然後發現這兩個分裂綜合起來會得到+8,因此會保留這兩個分裂。

內建交叉驗證,XGBoost允許在每一輪boosting迭代中使用交叉驗證。因此,可以方便地獲得最優boosting迭代次數

重要引數:


1、eta[預設0.3]
和GBM中的 learning rate 引數類似。 通過減少每一步的權重,可以提高模型的魯棒性。 典型值為0.01-0.2。
2、min_child_weight[預設1]
決定最小葉子節點樣本權重和。 和GBM的 min_child_leaf 引數類似,但不完全一樣。XGBoost的這個引數是最小樣本權重的和,而GBM引數是最小樣本總數。 這個引數用於避免過擬合。當它的值較大時,可以避免模型學習到區域性的特殊樣本。 但是如果這個值過高,會導致欠擬合。這個引數需要使用CV來調整。
3、max_depth[預設6]
和GBM中的引數相同,這個值為樹的最大深度。 這個值也是用來避免過擬合的。max_depth越大,模型會學到更具體更區域性的樣本。 需要使用CV函式來進行調優。 典型值:3-10
4、max_leaf_nodes
樹上最大的節點或葉子的數量。 可以替代max_depth的作用。因為如果生成的是二叉樹,一個深度為n的樹最多生成n2個葉子。 如果定義了這個引數,GBM會忽略max_depth引數。
5、gamma[預設0]
在節點分裂時,只有分裂後損失函式的值下降了,才會分裂這個節點。Gamma指定了節點分裂所需的最小損失函式下降值。 這個引數的值越大,演算法越保守。這個引數的值和損失函式息息相關,所以是需要調整的。
6、max_delta_step[預設0]
這引數限制每棵樹權重改變的最大步長。如果這個引數的值為0,那就意味著沒有約束。如果它被賦予了某個正值,那麼它會讓這個演算法更加保守。 通常,這個引數不需要設定。但是當各類別的樣本十分不平衡時,它對邏輯迴歸是很有幫助的。 這個引數一般用不到,但是你可以挖掘出來它更多的用處。
7、subsample[預設1]
和GBM中的subsample引數一模一樣。這個引數控制對於每棵樹,隨機取樣的比例。 減小這個引數的值,演算法會更加保守,避免過擬合。但是,如果這個值設定得過小,它可能會導致欠擬合。 典型值:0.5-1
8、colsample_bytree[預設1]
和GBM裡面的max_features引數類似。用來控制每棵隨機取樣的列數的佔比(每一列是一個特徵)。 典型值:0.5-1
9、colsample_bylevel[預設1]
用來控制樹的每一級的每一次分裂,對列數的取樣的佔比。 我個人一般不太用這個引數,因為subsample引數和colsample_bytree引數可以起到相同的作用。但是如果感興趣,可以挖掘這個引數更多的用處。
10、lambda[預設1]
權重的L2正則化項。(和Ridge regression類似)。 這個引數是用來控制XGBoost的正則化部分的。
11、alpha[預設1]
權重的L1正則化項。(和Lasso regression類似)。 可以應用在很高維度的情況下,使得演算法的速度更快。
12、scale_pos_weight[預設1]
在各類別樣本十分不平衡時,把這個引數設定為一個正值,可以使演算法更快收斂。

引數調優(使用交叉驗證):

1. 選擇較高的學習速率(learning rate)。一般情況下,學習速率的值為0.1。但是,對於不同的問題,理想的學習速率有時候會在0.05到0.3之間波動。選擇對應於此學習速率的理想決策樹數量。XGBoost有一個很有用的函式“cv”,這個函式可以在每一次迭代中使用交叉驗證,並返回理想的決策樹數量。
2. 對於給定的學習速率和決策樹數量,使用GridSearchCV進行決策樹特定引數調優(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。
3. xgboost的正則化引數的調優。(lambda, alpha)。這些引數可以降低模型的複雜度,從而提高模型的表現。
4. 降低學習速率,確定理想引數。

6、總結與收穫

對大資料在實際場景的應用有了更深的瞭解

想要提高模型效果,特徵很重要

熟悉如何運用python進行資料處理,特徵提取

對使用的模型引數要了解