1. 程式人生 > >移動推薦演算法(三):特徵構建

移動推薦演算法(三):特徵構建

本文為轉載文章,來源為: https://blog.csdn.net/Snoopy_Yuan/article/details/75105724

一直在探索資料探勘、資料建模的案例,百度搜到這篇文章,收穫頗豐,轉載以作記錄。

移動推薦演算法是阿里天池賽2015年賽題之一,題目以移動電商平臺的真實使用者-商品行為資料為基礎來構建商品推薦模型。該題現已成為新人入門的經典演練物件,博主也希望基於該題場景,加深對機器學習相關知識的理解,積累實踐經驗。關於題目回顧與資料初探,可參考:天池離線賽 - 移動推薦演算法(一):題目與資料解析,本文討論如何進行特徵構建,為之後基於模型的方法實現提供支援。

特徵工程回顧

特徵工程是機器學習方法在工業界得到有效應用的基礎。業界普遍的認為:資料和特徵決定了學習的上限,而模型和演算法只是在逼近這個上限。所以,做好特徵工程,是高效實現機器學習和資料探勘任務的基礎。關於特徵工程的詳細內容,可參考:

特徵工程到底是什麼? - 知乎

特這構建與選取是特徵工程的重要內容,包括:

  • 結合業務物件和資料可用性確定所需特徵(包括特徵的定義、數值特性、特徵組合衍生…);
  • 基於原始資料構建特徵資料並作基本預處理(SQL、資料清洗…);
  • 針對不同模型進行特徵預處理,包括取樣、單個特徵預處理(歸一化、離散化、缺值處理…)、多個特徵的處理(PCA、LDA、Clustering、卡方檢驗、相關係數、正則化…);
  • 在模型訓練中分析選取特徵(有效性、重要性);
  • 。。。

特徵構建

預研思路

首先給出特徵構建時的一些思路:

  1. 由於使用者行為對購買的影響隨時間減弱,根據分析,使用者在一週之前的行為對考察日是否購買的影響已經很小,故而只考慮距考察日一週以內的特徵資料。

  2. 由於資料來源於垂直電商,其特點是線上購買線下消費,猜測其購買行為具有一定的週期性,進一步猜測行為週期為一個星期。待預測目標考察日為 12.19 ,是星期五,所以分割出11.18~12.18資料中的四段以星期五為考察日,一週為考察期的資料,一共有4組,其中一組涉及雙十二異常期,故而省區,還剩下三組資料如下:

    part 1 - train: 11.22~11.27 -> 11.28;
    part 2 - train: 11.29~12.04 -> 12.05;
    part 3 - pred:  12.13~12.18 (-> 12.19);
    

    其中 part 1 和 part 2 可作為模型訓練和驗證資料集,part 3 為測試資料集;

  3. 針對當前業務背景,考慮從user、item、item_category三大基本維度及其組合入手進行特徵構建,簡稱U、I、C。

  4. 由於問題已被明確為 U-I 是否發生購買行為(標記label取{0,1])的分類問題,最終的特徵資料均要合併到生成以 U-I 為index(key)的樣本集上來。進一步地,如要考慮所有可能的 U-I ,必將面臨組合爆炸的問題,所以這裡只關注在距考察日一週以內出現過的 U-I 。

特徵構建

這裡將所需構建的特徵分為六大類:U、I、C、UI、UC、IC,對每類分別結合行為次數、時間、排序等視角設計特徵。考慮到樣本規模,特徵數量不宜太少,這裡我們設計了約100個特徵來進行第一季的資料任務,具體的特徵選擇及定義見下表:

特徵名稱 所屬類別 特徵含義 特徵作用 特徵數量
u_b_count_in_n(n=1/3/6) U 使用者在考察日前n天的行為總數計數 反映了user_id的活躍度(不同時間粒度:最近1天/3天/6天) 3
u_bi_count_in_n(i=1/2/3/4,n=1/3/6) U 使用者在考察日前n天的各項行為計數 反映了user_id的活躍度(不同時間粒度),反映了user_id的各項操作的活躍度,折射出user_id的購買習慣 12
u_b4_rate U 使用者的點選購買轉化率 反映了使用者的購買決策操作習慣 1
u_b4_diff_hours U 使用者的點選購買平均時差 反映了使用者的購買決策時間習慣 1
i_u_count_in_n I 商品在考察日前n天的使用者總數計數 反映了item_id的熱度(使用者覆蓋性) 3
i_b_count_in_n I 商品在考察日前n天的行為總數計數 反映了item_id的熱度(使用者停留性) 3
i_bi_count_in_n I 商品在考察日前n天的各項行為計數 反映了item_id的熱度(使用者操作吸引),折射出item_id產生的購買習慣特點 12
i_b4_rate I 商品的點選購買轉化率 反映了商品的購買決策操作特點 1
i_b4_diff_hours I 商品的點選購買平均時差 反映了商品的購買決策時間特點 1
c_u_count_in_n C 類別在考察日前n天的使用者總數計數 反映了item_category的熱度(使用者覆蓋性) 3
c_b_count_in_n C 類別在考察日前n天的行為總數計數 反映了item_category的熱度(使用者停留性) 3
c_bi_count_in_n C 類別在考察日前n天的各項行為計數 反映了item_category的熱度(使用者操作吸引),包含著item_category產生的購買習慣特點 12
c_b4_rate C 類別的點選購買轉化率 反映了item_category的購買決策操作特點 1
c_b4_diff_hours C 類別的點選購買平均時差 反映了item_category的購買決策時間特點 1
ic_u_rank_in_c IC 商品在所屬類別中的使用者人數排序 反映了item_id在item_category中的熱度排名(使用者覆蓋性) 1
ic_b_rank_in_c IC 商品在所屬類別中的行為總數排序 反映了item_id在item_category中的熱度排名(使用者停留性) 1
ic_b4_rank_in_c IC 商品在所屬類別中的銷量排序 反映了item_id在item_category中的熱度排名(銷量) 1
ui_b_count_in_n UI 使用者-商品對在考察日前n天的行為總數計數 反映了user_id - item_id的活躍度 3
ui_bi_count_in_n UI 使用者-商品對在考察日前n天的各項行為計數 反映了user_id - item_id的活躍度,反映了user_id - item_id的各項操作的活躍度,對應著user_id - item_id的購買習慣 12
ui_bi_last_hours UI 使用者-商品對各項行為上一次發生距考察日的時差 反映了user_id - item_id的活躍時間特徵 4
ui_b_count_rank_in_n_in_u UI 使用者商品對的行為在使用者所有商品中的排序 反映了user_id對item_id的行為偏好 3
ui_b_count_rank_in_n_in_uc UI-UC 使用者-商品對的行為在使用者-類別對中的排序 反映了user_id對item_category中的各個item_id的行為偏好 3
uc_b_count_in_n UC 使用者-類別對在考察日前n天的行為總數計數 反映了user_id - item_category的活躍度 3
uc_bi_count_in_n UC 使用者-類別對在考察日前n天的各項行為計數 反映了user_id -item_category的活躍度,反映了user_id -item_category的各項操作的活躍度,對應著user_id -item_category的購買習慣 12
uc_bi_last_hours UC 使用者-類別對各項行為上一次發生距考察日的時差 反映了user_id -item_category的活躍時間特徵 4
uc_b_count_rank_in_n_in_u UC 使用者-類別對的行為在使用者所有商品中的排序 反映了user_id對item_category的行為偏好 3

通過sql或python-pandas可以簡潔的完成這些特徵的提取。

這些特徵數值尺度不一,所以在使用尺度敏感模型前需要進行歸一化處理;有些特徵是離散型(如排序特徵),有的特徵存在缺值(如時間差特徵),這些都要根據具體的模型來進行預處理。

樣本格式

在進行了特徵構建之後,我們通過合併各大類特徵資料(U、I、C、UI、UC、IC)得出訓練和預測所需的資料,資料樣本格式如下:

# 索引 特徵 標籤
一行樣本資料 user_id, item_id 約100個特徵資料 分類結果(0-未購買,1-購買)

在得出樣本集之後,就可以進行模型的訓練和預測了。

(p.s.生成的資料量規模達到10G級別,考慮到單機計算儲存資源受限,在示例程式大量使用了分塊操作,另外也可考慮基於HDFS+MR來實現)。