寫在前面:
這段時間一直都在看一些機器學習方面的內容,其中又花了不少時間在推薦系統這塊,然后自己做了一套簡單的推薦系統,但是跑下來的結果總覺得有些差強人意,我在離線實驗中得到Precision,Recall一般都只有15%左右,比起通常的機器學習算法動不動就90%以上的指標,這個我覺得顯然是太低了,我覺得可能有如下理由導致的:
- 數據不完整,目前能拿到的數據也就是ERP里面的交易數據和各種主數據,但是在我看來,交易數據的權重在各種其他類型的數據中應該是最重要的,至少也是排在前列的,可能也是我的一廂情願。
- 業務領域沒有考慮周全,少了某些重要的參數未加入到模型中去,我想這個才是最重要的,數據分析的前提就是對業務有很深的領悟,才能做出較好的結果
- 技能欠缺
再說下本人公司背景,公司的業務是B2B類型,公司有接近10萬個產品的量,用戶比物品少,1萬左右,其中還有大量的不活躍用戶。后來經過多方面思考后,打算先暫停推薦系統,換一種思路,咱不推薦了,推薦關注在給用戶推薦之前未曾購買過的產品,但是就我們行業來說,我會主觀的認為一般B2B的業務,客戶也即公司,他們的興趣愛好是基本固定的,不會像人一樣這么的善變,所以從這個角度來思考的話,推薦系統也許就不是那么特別的重要的(我知道此刻肯定有N個人要反駁我了)
因為我認為交易數據的重要性,所以我就僅僅從交易數據入手,來分析出用戶的購買行為,或者某個物品的被購買行為。所以才有了這次項目的展開:
目的:
通過本項目,希望能在以下方面提供給銷售,市場部門以及管理團隊決策的參考:
- 預估某個用戶的未來會需要購買的物品,可以進而預測該用戶的銷量
- 發現某個用戶可能存在的交易流失行為,發現潛在風險
- 預測某個物品未來可能會被那些用戶購買
- 預測某個物品未來可能會流失那些用戶,發現潛在風險
- 提供解釋理由為什么可以預測
通過以上的結果,可以提前有針對性的對客戶或者物品進行各種活動。
概念須知
|
概念 |
解釋 |
|
數據 |
SAP中的訂單交易數據,客戶主數據,物料主數據 |
|
訓練數據(TrainData) |
用來將整個數據划分一部分來作為算法的訓練集 |
|
測試數據(TestData) |
用來將整個數據划分另外一部分作為測試數據,通過測試數據來測試算法的各項性能指標 |
|
預測結果 |
在訓練數據集上預測出來的結果集合 |
|
|
|
關鍵評價指標 |
推薦結果 |
在訓練數據上找到的所有推薦結果數 |
命中條目(hit) |
預測結果中的集合恰好在測試集合中的數目 |
|
准確率/查准率(precision) |
命中條目占預測結果中的比率,可以理解為真的預測正確的結果占所有預測結果有多少 |
|
召回率/查全率(recall) |
命中條目占測試結果中的比例,可以理解為所有全部為正確的結果到底有多少真的被預測正確了 |
|
潛在風險數(這個以及下面的兩個是我自己瞎造的概念) |
在訓練中,可能存在有風險的數據(用戶-物品為一條數據),這些數據往往需要用戶去找原因,確定是否真的存在風險 |
|
誤差預估數 |
潛在風險數中的數據在測試數據中已經發生了交易,所以認為是估計有誤差,這個數從商業上講應該要越大越好,因為他們最終都還是有交易行為了 |
|
誤差風險率 |
誤差預估數/潛在風險數 |
基於用戶的分析的報告
使用客戶XXXX有限公司作為測試:
- 選擇時間區間:20150101-201601231,該用戶的所有買過的物品的交易數據作為訓練數據
- 選擇時間區間:20170101-20170519,該用戶的所有買過的物品的交易數據作為測試數據
- 各項指標如下:
指標 |
結果值 |
說明 |
訓練數據集(不同物料編號數目) |
2425 |
該用戶在這段時間內共買過2425個不同編號的物品 |
推薦結果 |
458 |
在訓練數據上算出來的可以給該用戶推薦的物品數目 |
測試數據集 |
839 |
該用戶在測試集這段時間內購買了839個不同編號的物品 |
命中結果 |
220 |
代表算法預測成功了220個物品該用戶會去購買的 |
准確率 |
48% |
|
召回率 |
26% |
|
潛在風險數 |
313 |
該用戶可能會消失的交易數碼,例如用戶不再買某一個產品了,需要業務來判斷是否真的有風險 |
誤差預估數 |
189 |
說明在潛在風險中313個里面,其中有189個是沒有風險的 |
誤差風險率 |
60% |
189/313,這個值越高越說明風險越小 |
對於算法來說,使用不同的參數會產生不同的結果,本次實驗采用的參數是比較樂觀的估計,這會導致算出來的潛在風險數較小,命中數目較高,准率較低。但具體怎么調節參數,需要結合具體業務場景。
基於物品的分析
使用物品YYYYY:
- 選擇時間區間:20150101-201601231,該用戶的所有買過的物品的交易數據作為訓練數據
- 選擇時間區間:20170101-20170519,該用戶的所有買過的物品的交易數據作為測試數據
- 各項指標如下:
指標 |
結果值 |
說明 |
訓練數據集(不同用戶編號數目) |
122 |
解釋同基於用戶分析相似 |
推薦結果 |
28 |
|
測試數據集 |
80 |
|
命中結果 |
24 |
|
准確率 |
86% |
|
召回率 |
30% |
|
潛在風險數 |
73 |
|
誤差預估數 |
45 |
|
誤差風險率 |
62% |
|
結果說明:
至少從各項KPI指標來看,都是要明顯高於推薦系統中的指標的,特別是基於物品的分析准確率高達86%,當時看到這個數的時候第一反應就是到底哪里出錯了?經過各種代碼的Review發現是沒問題的,其實也驗證了我的前面的說法,企業客戶的興趣愛好不會隨便發生變化的。
補充說明
- 考慮到機器性能,還不能在單機上跑所有的用戶和所有的物品的分析結果,目前以本實驗的用戶和物品一起分析所占用的時間為20秒。如果10萬條物品記錄來跑的話,可想而知會需要話多長的時間
- 本項目是采用Python來開發的
- 此預測系統其實可以和推薦系統進行一個很好的結合,來發揮出更大的功效,提高分析的智能性,例如可以檢查流失的交易是否是轉移到了類似商品上去,等
最后:
這是目前的第二篇博客,還是對於怎么編輯博客的樣式一無所知,最后只能跑到Word文檔里面來寫,然后貼在博客上了,寫博客真是一件很辛苦的事情. 如果你對具體模型有興趣,我就接着繼續寫技術上是怎么實現的.