玖富算法工程師 李嚴鵬:《智能運營中的機器學習實踐》

玖富算法工程師 李嚴鵬:《智能運營中的機器學習實踐》


9月15日FMI-2018人工智能與大數據高峰論壇圓滿落幕,玖富李嚴鵬老師從用戶流失預測、用戶購買預測以及強化學習探索三個方面進行了分享。

飛馬網將其內容整理如下:

大家好,今天給大家帶來的是智能運營中機器學習實踐,我在玖富主要是理財端大數據機器學習相關的實踐。今天分享的題目主要是用戶流失預測,用戶購買預測以及我們現在正在做的像強化學習的探索。

首先我們簡單看一下用戶流失預測實踐,大家都知道,現在這個行業,像P2P行業,倒閉潮很多,理財用戶心態不是很穩固,導致一些小平臺倒閉,原因在於一些行業,像廣告做的比較好的,因為一些狀況引起暴雷,還有一些小的平臺用戶流失,這對用戶的心理造成很大的影響,當然對我們玖富也會造成一點點的影響,因為我們玖富的業務包括像理財以及消費分期、醫美分期,還有證券等業務。我們的用戶隨著行業的發展形勢也有一些用戶流失的速度相對以前快一些,所以在我們理財端這邊的大數據應用,我們的運營方給了我們一個很艱鉅的需求,我們要提前準確的預知用戶在未來一段時間他們流失的情況,這個流失也就是他最終徹底的離開了我們的平臺,而不在我們的平臺繼續投資。

這樣我們有一個目標定義,我們怎樣去定義流失的用戶,在這裡把我們所有的用戶,對他們最後一筆訂單,每天做一次篩選,把最後一筆訂單在未來第四周到期用戶篩選出來,作為一個樣本選擇,然後來看這批用戶在未來一個月是否會有購買行為,為什麼我們會把目標定義成在未來的第四周到期的用戶篩出來,我們希望有足夠的時間,我們有三週的時間讓運營方做一些很好的精準運營動作,及時挽回即將要流失的用戶。

在特徵工程方面,我們通常會把行為表,用戶的行為特徵,比如用戶每天登錄APP訪問的時長、次數,用戶頁面深度,用戶在APP方面的行為都有一些處理,每天通過日誌記錄時時獲取用戶行為軌跡。還有一些基礎的特徵,除了把登錄時長次數和訪問深度作為基礎特徵以外,還有比例的特徵,我們做了一些按天加權處理,因為我們在樣本的時候一般選擇一個用戶在最近半年內一段時間的表現,而最近半年,他從最近半年到最近一週他們的行為是不一樣的,因為隨著時間的推移,人的行為會不斷的改變,所以我們在這裡也是做了一個按天加權的處理。

第二個特徵是訂單表,我們的用戶在歷史的累計的特徵上,我們會採取他們購買金額相關的特徵,以及購買的產品,購買的時間,像有些用戶他們有時候購買的理財產品和時間是非常固定的,比如像很多用戶在月末最後一天,或者月初前兩天,或者月中的十號十五號,很多用戶是比較正常的中產階級,這樣我們的運營方會設計一些關於發洩日的活動理財產品。

第三,他們有一個再投資的相關特徵,因為在我們的體系下,我們的產品層面會有一個再投資的選擇,當多少用戶即將到期了,我們會給用戶提供一種方案,有一個按紐讓你選擇,是否繼續將到期的訂單進行再投資,你可以選擇投資三個月、九個月等等。

第四,退出的相關特徵,包括它的累計和退出方面的次數以及退出金額相關,我們可以做出一些特徵。

第三大塊,我們用戶的基礎特徵,包括用戶基本的年齡、性別、地域,地域是按照省份來劃分的,有時候我們的用戶在地域的表現上有很強的特性。還有一個是風險係數,在P2P行業,每註冊一家新的P2P平臺,或者互聯網金融的投資平臺,每個用戶在註冊的時候都會做一個風險調查,自我評估一下可能承受的風險水平,這個主要來源於用戶自我的評價。

還有用戶的註冊,他的註冊時間以及他的來源渠道,我們的用戶會通過不同的渠道,會被我們引流進來,像安卓APP端,各大品牌引流,還有APP信息,以及用戶朋友相關的特徵,在這裡朋友相關的特徵主要是因為我們的平臺活動有時候有一個邀請好友的獎勵,我們能夠拿到一個用戶邀請了哪些好友,這些好友有什麼樣的表現,我們會把好友投資的意願程度以及他們退出的情況做成一系列特徵,供我們建模使用。

最後是模型訓練,我們採用的是工業界比較流行的XGboost算法,我們對比的方法是LR、Deep&wide模型,我們的XGboost預測效果比較好,所有的模型基礎會用LR做基本模型,然後像XGB、LGB等等做這樣的提升,另外給一個Deep&Wide模型,是谷歌提出的,把你的理想特徵當做一個LR的單層,把你得出來的特徵跟Y的特徵進行邏輯迴歸的預測。

剛剛介紹了用戶流失的預測實踐,也說了常見的方法,接下來是用戶購買預測實踐,我們既然用經典模型的方法做實踐。另外我們還給出了我們團隊自己設計的深度學習的解決方案。首先看一下業務需求,在我們的業務需求裡,我們的運營方會提出一個需求,我們能不能知道我們的用戶在未來一段時間有一些理財產品的購買傾向,如果他購買,請問他會購買哪一個產品,因為在我們理財領域,我們的產品不是特別多,不像電商產品有很多,他們的產品總共幾個,比如三個月、六個月、九個月,12個月,24個月,48個月,一般是七八個產品。

這樣我們希望能出一個模型,能夠準確的預測未來每個用戶對每個產品購買的傾向,他們才能更好的做一些運營動作的優化。

在這裡我們的目標定義很簡單,因為我們的理財產品總共七八個,如果有七個產品,我們的目標值是八個,還包括用戶一段時間不購買的產品,在這裡遇到一個問題,如果一個用戶在未來的一個禮拜,他既購買了三個月,也購買了6個月,購買了一年,那麼我們應該怎麼把這個樣本定義成一個標籤,在這裡我們是基於一種業務的考量,我們希望我們的用戶更加傾向於購買我們的高價值產品,這個高價值體現在我們產品的期限,我們當然希望所有的用戶都去購買兩年期,四年期,花更多的錢買理財產品,這是我們的最終目標,確實很難達成,我們按照這個趨勢做需求規劃。

這裡問題就來了,我們的這個模型的設計是定義成分類模型還是迴歸模型。如果定義成一個分類模型,有七個產品,我們定義成八分類,這個一點毛病都沒有,如果是迴歸問題,七個產品,每個產品都有一個很強的屬性,他們的時間屬性,因為不同的產品的期限不一樣,我們希望用戶購買更長期的產品。

當你預測一個用戶在未來購買了三個月的產品,或者購買了一年的產品,或者是九個月的產品,你預測他會購買九個月產品,他真實的標籤是未來一個月購買的一年期,你預測是9個月和三個月,他的效果是完全不一樣的,因為你從分類角度來看,這個效果是完全一樣的,因為分類錯了。如果你轉化成迴歸問題,9個月跟12個月更加接近,預測的意願程度更加客觀的表達意願的真實表現。在這裡並沒有採取一種標準的分類問題,我們定義成了一個迴歸問題,我們把整個標籤分別設立成零、一二三四一直到八這個區間內。

最後是樣本選取,我們用的是最近半天內有投資的用戶,一個用戶在最近半年內既沒有投資也沒有登錄過我們的APP,在這半年內都沒有活躍過,我們依然認為他在未來一個月也不會投資,所以在樣本選取裡我們用的是最近半年有過投資的用戶。

