商品推薦預測框架:AlibabaRecommand

jopen 9年前發布 | 14K 次閱讀 推薦引擎 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僅作為參考,只是機器學習從建立模型到預測的簡單實現,不可用來直接參加正式比賽。

項目主頁:http://www.baiduhome.net/lib/view/home/1430903143320

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!