基於深度學習模型Wide&Deep的推薦

傲海發表於2018-11-16

本實驗選用資料為UCI開源資料集,僅用於學習,請勿商用)

Wide&Deep推薦演算法出自一篇論文《Wide&Deep Learning for RecommenderSystems》,Wide&Deep由兩部分組成,分別是Wide和Deep。先來說wide,表示的是generalized的推薦系統,傳統的推薦系統都是通過線性演算法基於離散特徵來做推薦的。Wide推薦通常是這樣的:系統通過獲得使用者的購物日誌資料,包括使用者點選哪些商品,購買過哪些商品,然後通過one-hot編碼的方式構成離散特徵或者通過對業務的理解衍生出一些特徵,並進行計算,類似於本系列文章第二篇。這種wide推薦方式有非常多的好處,比如對於大規模的稀疏資料有很好的效果,而且模型的解釋性很強。什麼叫模型的解釋性呢?以邏輯迴歸為例,每個特徵都對應模型中的一個權重值,每個特徵的權重值的大小跟這個特徵對結果的影響是有關的。那麼wide方式同樣有很多缺點,比如我們一直強調的,特徵衍生需要很多人為操作,需要專家經驗,另外這種推薦只對使用者操作過的商品有效。

接著講下deep,這裡的deep表示的是通過深度學習學習出來的一些向量,這些向量是隱性特徵,往往是沒有明確可解釋性的。這些向量也可以作為特徵的一部分參與到訓練中。通過deep方式產生的特徵會有以下好處,其一可以擬補人為提取特徵造成的人力思考維度的限制,試想下一個人可以輕易的思考出二階乘法的結果,如果是五階呢?其二這部分特徵是深度學習框架自動生成的,無需人力干預。

既然Wide和Deep演算法各有千秋,那如果可以將兩種演算法作為組合,那麼一定可以生成更有效的推薦場景的模型,本文就介紹如何在PAI-DSW上實現基於Wide&Deep的預測。

一、業務場景描述

本節使用的是PAI-DSW雲端深度學習訓練平臺和PAI-EAS模型服務平臺,使用的是一份開源的基於人的各種背景的統計資料,解決的問題是基於人的各種基礎資料預測每個人收入是否會超過50K。

本實驗的全部程式碼和資料已經內建於PAI-DSW,只要開啟DSW就可以安裝下方的教程執行實驗。

二、資料集介紹

資料來源:引用UCI開源資料來源,https://archive.ics.uci.edu/ml/datasets/Census+Income
具體特徵欄位如下:

欄位名 含義 型別 描述
age 物件年齡 double 物件的年齡大小
workclass 工作性質 string 自由職業者、私企、企業人員、政府工作者、無業遊民等
fnlwgt 連續資料 double
education 學歷 string 學士、說是、博士、11th、10th、1s-4th等等
education-num 教育年限 double 教育年限
marital-status 婚姻狀況 string 單身、未婚、離異等等
occupation 職業 string 工程師、農民、銷售等等
relatonship 家庭角色 string 妻子、父親、沒家庭等等
race 人種 string 亞裔、白人、黑人等等
sex 性別 string 女性、男性
capital-gain 連續資料 double
capital-loss 連續資料 double
hours-per-week 連續資料 double
native-country 祖籍國家 string 美國、哥倫比亞、英格蘭、加拿大等等

目標欄位:income是否超過50k

三、資料探索流程

首先進入PAI-DSW,找到左側的Demo資料夾,下載Wide&Deep資料集及程式碼包。

(1)工程描述

首先看下整個工程,

  • 包含一個census_data資料夾,裡面包含一個訓練資料和一個測試資料
  • official資料夾是一個工具包
  • census_main.py為訓練指令碼

(2)訓練模型

開啟一個terminal環境,執行

python census_main.py --export_dir wide_deep_saved_model

wide_deep_saved_model為輸出模型所在的資料夾,訓練完在檔案目錄下會找到相應檔案,開啟後可以看到checkpoint:

把這個checkpoint的號記住。

(3)模型預測

現在已經生成了模型的checkpoint輸出,接下來進入terminal,執行以下指令碼:

saved_model_cli run --dir wide_deep_saved_model/${模型checkpoint號碼}/ --tag_set serve --signature_def="predict" --input_examples=`${預測資料}`

根據本文的案例可以執行以下指令碼拿到預測結果:

saved_model_cli run --dir wide_deep_saved_model/1542168326/ --tag_set serve --signature_def="predict" --input_examples=`examples=[{"age":[46.], "education_num":[10.], "capital_gain":[7688.], "capital_loss":[0.], "hours_per_week":[38.]}, {"age":[24.], "education_num":[13.], "capital_gain":[0.], "capital_loss":[0.], "hours_per_week":[50.]}]`

輸入了兩條預測資料,最終拿到預測結果:

輸入了兩條預測資料,可以得到預測輸出,第一條預測結果為1,第二條結果為0,可以通過output key probabilities判斷(注:矩陣第一行對應第一個預測結果,第二列0.9599956>第一列0.04000434,所以第一個預測結果是1。同理第二個預測結果是0)。

可以通過程式碼official/wide_deep/census_dataset.py來看具體的特徵工程的特徵和目標值的構建,目標列>50k時目標值為1,目標列<50k時目標值為0。

於是預測結果第一條的人的預測收入為>50k,預測結果第二條的人的預測收入<50k。

(4)模型線上部署

生成的模型是Tensorflow的標準模型格式,可以通過PAI-EAS將模型部署成Http服務供呼叫。

後續流程可以參考線上預測文件:https://help.aliyun.com/document_detail/92917.html

部署成線上服務之後,這樣就可以做到模型跟使用者自身的業務結合,完成PAI模型訓練和業務應用的打通。


相關文章