特徵工程這一塊,我們依然把流失模型的特徵部,像action的行為特徵訂單特徵,我們都會加進來,不同於流失模型,我們還會引入其他特徵,像產品特徵,因為我們要預測用戶他們在產品層面上的購買形象,所以也會增加一些產品的特徵,比如產品的期限,產品的利率和產品風險狀況,因為我們看到我們的產品有哪些監管人,他的信用表現等特徵都會做成數據放在模型裡。另外還有活動特徵,我們經常搞一些理財活動,比如貸款,週年慶的活動,我們產品的設計會不斷的改變,在產品屬性的特徵上有不同的改變,所以這一塊會加入到多少模型當中來。

最後一個是我們卡券的特徵,在我們的理財用戶,大家如果投資會看到,你的平臺除了購買,他有時候會發一些優惠券,包括本金券和加金券,滿五千減60,這是本金券,加金券是不限額,當你投資任何期限給你年化收益加金的比例,把優惠券的特徵加進來,包括類別、利息以及投資金額的限制等等。

最後採用XGboost的方法,我們對比了LR和LightGBM,其實在效果上沒有太大的差距,因為這兩個算法已經是行業內做數據挖掘比較主流的算法了。

接下來是我們團隊給出了另外一個基於深度學習整體的解決方案,關於基於深度學習,有時候我們也會想在數據挖掘領域,我們數據結構如果應用深度學習,基本上做的也是一些迴歸和分類的經典套路,但是他們的效果並不是特別的好,在做比賽或者活動的時候我們發現表現效果很差。我們如果用深度學習做,我們怎樣做一些改進?在這裡我們充分考慮了傳統學習的侷限性,首先是特徵工程方面,如果C端用戶建模,我們會拿用戶累計或者特徵,但是他很難考慮時間屬性,比如你統計這個人過去三天五天七天,但是你為什麼不統計六天七天,這是特徵的冗餘。

第二,非常高度依賴於人工的特徵工程,如果你採用LAI、TGD也好,你要造一堆的X,你要通過人工做,整個項目中基本上把90%甚至95%的時間花在人工的特徵工程。

第三,特徵工程的複雜性,因為你上線無論用什麼,分佈式計算也好,其實都很複雜,有極少部分的特徵,特徵的複雜度很大,計算成本時間和資源消耗也很大。通過這些考量,我們提出一種端到端的方案進行提升和改進。

首先是我們的數據結構,從傳統的數據來看,我們的數據結構是一個DataFre,我們有N個樣本,一堆X,我們可以做一些分類或者預測,但是如果把一個用戶看作一個DataFre,行是時間屬性,列還是Futer(音),一個用戶是一張表,這樣對我們數據保存是很大的困難,Shape是我們在建模過程中定義的時間週期在我們的工作中把時間週期定義成90天,如果定義成180天也可以,在大量實驗中,在我們數據體系下我們發現定義90天是一個比較合理的選擇,在我們的體系下我們的N是90天的維度,K是特徵維度。

第二,數據存儲,數據存儲基於兩個方面,一個是基於內存,你的數據存儲相比傳統的機器學習,要造相同的特徵出來,存儲要擴大N倍,因為我們用N倍時間維度,一張表是90行,我整體的數據量要擴大90倍。

第二,基於硬盤,一個用戶一張特徵表,把特徵數據放在硬盤,通用做法是N×K是向量,然後成為一個文檔格式,當你真正做的時候會發現,這樣會佔用大量的磁盤存儲,我們當時做了超過一萬個樣本的時候,我們的硬盤存儲空間已經超過一百多個G,也是非常恐怖的,這也是在實際的工業流程上不允許的操作。所以在這裡提出一種改進的方案,我們對他做了特徵變化的改進方案,這裡通常多少特徵包含兩部分,連續特徵和類別特徵,連續特徵包括長尾數字特徵和非長尾數字特徵。

