低頻少樣本長驗證周期場景下的演算法設計
- 2019 年 11 月 22 日
- 筆記
文章作者:張惟師
編輯整理:高勇
本次分享的內容提綱:

▌業務背景介紹

工業界中存在演算法友好場景,也存在演算法不友好的場景。演算法友好場景中用戶交互資訊頻繁,樣本數量充足,模型驗證周期短,常見的應用場景有新聞資訊流、廣告推薦、快消類商品,搜索排序等;演算法不友好的場景中恰好相反,面臨用戶交互資訊少,樣本數量不足,模型驗證周期長等多種問題,如金融風控、招聘推薦、二手車點電商、房產電商等場景。居理新房業務場景中屬於後者,是在產業互聯網中一種客單價極高,頻率極低的典型演算法不友好場景。

居理新房打造了獨特的線上、線下的閉環生態系統。線上部分通過投放效果類、品牌類廣告 ( 如 SEM, 資訊流等 ),在廣告落地頁上進行產品展示,App 下載等方式來引流客戶。客戶在使用相關產品線的產品時會產生一些線索資訊。這裡的線索可以理解為用戶的相關資訊(如手機號碼等)。線索資訊較為混亂,真假不一,因此需要在線客服人員對客戶留下的線索進行篩選確認,將具有真實購房意願的名單篩選出來給線下諮詢師。由諮詢師聯繫客戶,帶領客戶預約看房, 客戶滿意的話,帶領客戶繼續認購、簽約等後續環節。從上述環節中可以看到線上獲客到線下籤約數據量呈漏斗式層層過濾,最後簽約量較少。在整個流程中,廣告自動投放和線索品質品質評估都有相關演算法,這裡主要介紹線索品質相關的演算法。不同線索的品質不同,對於線索品質高的用戶,如果能在恰當的時間點為預測出客戶的購房需求,可以提高用戶的轉化率,對於線索品質低的客戶,例如暫時處於觀望或者是虛假資訊,如果能儘早的識別出來這一部分群體,可以降低線上客服審核成本,進而提高諮詢師的工作效率。這樣比較自然的引入用線索品質二分類的演算法,將好的線索直接給諮詢師,不太好的線索給客服進行審核。但是這種場景下的分類演算法面臨多種挑戰,首先用戶交互頻次極低,一個人一生平均購買一到兩次房,也就幾乎不存在歷史購買行為資訊,其次是樣本量少,舉個例子,北京市2019年上半年新房成交量在 3w 套左右,其中居理新房的成交比例在2%左右,整體用於訓練的樣本不多。另外客戶決策周期長,從平台首次接待客戶到客戶完成交易的周期業內均值在2-3個月,即使居理新房周期短一些,流程周期也要在20天到30天,換句話說是跟單周期長,演算法上線後,至少跟單一個月才能觀察演算法效果。客戶相關資訊較少,目前主要有客戶渠道來源 ( 頭條創意,百度渠道 ),以及客戶在 App 上的歷史瀏覽,點擊,搜索等行為資訊,還有一些線下獲取的大量非結構化資訊 ( 如諮詢師與客戶的線下交互行為 ),但這部分數據線上獲取不到,一般用來驗證演算法的有效性。
▌演算法平台

目前居理新房搭建了復用性和擴展性都比較好的演算法平台,可以通過一些靈活的配置,實現相關監控,任務調度,模型校驗,可視化頁面以及 AB Test。演算法平台底層支援多種演算法引擎包括機器學習模型平台 ( Spark-MLlib,Xgboost ),深度學習平台 ( Tensorflow,Pytorch ) 以及圖相關模型。可以通過 pipeline 的方法整合數據流和演算法引擎。
▌樣本選擇

如何選擇正負樣本?比較直觀的做法將最終是否發生認購行為作為正負樣本的評估依據。但在當前場景下,由於房屋交易業務轉化率低,從線上訪問 UV 到最終房屋認購,比例在萬分之幾左右,只從中間線索角度來看,這個比例也在2%-3%左右。為了解決樣本稀疏問題,這裡設置了一個代理目標,將是否發生帶看行為作為正負樣本的評估依據。帶看行為發生在認購行為之前,發生認購行為占帶看比例中的10分之一左右,周期也可從一到兩個月縮減到兩周左右。那麼樣本在一個周期 T 內,將是否被帶看作為正負樣本的評估依據。另外可以後續模型訓練時,提高具有多次帶看行為或者發生認購行為的權重。在一個時間周期 T 內,可能存在跟單不完全的情況,但這部分比例在10%以內,可以忽略。由於正負樣本比例差異較大,在樣本量較大的情況下,這種比例可以接受,但在樣本量較少的情況下,正負樣本比例差異導致模型學習困難。因此在訓練模型前可以先對樣本進行取樣預處理。常見的樣本取樣方法有欠取樣和過取樣。欠取樣是保持數據集正樣本數量不變,根據一定比例去隨機抽取負樣本,過取樣是通過已有正樣本來構造虛擬正樣本,來減小正負樣本差異。常見的過取樣方法有 SMOTE 等。但是取樣方法會影響數據集中的正負樣本分布,在關注概率值的分類等業務場景下,需要對模型輸出的概率進行校準。
▌特徵工程

在特徵工程中,特徵類型主要有以下三類,資訊來源類 ( 渠道/線索來源、多設備、多帳號,刷量識別 ),用戶 App 行為類 ( 核心頁面點擊行為,轉換行為,留存行為 ),用戶粘性類 ( 前 n 日活躍頻次,活躍時長,最近一次活躍時間,訪問深度、廣度 )。其中資訊渠道來源是指用戶是來自百度、Feed 還是廣點通等平台,多設備、多帳號等主要是用于衡量用戶是否發生過作弊行為。另外用戶 App 行為類特徵是佔比最大的一類特徵,主要是指用戶在留電話號碼前,在 App 上點擊,瀏覽、搜索等行為。用戶粘性類特徵是一些抽象統計特徵,其中訪問深度是指 App 頁面用戶訪問最長的路徑,廣度是指 App 中用戶使用的功能的數量。
在 Deep Learning 的場景中,一般來說用 Embedding 就 ok 了,不需要較多的特徵處理,但在當前場景下特徵處理相對來說比較重要。常見的數值處理有 IV ( 離散化 )、頁面比率 ( 頁面轉化 )。什麼是頁面轉化?用戶搜索 query 詞後 App 顯示樓盤資訊,如果用戶搜索五次後發生一次點擊行為,那麼對於這個用戶來說,該用戶的搜索點擊的轉化率就20%。特徵組合主要有主成分分析 ( PCA ),樹模型決策路徑,以及完整的功能點擊路徑。另外還進行了特徵有效性分析,重要包括方差,覆蓋率分析,互資訊,獨立性分析,離群值分析等。離群值分析在當前場景中影響較大,因為在樣本量較少的情況,離群點容易誤導模型。下圖是數據集中覆蓋率前10的特徵,包括渠道表示 ( op_type ),城市 ( city ),用戶設備數量 ( user_id_cnt ),來源 ( source ),渠道數量 ( channel_cnt ),最近一次渠道來源 ( last_channel ),上一次留電話距離現在的天數 ( leave_phone_days ),App 中 banner 點擊的數量 ( banner_click_cnt ),App 啟動次數 ( app_start_cnt ) 等。
▌模型調優

模型主要採用的傳統模型 LR,RF,XGBoost,LightGBM,也嘗試了使用 Deep Learning 等,但實際效果不足傳統模型好。另外在當前場景下樣本數量少,而且版本更新迭代較快的時候,常遇到數據分布不一致的問題。產品迭代了新的版本,但離線模型訓練用的還是老的數據,而線上用的新版數據,這種資訊不一致將拉低模型效果。當前採用的方案是時間窗口滾動的方式來訓練模型,並盡量剔除一些可能因為版本導致數據不一致的特徵,努力將影響降至最低。在無論是深度學習還是傳統機器學習,參數調優的方法大同小異,主要是網格搜索 ( Grid Search )、人工參數調優以及分城市閾值調優。網格搜索調優雖然不能一定找到最優解,但是花費時間較短。另外也嘗試了一些貝葉斯優化的方法,它和 grid search 有的區別就是它會根據你上一輪做演算法的參數結果去幫你去選擇最有可能產生最優演算法參數方向去優化這個參數,換句話說做了幾輪參數實驗並獲取對應結果,利用貝葉斯優化自動幫忙尋找參數優化方向。貝葉斯尋優容易陷入局部最優,需要多進行幾輪貝葉斯優化,手工選出裡面的極大值。分城市閾值調優是遇到的另一個更嚴重的一個場景,由於居理新房在全國十多個一二線的城市有業務,而且每個城市有自己不同的特點,用戶的行為都不一樣,在模型分類時,每個城市應採取不同的閾值。在本身整體數據量就不多情況,每個城市的數據量更少,這種情況下要麼將城市資訊加入特徵或者每個城市都分別訓練一個模型。
在做演算法時,評估的值不一定是一些常用通用指標如 AUC,Top N 的點擊率等,而是與業務比較契合的指標。採用通用指標來衡量演算法剛開始可能還可以,但是一段時間後發現對業務幫助不大,指標雖然顯示比較高,但最後並沒有增加用戶的收入,也沒有提升用戶的留存。只是說單獨的就是演算法本身還不錯,所以很多時候更多需要的是找到真正跟業務結合的優化目標。經過多次思考和試驗後,最後選了兩類線索的帶看召回率 ( Recall@30%、Recall@70% ) 的評估指標。模型輸出概率需要選取閾值來判斷線索是好的還是壞的。可以通過閾值選取,將不同比例的線索標成為好線索。比如說有一百個線索,從裡面拿出來30個線索就30%,最後這30個線索被帶看或成交的比例能達到60%。就相當於30%裡面有60%的比例是被召回出來了,這閾值選取的還是不錯的。因為在現有演算法中不可能保證每一個線索都是好的,通過某個閾值大於70%的線索是好線索。那麼在這70%的線索裡邊,應該至少能召回90%的帶看或者認購的線索,才能說明這個演算法才是有意義的。
另外就是 early stop 的調優方法,比如說這個模型在訓練的時候,模型應該什麼時候停止訓練。一般來說會用到的方法是學習曲線 ( learning curve ),模型在訓練的時候可能迭代一百次、迭代一千次的時候看模型的學習曲線有沒有有很大的這種變化,如果在進行更多次迭代時發現測試集上效果在在下降,但是在訓練集上其實在上升,這就是過擬合現象。從最好結果看,模型在 recall 為30%的時候,差不多有60%被帶看或認購的比例,在 recall 的為70%時能達到91%的這樣一個比例,從結果上來看還是能達到預期的結果。

▌可解釋性分析

接下來主要講一下可解釋性的分析,因為整個房產行業的客單價都比較高,相當於說每個客戶都特別的寶貴。以北京為例,平均每單利潤在12萬到15萬。若將好線索誤分為壞線索,沒有為客戶好好服務將會導致較大的損失。對於業務人員 ( 客服,諮詢師 ) 而言,模型預估結果會與他們原有的一些工作模式和習慣矛盾,需要向業務人員解釋模型預估結果。當演算法去服務於業務團隊的時候,這種可解釋性顯得尤為重要。通過 xgboost 計算得到的特徵重要性 ( feature importance ) 不一定是完全可解釋的,它和特徵在決策森林中出現的次數相關。但特徵在決策森林裡面出現的次數越多並不能說明特徵越重要。這裡採用的是 SHAP 來進行可解釋性分析,SHAP 計算的是一個特徵加入到模型時的邊際貢獻,考慮了該特徵在所有的特徵序列的情況下不同的邊際貢獻。在 SHAP 圖中,縱坐標是特徵列表,橫坐標是從負數到正數的取值範圍,表示對模型輸出值的影響。留電口、渠道特徵是從 SHAP 方法來看是最為重要的特徵。一般來說通過搜索渠道來的用戶,購房的意向比較強烈,這個也和基本認知符合。另一個比較顯著的特徵 pv_p_select_city,表示切換城市的動作越多,用戶品質越差。舉個例子:假設有北京和天津的都有業務,客戶可能一會看看北京的房子,一會又選擇天津的房子,就中間各種搖擺,客戶可能也沒太想好到底在哪個城市要買,這種情況下需要花費很多精力去說服客戶,用戶轉化成本計較高。留電天數越多,稍微比越低,就相當於一個月之前留的線索和昨天留的線索對比來看,明顯是距離現在時間近的線索品質會高一點。如果客戶上午留的電話,在下午的時候諮詢師就能給客戶提供服務,這種情況下轉換概率會很大。但並不是所有的特徵影響與我們對模型的預期是相同的,比如說特徵 history_view_pages ( 用戶在 APP 的上 PV 貢獻度 ),PV 貢獻度越大,線索品質反而比較差。但如果從購房意願來看也是可以理解的,對於購房意特彆強的客戶,瀏覽頁面比較集中,更能體現用戶的關注點,雖然只使用了不到 App 1% 的特徵,但轉化率比較好。反而是那些樓盤看的特別多的用戶在行為上表現的流程和瀏覽廣度都不錯,但品質確實比較低。這種聚焦觀點不僅適用於當前場景,也可以推廣到產品上的其他場景。
▌實際效果

從模型效果來看,客戶認購量提升了十七個百分點,基本達到了演算法預期目標。從認購到帶看的目標變化,將周期從兩個月縮減到了兩周,後續希望能找到一個更好的指標來代替帶看,進一步縮短模型周期。另外居理新房還做了很多線下數據的累積。比如說諮詢師與客戶的電話錄音,微信記錄,交通行為等。通過這些離線數據能大概分析出諮詢師和客戶的行為,比如說通話頻率,通話時長,微信驗證,聊天頻率,客戶需求響應時長等多種詳細指標。目前不同的城市數據累積量不同,等數據量積累到一定程度,可以為不同的城市設置獨立的模型。另外模型融合 ( stacking ) 是後續優化的方向,看能不能做出更有意思的效果。目前的模型是基於無線數據,PC 數據相對無線來說,用戶行為比較少,下一步是跨站整合 PC 和無線的數據。