Kaggle大賽:債務違約預測冠軍作品解析
債務違約預測
債務違約預測是Kaggle中的一個比賽,本文將介紹取得第一名成績的方法,本次比賽的目標包括兩個方麵。其一是建立一個模型,債務人可以通過它來更好地進行財務方麵的決策。其二是債權人可以預測這個債務人何時會陷入到財務方麵的困境。最終目的是,通過預測未來兩年內債務違約的概率,來改進現有的信用評分製度。這是一個極度複雜和困難的Kaggle挑戰,因為銀行和各種借貸機構一直都在不斷地尋找和優化信用評分的算法。這個模型是銀行用來判定是否準許某一筆貸款的。根據這個模型提供的信息,銀行可以更好地作出決策,借貸者也可以更好地進行財務方麵的規劃,以免將來陷入債務危機。
本次挑戰允許團隊使用集成模型和算法,如XGBoost, Gradient Boosting, 隨機森林(Random Forest), 限製玻爾茲曼機(Restricted Boltzman Machine Neural Networks), Adaboost。以及使用先進的堆疊技術(stacking)和投票分類器來準確地預測違約概率。
我們的測量和排名嚴格使用ROC曲線的AUC值。我們遵照了Agile過程,來確保我們分塊、並行地完成關鍵的任務。我們很快地失敗,又很快地在此基礎上迭代,以此來確保最高效的工作和產出。我們使用複雜貝葉斯優化算法,獲取最好的超參數集,大幅減少了測試和交叉驗證的時間。這為我們提升排名、獲得AUC最高分提供了很大的幫助。
通過我們對工具的利用、團隊的協作、以及一個使我們產出最大化的流程,我們不僅躋身排名榜的前列,還打破了第一名的成績,獲得了這次挑戰的冠軍。
◆ ◆ ◆
SWOT分析法
SWOT分析法讓我們可以讓我們思路更清晰,專注於利用我們最大的優勢(Strengths),了解我們的弱點(Weaknesses),利用現有的機會(Opportunities),警惕潛在的威脅(Threats)。
SWOT方法使我們可以在正確的方向前進,避開很多令人頭疼的事兒。
優勢(Strengths):利用我們已有的優勢
-
利用堆疊技術和Agile過程的經驗
-
協作團隊的經驗和技能可以相互補充
-
吸取之前的Kaggle挑戰的經驗和教訓
-
使用Agile過程處理並行工作的經驗
弱勢(weaknesses):我們需要提升的領域
-
時間有限,限製了探索的深度和廣度
-
對新工具和模型的不熟悉,大大降低了我們的戰鬥力
-
邊做邊學,拖慢了整個進程
-
對於所使用的新技術,相關的資源十分稀少
機會(opportunities):可以利用的機會,及實踐得到的經驗
-
了解如何製定策略,調整模型、算法和參數,來達到對違約幾率的最佳預測
-
在使用貝葉斯優化算法時,獲得實時的經驗
-
嚐試使用深度學習(Theano/Keras)來進行違約預測
威脅(threats):我們需要減輕和控製的危機
-
數據集比較小,這對模型的泛化有較大的挑戰。這影響了模型的構造,最終影響了預測的精度。
-
對AUC的公差嚴格到了小數點後10,000位
-
前5%的目標分數太高了-簡直不可行
◆ ◆ ◆
Agile過程
我們使用‘Agile過程’作為本項目的流程,這是由Bernard發明的。它特別為了機器學習優化過,因為他需要整合很大一塊內容,包括數據是如何被處理的,建模、測試的,以及很多更傳統的開發生命周期。
Agile過程利用了‘分塊’的概念,以一種快速的方式來完成工作任務。它整合了很多並行的任務,很快地失敗,又很快地迭代。它發揮了強大的作用,使產出最大化。這是我們在短短兩星期內獲得第一名的主要因素之一。
Agile過程是什麼?
敏捷過程是一個標準的全行業的傳統軟件開發和工程的生命周期。它基於迭代開發,需要通過發展自組織、跨職能的團隊之間的協作來進行。本工程使用的Agile是一個改進的形式,它是專門為機器學習設計的。它和傳統流程的組成部分比較相似,大多數任務是並行地而不是順序的。流程的組成部分包括數據預處理(包括缺失值插補),探索性數據分析(如單變量分布,二維分布,相關分析),特征工程(如增加特征,刪除特征,PCA),算法選擇(如有監督),超參數優化,模型擬合,模型評估,模型再造,交叉驗證,預測,以及最後的提交。不同於傳統機器學習的順序流程,一次隻能進行一個模型的選擇和調整,並且在缺失值插補的方法沒有確定之前無法進行模型的擬合。Agile過程充分利用缺失值插補,特征工程和模型擬合的並行執行,使多個人在這個項目上協作工作。
為何使用Agile過程?
在我們的團隊領導伯納德的指導下,我們腦子裏從一開始就有整個的Agile過程。由於大部分流程並行完成,並且我們每個人都分配了非常具體的任務,沒有人等著別人的結果來完成自己的工作。我們可以快速評估模型和戰術方法,並能夠快速失敗和迭代,快速搞清楚什麼可行,什麼不可行。轉化為成果方麵,就是到了第一周的周中,我們已經在排行榜上排名前100。在第一周結束時,我們到達了第2名,這給我們留下了整整一個星期去挑戰第一名。
◆ ◆ ◆
試探性數據分析
從下麵的缺失值圖像可以看出,變量‘負債率’和‘家屬數’分別有20%和3%左右的數據缺失。
我們嚐試了不同的缺失值估算方法,包括KNN,平均值,隨機數和中位數。然而,我們發現,不去補充缺失值,模型反而會有更好的表現。
我們也做了PCA。結果表明,選擇5個主成分隻能解釋總方差的66%。由於隻有10個特征,PCA可能不適合這個項目。
數據集的一個有趣的特性是,除了“年齡”,幾乎每列有一些異常值。如,列‘逾期30-59天’,‘逾期60-89天’和‘逾期90天’都有大約0.2%的異常值,異常值為98或96。這些數字實際上是在調查中輸入的,表示用戶不願意透露這些信息。這些會對單變量分布有很大的影響。還有變量循環貸款無抵押額度(RevolvingUtilizationOfUnsecuredLines),是信用卡額度和除分期付款,如購車貸款的個人限製之和除以總貸款餘額。因此,這個變量的正常範圍是0與1之間,而它有大於5000的異常值。因此,我們必須處理這個問題。
對於每一列,我們檢測基於第95百分位數的異常值,基於中位數的異常值和基於標準偏差的異常值,並用投票來決定最終結果。如果三種方法中,如果有兩種方法都認為某一個點是一個異常值,那麼我們就確定這個點是一個異常值。然後,我們將異常值替換為該列的中值或最不異常的異常值。至於使用哪種替換,取決於具體的列。
過濾掉異常值改變了原有的數據結構。在此之前,這三個異常變量是高度相關的。在濾值之後,相關性消失了。如下麵的圖片所示。
◆ ◆ ◆
特征工程
下圖是特征重要性圖示,從圖中可以看出,‘循環貸款無抵押額度(RevolvingUtilizationOfUnsecuredLines)’,‘負債率’和‘月收入’是最重要的三個變量。
這個信息對於特征工程來說是十分重要的。下麵是特征工程的工作流程。
我們嚐試了幾種不同的方法。我們把一些列組合在了一起,生成了一個新的列,並且刪除了原有的列。例如,負債率乘以月收入得到月負債。我們對違約變量分配了權重。對於每一個違約變量,我們做了一個邏輯回歸,然後使用得到的R^2除以三個R^2的和,作為它的權重。最後,我們構造了7個訓練集和7個測試集。這些數據集使樸素貝葉斯和邏輯回歸的AUC值從0.7左右提升到了0.85左右。然而,對基於樹的模型,這些數據集並沒什麼幫助。
◆ ◆ ◆
模型實施戰略
我們為了本次挑戰,構造了4個模型,並評估了他們的準確率。團隊實施了一個並行流程,所有的模型同步構造。在自動優化過程中,每發現一個更優的參數集,這些參數會用於整個流程循環,即時地進行協同工作。
簡單和集成模型:
作為構造模型的第一步,我們訓練了邏輯回歸和樸素貝葉斯模型,並且這兩個模型的精度(曲線下麵積,AUC值)都是0.7左右。上麵提到的這兩個模型提供了很好的基線,可以用於比較更加複雜的模型,比如堆疊、投票以及混合模型的表現。梯度提升和隨機森林模型作為集成模型的一部分它們的AUC評分在文檔中。
優化的堆疊模型:
堆疊模型將貝葉斯分類器以非線性的方式組合在一起。這個通過在元級別(meta-level)上的訓練集上學習,來進行組合的過程,稱作元學習(meta learner),它把獨立運算的基礎分類器集成為一個高級的分類器,這稱作元分類器(meta classifier)。這個2層的堆疊模型,使用梯度提升和XGBoost作為基礎分類器。它們的分類結果被輸入一個邏輯回歸模型,這個邏輯回歸模型就是元分類器。堆疊模型使得分達到了0.8685左右,進入了Kaggle排行榜前30名。
投票分類模型:
投票模型根據獲得最多票數的類別對沒有標簽的對象進行分類。我們使用加權平均算法,對每個分類器輸出的可能性值進行計算,得出最終預測的結果。盡管團隊開始時隻有兩個分類器,最終的結果有12個分類器,包括7個梯度提升的,1個樸素貝葉斯的,3個隨機森林的和一個AdaBoost分類器。如果測試結果表明會對交叉驗證得分的提高有貢獻的話,就會增加分類器的數量。投票模型把AUC的得分提高到了0.869左右,使我們到達了排行榜的第8名。
投票和堆疊的混合模型:
最終使我們超越現有第一名的模型,就是投票和堆疊的混合模型。這個模型包括2個梯度提升的,2個隨機森林的,1個AdaBoost分類器,1個嚴格玻爾茲曼機(estricted Boltzman Machine,RBM)。並且引入了神經網絡算法。這個模型將得分提到了0.869574,使我們Eigenauts隊成為了排行榜上第一名。
◆ ◆ ◆
貝葉斯優化
貝葉斯優化被用來做什麼?
幾乎所有的機器學習算法都包括一些超參數,也叫做調整參數。這些參數和常規參數不同,它們不是模型的一部分,不會在模型擬合中被自動調整。它們是在另外的步驟中被調整的。一些超參數的例子,包括在嶺回歸和lasso回歸中的正則項lambda、支持向量機中的C項、基於樹的算法中樹的數量(如,隨機森林、梯度提升機)。
共有4中超參數優化方法:1、網格搜索 2、隨機搜索 3、基於梯度的優化 4、貝葉斯優化。在這4中方法之中,我們嚐試了網格搜索,隨機搜索和貝葉斯優化。我們發現貝葉斯優化是最高效的,可以自動達到最優。
為什麼貝葉斯優化比網格搜索和隨機搜索更高效呢?
在尋找最優超參數值的時候,需要提前確定一些數據。首先,也是最重要的,任何算法都需要一個目標函數,來找它的最大值。或者一個損失函數,來找它的最小值。然後,需要確定搜索範圍,一般通過上限和下限來確定。可能還有一些對於算法的參數,比如搜索的步長。
網格搜索可能是應用最廣泛的超參數搜索算法了,因為它確實很簡單。網格搜索通過查找搜索範圍內的所有的點,來確定最優值。它返回目標函數的最大值或損失函數的最小值。給出較大的搜索範圍,以及較小的步長,網格搜索是一定可以找到全局最大值或最小值的。但是,網格搜索一個比較大的問題是,它十分消耗計算資源,特別是,需要調優的超參數比較多的時候(例如,隨機森林裏有8個左右)。因此,當人們實際使用網格搜索來找到最佳超參數集的時候,一般會先使用較廣的搜索範圍,以及較大的步長,來找到全局最大值或者最小值可能的位置。然後,人們會縮小搜索範圍和步長,來達到更精確的最值。盡管這樣做可以降低所需的時間,但是由於目標參數一般是非凸的,如圖1所示,所以人們常常就會錯過了全局的最大值或最小值,因為他們在第一次測試的時候找到了一個局部的最值。
隨機搜索的思想和網格搜索比較相似,隻是不再測試上界和下界之間的所有值,隻是在搜索範圍中隨機取樣本點。它的理論依據是,如果隨即樣本點集足夠大,那麼也可以找到全局的最大或最小值,或它們的近似值。通過對搜索範圍的隨機取樣,隨機搜索一般會比網格搜索要快一些。但是和網格搜索的快速版(非自動版)相似,結果也是沒法保證的。
貝葉斯優化尋找使全局達到最值的參數時,使用了和網格搜索、隨機搜索完全不同的方法。網格搜索和隨機搜索在測試一個新的點時,會忽略前一個點的信息。而貝葉斯優化充分利用了這個信息。貝葉斯優化的工作方式是通過對目標函數形狀的學習,找到使結果向全局最大值提升的參數。它學習目標函數形狀的方法是,根據先驗分布,假設一個搜集函數。在每一次使用新的采樣點來測試目標函數時,它使用這個信息來更新目標函數的先驗分布。然後,算法測試由後驗分布給出的,全局最值最可能出現的位置的點。
對於貝葉斯優化,一個主要需要注意的地方,是一旦它找到了一個局部最大值或最小值,它會在這個區域不斷采樣,所以它很容易陷入局部最值。為了減輕這個問題,貝葉斯優化算法會在勘探和開采(exploration and exploitation)中找到一個平衡點。
勘探(exploration),就是在還未取樣的區域獲取采樣點。開采(exploitation),就是根據後驗分布,在最可能出現全局最值的區域進行采樣。
我們用於進行貝葉斯優化的包是一個Python包,叫做“bayes_opt”。下麵的視頻(https://blog.nycdatascience.com/wp-content/uploads/2016/09/bayes_opt_visualisation.mp4)顯示了“bayes_opt”包是如何保證勘探和開采的平衡的。
何時貝葉斯優化無法返回最優值?
貝葉斯優化,盡管比網格搜索和隨機搜索要好一些,但是它也不是魔法,所以有些東西還是要好好考慮一下。根據我們的經驗,迭代次數(也就是選取采樣點的數量),和搜索範圍的大小的比值,十分重要。讓我們假想一個極端的例子,來說明這一點。想象你要調整兩個超參數,每個參數的範圍是從1到1000.然後你把迭代指數設置成了2,算法幾乎肯定會返回一個錯誤結果,因為他還沒充分學習到目標函數的形狀。
◆ ◆ ◆
登頂之路
◆ ◆ ◆
ROC/AUC曲線
畫出接受者操作特性曲線(ROC)可以看出預測違約或不違約的二分類器的表現。這個圖像是最後的混合模型,它在Kaggle榜單上得到了第一名。在ROC曲線中,真正率(或靈敏度)是對於參數不同切分點的假正率(100-靈敏度)的函數。
ROC曲線的曲線下麵積(AUC)是對於一個參數分割兩組數據的效果的度量,在這裏是違約或不違約。根據這張圖可以看出,我們最好的模型,曲線下麵積大約是0.89。這表示,在訓練集中隨機抽取一個標簽為1(可能違約)的數據,他的得分比從訓練集中抽取的標簽為0(不太可能違約)的數據高的概率為89%。
◆ ◆ ◆
結果和發現
下麵使我們基於特征工程和預測模型在用戶債務違約數據的表現,得到的結果和發現。
-
模型在不進行缺失值查補的情況下,表現好像更好一點。
-
相比於簡單的集成模型,堆疊和投票,以及兩者的結合,一般會有更高的預測能力。
-
對於簡單模型(樸素貝葉斯和邏輯回歸),特征工程可以把AUC的分數中0.7左右提到0.85左右。但是對於基於樹的方法,這並沒什麼用。
-
當我們向著Kaggle榜的前2%接近的時候,對於AUC,每提升0.0001,會變得越來越難。
◆ ◆ ◆
得到的經驗以及一些見解
這個項目讓團隊學習到了很多關於機器學習和預測模型的寶貴的經驗。它們使我們在這樣高度競爭的數據科學競賽中拿到了第一的好成績:
-
超參數調整是十分耗時的,最好把它進行團隊分工,並行工作。
-
交叉驗證十分關鍵,在測試不同數據集對模型準確度的影響上話時間是很值當的。
-
模型的調整應該在更高精度上進行,因為數據集比較小。(不論是特征的數量還是數據的條目)
-
遵照Agile並行進程,它被證明是一個使成功最大化的因素。
◆ ◆ ◆
後繼的工作
當我們考慮還可以做什麼的時候,一些事情來到了我們的腦海。這些任務可以看作是將來提高的一個願景。
-
使用Theano / Keras來進行深度學習模型的調整,並且比較它和堆疊、投票算法的準確度和表現。
-
嚐試增加新的特征多項式,以及轉化過的特征,並衡量預測的精度。
原文發布時間為:2016-10-20
本文來自雲棲社區合作夥伴“大數據文摘”,了解相關信息可以關注“BigDataDigest”微信公眾號
最後更新:2017-06-01 14:01:47