我們提出一種方案,我們把長尾的數字特徵倍數化,使他轉化成一個偏正向分佈的,非長尾特徵直接用一個標準化的處理。

第三,類別特徵,比如他只有兩個類別或者三個類別,我們直接把他處理,如果類別特別多,這裡我們給到的方案是轉換,我們把特徵作為一個數據維度,作為一個標準差和均值,都轉化成0到1的精度,這樣不會有特別多的損失,但是我們最終是一張照片,我們的照片格式最高的值是255,0-1×255,這樣得到255的區間,但是這還是浮點的數據,我們做了一個千分位的階段,我們的特徵損失,我們也承認他有一個特徵的精度損失,我們採用一個千分位的階段損失。在這裡我們把它保存PMG的,因為我不能把它保存JPEG,因為它在存儲的時候通過空間的變換特徵更扭曲,所以我們保存的是PNG,因為PNG讀進來數據不會改變。

一張照片保存的數據存儲才幾十B,如果保存一個文本文檔,是一個文本結構的數據,整個樣本文本數據存儲,除了考慮到每一個數值的存儲,還考慮到文檔結構的存儲,他的存儲空間非常大。我們的存儲壓力相對於文檔存儲,壓力基本上縮小了一百倍以上。

這一塊是我們設計的CNN神經網絡的方式,現在我們的樣本是一張照片,高是時間維,寬是特徵維,我們可以用CNN的方法,但是這裡也是做了一些改進,比如我們用了attention的機制,我們的照片放進去用了一個卷積,這裡我們的卷積核很特殊,傳統的圖象計算,卷積核一般是從左往右,從下往上,但是從這裡從下往上卷,因為我們做數據挖掘知道,我們希望特徵是獨立的不同分佈的,這樣你如果作為卷積核,從左往右卷,每一次卷都是局部的特徵,幹嘛不每次卷所有的特徵,卷積核高的話是時間窗,這樣從上往下卷,每次卷全部的特徵,對不同的時間窗口卷積學習,通過第一次的卷積學習局部的時間屬性。

通過第一層之後,第二層加了一個Attention,卷積只能學習到一個局部的時間窗口的屬性,如果你通過多層卷積可以學習到全局空間,如果通過多層卷積可能會造成影響,我們儘量使網絡結構更簡單。Attention本身是一個一維的向量,我們對第一層的時間進入一個向量做Attention,使得這個Attention注意到全局時間維度模式的變化。

Attention之後的線索依然不會變,我們再用三合一的卷積,最後用Gmaxpool進行最大的池化,最終我們把它做一個輸出,因為我們輸出的都是零到八的正數。

這是我們的效果,我們的效果比XGB和LGB好一些,通過我們的精確調參,在數據分類方面已經很高了,我們精心做了一個調參,效果好了1%左右的精度。

接下來是我們團隊目前做的一些基於強化學習的探索,在強化學習這一塊主要探討一個問題,優惠券推薦排序的問題,在優惠券推薦排序這一塊,我們通常用一些經典的,像推薦算法方面的應用,當然在這一塊我們想嘗試一些其他的方法,如果把優惠券推薦引擎,把這個代理看成一個智能體,用戶是一個要操作的環境,我們對這個環境做一個動作,這個過程對我們優惠券來說是一個設計決策問題,因為對我們的用戶在不同的時間派發不同的卡券。

如果從強化學習的建模視角來看,我們把整個過程看作Episode,這是初始狀態到終止狀態,我們把整個狀態做成一個樣本的鏈路。這樣會把歷史過去所有的日誌記錄拉出來,我們把所有的卡券表的時間窗,分別給每一個用戶做一個訓練,我們分別在不同的時間,我們的卡券和屬性做成一個訓練,這樣把這個狀態進行串聯,這個End是狀態終止行為,我們的終止狀態通過大量時間做數據分析,我們是定義成一種用戶連續兩次投資並且未超過歷史最大單筆投資,或者進行了購買。因為我們這麼來看這個最終只有勝或者敗,在理財這一塊很難評估是勝還是敗了,難道等用戶流失了才是敗嗎,所以我們採取了一種間接的轉變,我們定義用戶連續兩次投資,並沒有超過歷史最大單筆投資。

