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

本實驗選用數據爲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.]}]'

輸入了兩條預測數據,最終拿到預測結果:

image

輸入了兩條預測數據,可以得到預測輸出,第一條預測結果爲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模型訓練和業務應用的打通。



本文作者:傲海

閱讀原文

本文爲雲棲社區原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章