商品推薦預測框架:AlibabaRecommand
AlibabaRecommand 是一個商品推薦預測框架。通過對用戶上一個月的行為數據進行分析,為后一天的用戶購買行為作出預測,進行推薦。
通過對用戶在移動終端上一個月的行為數據進行分析,為后一天的用戶購買行為作出預測,進行推薦。
目錄結構
├── LICENSE #許可證 └── README.md #使用說明 #建表 ├── create_table.sql #創建基本表 ├── add_table.sql #后續增加的表 ├── add_index.sql #為表建立索引 ├── add_table_31day.sql #建立存儲31天數據的表,結構同上 └── add_index_31day.sql #為表建立索引 #數據導入 ├── datatoDB.sql #csv格式原始數據導入基本表 └── FeaturetoDB.sql #feature.txt導入對應表 #main ├── __init__.py ├── Utility.py #工具類 ├── TrainModel.py #特征提取 ├── ObtainPredict.py #生成模型 └── GetFeature31day.py #進行預測 #數據 ├── feature.txt #符合某個篩選標準的樣本 ├── data_features.txt #feature.txt中記錄的n維特征 ├── data_features.npy #轉為矩陣格式(numpy庫),下同 ├── data_labels.txt #feature.txt中記錄的label(1/0表示購買/未購買) ├── data_labels.npy ├── feature_pos.txt #feature.txt中所有正例 ├── feature_p.npy ├── feature_neg.txt #feature.txt中所有負例 ├── feature_p.npy ├── TrainSet.npy #訓練集 ├── TestSet.npy #測試集 └── 31day_data_features.txt #31天所有數據的n維特征 #結果 ├── predict_all_pairs.txt #得到所有預測的userid itemid對 └── filter_pairs.txt #用train_item過濾的userid itemid對
使用
TrainModel類用來生成每個樣本的特征和對應的label
model = TrainModel() model.DivideByTime("2014-12-18 00:00:00") #按時間點分割 model.MergeData() #將特征組合起來 model.SimplifyTrainUser() #按規則濾除一部分特征 model.MergeFeatures() #合并特征 model.GenLabels() #產生樣本對應label
PredictEmption類用來生成模型和選取最優閾值
PE = PredictEmption() PE.DivideSet() #把正負樣本分開 PE.GenTrainTestSet() #生成訓練集和測試集 PE.TestPredict() #打印模型預測的準確率和召回率
GetFeature31day.py用來提取31天的特征樣本和進行預測
model = TrainModel() model.MergeData() model.MergeFeatures() #合并特征 model.Transform2Matrix() #把文本轉化為便于處理的矩陣 model.PerformPredict() #進行預測 model.FilterByItems() #用物品進行過濾 model.RemoveDuplicate() #去除重復
原理
題目給了31天的數據,我們選擇第30天作為分割點。用前30天的數據提取n維特征(每個[user_id,item_id]對可以提取一行特征),用第31天的真實數據去標記每行特征。
舉個例子:某個[user_id,item_id]對[9909811,266982489]在前30天出現,如果在第31天它也出現了且behavior_type為購買,則標記這一行的label為1,否則為0。
這樣形成了很多行的特征數據,我們把數據進行Logistic Regression訓練,得到一個二分類的模型,這樣模型就訓練好了。
接下來就是預測,預測的東西就是上面的label,也即模型的輸出。label為1表示我們認為用戶會購買。那么模型的輸入是什么呢?模型的輸入就是31天所有數據的特征。
1th~30th————> 31th的label 1th~31th————> 32th的label
因為31th的label數據是已知的,所以可以利用它對訓練出來的模型進行評估。而32th的label就是輸出結果了。
建模
模型建立主要采取對特征數據進行Logistic Regression。
現有一組用戶在一個月內的移動端數據,我們需要預測他們在后一天購買某件商品的可能性。通過二值分類,我們僅僅能夠預測用戶是否購買,不同于此的是,現在我們還關心購買的可能性,即:
f(x) = P(+1|x)
取值范圍是區間[0,1]。
在二值分類中,我們通過w*x得到一個score后,通過符號運算sign來預測y是+1或-1。而對于當前問題,如果能夠將這個score映射到 [0,1]區間,問題似乎就迎刃而解了。而問題的關鍵就是選擇映射函數,邏輯斯蒂回歸選擇的映射函數是S型的sigmoid函數。
f(s) = 1 / (1 + exp(-s))
s取值范圍是整個實數域,f(x)單調遞增。而邏輯斯蒂回歸用
h(x) = 1 / (1 + exp(-wx))
來逼近上面的目標函數。其中,x為要預測的樣本,w為訓練出的模型向量(w和x的維度相同),h是算得的樣本概率。
說明
本repo只是一個流程和預測的框架,特征工程很多地方還需要改善。
此repo僅作為參考,只是機器學習從建立模型到預測的簡單實現,不可用來直接參加正式比賽。