關於這個我們要設計,是什麼樣的思路設計我們的算法,首先是我們基於概率學習還是價值學習,基於概率學習,我們的卡片有N種,我們的模型輸出,我們概率最大的動作派發給用戶,這是基於概率學習,另一方面,如果是基於價值學習,我們的模型會輸出每一個卡券價值的大小,我們會選擇價值最大的那個給用戶進行開發卡券。我們現在用的是基於價值學習,我們在定義數據結構的時候把每個用戶的價值定義,把他們的年化金額作為他們的價值,所以在這裡我們採用的是價值學習,我們可以讓網絡直接進行下一次迭代,直接跟我們的價值做MSE,這樣你可以很合法的訓練網絡,而我們許多采取基於概率,基於概率的話還是要設置基於價值體系評估。

第二,在我們的遊戲當中整個遊戲從開始到結束,這個過程叫分佈更新,如果單步走的話是單步更新,我們不知道用戶的終止點在哪裡,所以我們採用單步更新。最後是離線學習還是在線學習,我們只需要每隔三天跑一次就行了,而且我們的數據落庫也是隔天落庫的,我們只能做離線學習。

我們設計了一個方法,我們採用了DQN,這是目前做深度學習比較流行的方法,每一次的動作,價值彙報,總彙報是當前動作回報,下一步動作回報,每一個回報有一個衰減係數,得到一個未來得回報,這是動態運籌的思想。

我們如果把這個G組合到,用價值函數擬合,在當前狀態下有一個期望,我們把這個期望展開會得到下面的公式,相當於Rt1後面是Gt1,這樣做一個期望展開,展開會得到最後一個結論,你的強化學習未來的價值預估,你當前狀態做的動作得到的回報,以及下一步預估狀態的價值回報,通過一個∑的係數回覆,∑係數是0-1,如果是0就有標準見得問題。我們的∑係數是0-1的區間,∑趨近1的話說明模型對未來的更重要,如果是0說明更看中當前的價值。

DQN,狀態,我們會把用戶每天的畫像作為狀態,我們通過畫像看出每個用戶的行為表現,動作的話是我們目前設計的一個卡券的形式,我們有N種優惠券,本金券,我們有N+1種動作。最後,獎賞,如果我們的動作一旦觸達,我們會按照日誌記錄搜索,如果他按照我們的觸達獎賞,我們會把獎賞為購買產品年化價值,他會考慮產品期限問題,也考慮產品投資問題,我們不僅僅希望用戶投的錢越來越多,我們也希望投更長期限的產品,我們從利益角度考慮,最終採用的是用戶購買的年畫價值。如果你購買的話,我們給他年化價值,如果不購買,我們依然給他設定為零,如果有負獎勵,會損失的比較劇烈。

這是我們DQN的架構,我們用的結構也不是特別深,也是非常單一,我們的特徵方面,首先用的是框特徵,把很多內裡特徵進行一個計算,另外是層面特徵,把連續性的變量進行計算,第三是產品和優惠券,在這一塊特徵體現出來,最終做一個Concat,然後做一個全連接,最終輸出50個動作,輸出的是50個動作的價值而不是概率,因為我們最後並沒有一個概率函數,我們用的是沒有任何的函數,因為我們最終輸出的就是一個價值,通過這個價值進行下一步迭代,然後進行我們的策略去回調,以上是我今天講的內容,因為這是我們目前進行中的項目,所以並沒有給出效果表現,後續還會在結構方面和特徵方面做一些精細化的調參設計,謝謝大家。

想要獲取大會PPT的朋友可以關注公眾號【FMI飛馬網】—底部導航欄回覆關鍵詞"ppt"進行查閱哦!


分享到:


相關文章: