2020全國金融科技大賽 — P2P風控模型建立 top5 solution
寫在前頭
12月剛結束一場資料科學建模的比賽,這次參加的比賽是台灣AI金融科技協會主辦,多個單位如台灣大學協辦的競賽。主要是這一次比賽時間更短,相比一年前參加國泰的大數據競賽所花時間更少,綜合模型分數與決賽提報後得到的名次,因此這篇主要是想分享自己是怎麼用更有效率的方式來解決資料科學問題。
動機:對金融科技與資料科學的興趣
當初會參加是有同校學生找我報名,因為我對金融科技與P2P的資料科學挑戰是一直很有興趣的,綜合以下考量就在超級超級忙碌的學期中多參加了這個專案,至少對我個人而言能在過程中達到下列目的就是非常有吸引力的:
- P2P 商業模式的挑戰:之後應該會另外寫一篇文章探討,如果要透過資料科學協助金融科技,那麼有什麼要注意的地方?模型要「多好」才能盈利?
- P2P風控資料的樣子:如果是一家做P2P貸款的公司,使用了哪些資料?
- 驗證學習的里程碑:這一年來又做了不少個人化的套件,對算法也理解得更深刻,此外在Consulting firm參與過類似的專案,但一直是從商業、策略的角度而非技術的角度出發,剛好可以用這個比賽覆盤幾個觀念,比如專家訪談的結果、商業策略對於資料模型的敏感度….
上一次參加的比賽分享可以看這邊:國泰大數據競賽
為什麼效率重要?
也許是因為在Consulting firm目前將近一年的實習經驗,過去在Corporate level 會有很多時間去把一件事情做深,比如開發模型或者多階段專案(為了建立某個模型而設計資料採集流程、管理資料串接等等…)但是在Consulting firm 就不是這麼回事,你經常會需要在很短的時間內有大量高品質的產出,這種工作模式如果對應到具體的資料科學:「快速」意味著要在很短的時間內定義問題、收集資料、了解資料、資料分析、建立模型原型,「高品質」意味著你的模型原型一定是可以產生價值的(比如比Benchmark準20~30個百分點),但是對於準確度或者其他指標就不是那麼高要求,因為更多時候我們只是想呈現出「價值」,而深化這件事情就會交給客戶的團隊去做。(「快速看到價值」經常也是數位轉型的第一步),因此雖然資料科學比賽看重指標的排名,但對我來說時間要求也是對自己的考核標準,那麼以下就進入正題,我們先來看看題目:
競賽題目
P2P 借貸就是不直接透過銀行,由投資方直接放款給資金需求方,達成去中心化,而最大的特色就是借款利率低且效率非常高,因為不需要支付銀行高昂的利差且省略許多線下作業,為台灣將來的開放銀行開了第一扇門。 而信用貸款通常是一時急用,故大多不會像房貸一樣分期非常長的期間,但若借款人仍然發生逾期的情況將增加資訊平台的成本,然而哪些借款人的因子才能夠準確預測他的個人行為呢?
本次競賽使用了 P2P 信用借貸的去識別化數據資料,請大家集思廣益一同創造出良好風控模型來對借款人進行預測!
P.S. 這場比賽我用的工具主要為Python與Excel(商業分析階段時使用),但我知道前幾名也有人單純用R,工具挑順手的就行囉!
第一步:商業分析
資料科學上可以很清楚這種題目就是一個分類問題,而商業題目是預測「是否違約」
這裡面關於金融、科技、風險管理的知識點就多了。首先我在之前對於P2P僅僅知道商業模式與部分產業知識,但是對於傳統銀行的風控手段與金融科技公司怎麼做這件事情是不太了解的,因此我做了幾件事情來增加對資料的理解:
- 資料集與資料表描述歸納之後共有貸款紀錄、借貸狀況、拒絕紀錄三個面向三張表,約150個特徵(欄位)大致了解不同欄位字段的意義
- 了解其中商業意涵,包括專有名詞、對於傳統風控評估手段的意義
- 理解P2P信貸的國內外發展模式、技術相關文章
- 整理筆記,同時根據傳統風控方法、商業意涵的文獻探討來建立對特徵工程的思路
了解相關知識點之後,接著就可以做一些初步對於問題與資料的分析、了解困難點來思考進一步的解決方案,比如這個問題的挑戰在於信用擔保問題的數據混雜(時間段不同、資料源多、廣),比賽雖然已經定義了問題,但實務上其實光定義「何謂違約」也是一個比較困難的問題,因為貸款其實會分成貸前、貸後,看過資料表與結合剛學習到的知識就能認知到有些特徵其實是沒辦法用在「貸前」風控的,這些考量也是我們團隊後來提報時有提出落地的考量風險因子。
另外有做商業分析的話,在回去看資料表時我有幾個收穫:
節省時間與思考資料的出處
- 這份資料集其實已經做了許多特徵工程(可能是直接由數據中台採集出來的資料),很多傳統風控手段的特徵、或者別有含義的統計值都已經包含在資料集內部,這省去了很多手動建立特徵的時間
不可使用特徵
- 有些特徵是不會拿來解這個問題的,我猜測這份資料是直接從資料庫輸出的,比如網站連結、買過商品ID等欄位,如果是公司內部的話這些資料可以連結到其他資料表,但是對這份比賽提供的資料來看這幾個欄位是沒有辦法使用的。
- 或者前面提過的貸款階段,作為比賽這些特徵雖然都可以拿來用,但實際上不同特徵是產生自特定階段的,這點在落地時需要辨別。
工程問題
- 數據量偏大,上百萬筆、150多個欄位,怎麼解決運算問題與快速EDA?如果我要用16GB RAM的筆電打這場比賽需要做什麼處理?建立特徵時又會產生什麼問題?在這邊因為資料量對於筆電負擔比較大,我的解決方法是先透過Google Colab做基本的運算處理,接著寫了一個減少記憶體使用量的函數將資料處理過再讀到本地端(筆電上的Jupyter),推薦如果受限於硬體又有資料處理需求的人可以嘗試使用Colab來做運算性質的事情,之後的程式在運算方面我也盡量透過向量化來處理,運行會比較有效率。
資料不平均
- 違約者比較少,可能需要用到採樣的算法
第二步:資料清洗
查看欄位缺失可以知道部分缺失特徵比較嚴重,比如其中 emp_length、emp_title 、hardship_flag 缺失是比較明顯的,這時候可以先填補-9999 (給予特定值)來讓模型學到這些缺失特徵。另外缺失的含義其實也反映了業務狀況:有些人可能不願意透露自己的工作狀況(emp 相關)所以保持空白,hardship可以反映這個借款人的金錢使用狀況是否有困難,這裡缺失有可能是難以判斷或者是不願意反應。
整個資料集的缺失狀況則如下:
通常這種大數據集用視覺化手段可以很好了解缺失分佈狀況,這也可以回應到我們前一階段的商業分析
在前一個階段我們看了主要的資料表與欄位,在這時候我了解到這份資料表的欄位排列其實是有意義的,類似面向的特徵會順序性地排在一起,比如說借貸人工作資訊相關、借貸計畫描述相關
因此我們可以初步觀察到這份資料的缺失其實在結構性上也就兩個面向(觀察圖中柱狀分佈區域),這種缺失可以回到業務角度去解決(比如資料收集是否有誤、能不能透過改善資料填寫體驗或者流程來更穩定收集到資料),其他幾個特徵都是比較沒有模式的缺失,我會視情況選擇用機器學習(用模型預測缺失值、KNN估計缺失值等)或者資料處理(統計量、特殊標記、刪除)的方式解決。
異常值的部分倒是還好,在商業分析階段我們知道這份資料表可以歸納成三個面向,貸款紀錄、借貸狀況、拒絕紀錄,而因為許多資料的產生都來自於業務方或者商業邏輯定義,比如授信、貸款許可,因此在業務角度的資料(貸款狀態面向)不太會有異常值,而借貸狀況的資料也許因為貸中風控的關係也不會有太離譜的資料點,因此處理上我單純用標準差診斷的方式移除掉離群值。
第三步:特徵編碼預處理
這份資料集有許多類別特徵,比如借款人收到貸款的方式、hardship plan的開始、結束日期等等… 因為我們想要讓模型更容易學到日期特徵,連續變數或者太多類別的類別變數是很容易overfit的,因此我們縮短維度,比如有日期資料就處理成只看月份就好等等…….. 縮減類別維度之後,隊友將這些類別特徵用PCA壓縮成88個新特徵(選擇方法來自於保留變異量),並取代原本類別特徵。
特徵部分了解到資料表已經有許多特徵,因此我僅僅根據領域知識增加了一個特徵,主要是用來呈現借款人的還款壓力(透過償還利率/收入得到),剩下的特徵打算建立Baseline 以後再以此作為比較基準進一步調試。
第四步:Baseline model
做完以上類別特徵編碼與特徵工程之後,著手建立Baseline模型,因為資料量其實偏大的關係,第一個模型就做出不錯的成果,在這邊我使用Light GBM,因為在建立初期我希望用運算效能好一點的模型,同時Tree base又能保有解釋能力來進一步分析特徵,個人認為在這樣的情況下是比常用的XGboost更好的選擇:
雖然指標表現依照我過去做資料科學專案的表現來看非常好,不過這場比賽看的是F1-Score,可以看到我們的F1-Score表現較差,分析混淆矩陣可以知道主要是沒有抓到本來會違約的人
如果在商業上這樣做的效益多大呢?
計算之後我得到一個簡單的估計,簡單來說如果我們提升F1-Score 0.01點,那麼大概會有18個樣本得到改善,假設一個樣本點依照資料集的借款額度估計取平均借款10,000元就是18萬,而這僅僅是提升F1-score 0.01而已,因此在這個專案中我們知道必須改進模型來取得更好的商業效益。
第五步:資料分析
建立完Baseline,我們可以針對重要指標建立更多特徵與進一步分析資料,通常資料分析的流程會建議EDA在最前頭就做,但是為什麼我保留到建立完Baseline才開始呢?
- 資料欄位眾多,沒有目的EDA不夠有效率,從特徵重要性開始預期效率較高
- 商業分析階段已經初步建立對資料概念,滿足EDA其中了解資料的目的
- 快速建立比較基準才方便有目的的持續優化改進模型,EDA的效益得以被放大
可以進一步探索資料了解P2P模式,EDA主要給我幾個啟發:
- 了解商業模式與關鍵數字
- 比較違約與非違約特徵差異
- 觀察新特徵對模型的解釋效果
- 移除掉重複特徵
另外因為變數眾多,所以我有import以前寫的EDA lib 幫助更有效率資料視覺化方便分析:
了解商業模式與關鍵數字
比如平均貸款利率的分布狀況,也可以根據貸款目的可以特別標注特定詞,比如通常債務重組與商業貸款的現金流緊張很多,違約可能性會提高。
比較違約與非違約特徵差異
比如比較違約者與非違約者的利率狀況:驗證通常違約者的貸款利率也比較高(貸款利率高其實反映他比較不穩健)
觀察新特徵對模型的解釋效果
看看收入離散化的特徵是否更好解釋違約率:
income,可以看到收入高、Int rate就低,且申請金額更高,這是make sense的
移除掉重複特徵
或者發現重複特徵,比如申請金額(表示想要的資金大小)差異不大,應該是因為平台規範的關係,融資也是,換句話說這兩個特徵其實重複了。
第 N 步:策略分析 — 而後循環往復
而我們也嘗試了幾個不同的策略,比如說以風控評分卡常用的WOE特徵轉換取代掉原本PCA編碼的方式,以embedding 編碼貸款相關描述來得到金融風控領域知識的表徵,或者我也有去參考一些文獻或者論文,但多數都蠻水的XD
當然也有去看業界的金融科技風控做法,比如嘗試螞蟻金服提出的gcForest。
主要是做資料科學的過程中我會先想幾個策略,在開會的時候(我們是一週一次)提出來分配與回報進度,這樣會比較清楚大家目前的進度,也很感謝組員都提出了讓模型表現更好的做法,除了第一週比較花時間(也許4~6hr),後面我基本上一週也只花了1~2hr就取得不錯的結果。
而多輪改善之後,納入了一些特徵與改變方式,同時做完Model Stacking 我們得到了最終模型,相比第一個模型F1-score提昇了不少:
決賽:報告模型與提出落地注意事項
當然報告階段也要好好思考匯報的事項,畢竟多數評審可能已經不太看技術而是在意落地性與商業效益,除了資料故事,這邊我也歸納了幾個金融科技在P2P方面可以優化的方向,主要是回到商業分析的結果來思考P2P模式與貸款的商業效益(比如這個命題要怎麼樣納入成本與效益因子?),落地應注意事項與改進方向摘要如下:
變數在商業流程的可取得性
風險管理分為貸款前、中、後三個階段,如果我們的模型作為貸前風控手段,那麼特定變數如A、B、C這些貸後資料都會影響我們訓練模型的效果,因為對於新的會員與借貸者我們並沒有這樣的資料
模型部分加強識別高風險借款人
從模型解釋性我們也可以看到因為數據量大的關係,還是有一些極端的雜訊在裡面,這可能使得我們的模型無法捕捉到這些人,必須開發更好的算法或者資料分析方法來捕捉這群人。
納入更多貸前借款人資料
研究過國外主流P2P平台後,我們認為雖然模型開發也很重要,但更齊全的資料能夠使我們對於評估貸款人的信用風險更有信心,而除了銀行徵信資料,其他如電子商務消費資料、支付業者消費紀錄等都預期可以增強模型的預測能力,這些新興企業也是企業在落地風控系統時可以考量的合作對象。
結合機率模型評估潛在損益
在這場比賽中我們僅預測一個人是否違約,但實務上每個借款人違約會依據借款金額大小對企業造成不一樣的損失,因此在試算損益時可以進一步納入借款金額大小來估計損失,預期隨著借款金額越高,我們對於該借款人的信用評估越嚴格,而這部分也可以與領域專家進一步討論設計合理的AI預測閥值,分門歸類在不同的借款額度下需要多少信心才允許放款。目前我個人也在研究因果推論於機器學習的應用,之後可以更穩健評估資料科學帶來的商業效益與做到更細緻的分析洞察。
而評審提問階段我也回答了幾個知識點,多數人在意的無非「怎麼串接資料?」、「除了合作有沒有開放資料可以串接?」,前者可以用用戶手機號碼mapping資料表,後者我有想到幾個比如用ZipCode串接地區平均收入、地區平均職業分布再串職業平均所得……. 整體而言我認為只要時間夠多還是有很多可以改進的方向跟方法可以做。
最後,感謝我的隊友們(大文山聯盟XD)與台灣AI金融科技協會給學生這個舞台,希望之後還有更多有趣的資料可以玩,或者納入可以跟領域專家討論的環節,我很期待看到領域專家輸出知識再由資料科學相關者轉譯給模型的比賽,那應該會十分有趣XD
那麼以上就是這次的競賽分享,綜合取得了第五名的成績,感謝您的收看,歡迎對數據分析、商業策略有興趣的讀者追蹤,我們下一篇文章見!
歡迎想學習Python資料科學、商業分析、金融知識的人一起交流!本部落格的內容全部都是基於「分享」的實作、理論兼顧文章,希望能夠幫助到所有對資料科學領域有興趣的人們,長期關注可按左手邊的Follow!若喜歡我在 Medium 的內容,可以拍個手(Claps)這邊想做個實驗,好讓我知道你/妳喜不喜歡這篇文章:
拍 10 下:簽個到,表示支持(謝謝鼓勵!)
拍 20 下:想要我多寫「商管相關」
拍 30 下:想要我多寫「資科相關」
拍 50 下:我有你這讀者寫這篇也心滿意足了!
敬請期待下一篇!或是您也可以逛逛我的其他資料科學文章,到我的主頁置頂文章獲得良好的目錄體驗。
數據分析系列
Python資料科學系列:
- 【Python實作】生活中的資料科學,用模型挑出高C/P智慧型手機
- 【Python實作】Back to E’shanzen資料科學的商業分析
- 利用集群分析掌握消費者輪廓
- 利用Airbnb來更了解居住城市,以臺北為例 Python實作
- 學生社團的數據分析,Python線上課程分析實作
看我用金融的概念解釋AI:
人工智慧商務系列:
如果想跟著我實作資料科學,開始寫程式必知必會基礎系列: