Loan default predictor(貸款違約預測)

Loan default predictor 

(貸款違約預測)

--- dylan at  2014-3-16

 

一:背景

Kaggle發佈了一個涉及貸款違約預測的比賽,時間週期2個月(2014/01/17 -- 2014/03/14)。 其實,之前kaggle很久之前有過關於貸款相關信用預測的比賽。但是,這次和上次的情況很不同,挑戰也更大。傳統的金融相關的算法,其實是個典型二分類問題,或者說就是預測用戶是否違約,在金融風險領域二分類挑戰是正負樣本極不平衡。本次的比賽的目標是要求參賽者預測樣本是否違約以及如果違約,違約的百分比是多少。所以,本次比賽可能讓參賽者能設計出色的分類模型,也要能很好設計迴歸模型。

 

二:評估指標

說到評估指標值得提一下,本次比賽的評估指標是MAE,不是以往的RMSE,金融界貌似挺喜歡MAE來作爲評估指標,MAE貌似能很好評估長尾。我們知道現在很多的模型,比如linear model用的是最小二乘來優化,random forest優化的是mse等,所以,如何找到一個優化mae的模型是本次的挑戰。

MAE 評估指標如下:

 

 

三:訓練集和測試集數據分佈

訓練集大約有10w個樣本,loss= 0 / loss !=0 約等於 9:1

測試集大約有20w樣本。

780個左右的特徵,其實,真正有用的特徵不到200個左右,很多特徵之間具有很強的相關性,有些特徵在所有的訓練樣本上值都一樣,這樣的特徵是沒有用的。

Loss值分佈0-100,是數據集發佈者對違約情況做了量化處理。

來看看loss分佈,如Fig. 1,典型的長尾分佈。如何預測長尾,同時不影響非長尾部門的預測精度是一直是學術界和工業界的難點。

 

 

Fig. 1   loss 直方圖分佈

 

 

 

模型建立

整個預測模型分位2個部分: 分類預測和迴歸預測。第一步:分類預測,建立二值分類器,預測違約與否。第二步:在第一步基礎上對那些已經預測是違約的樣本,建立迴歸模型預樣本違約量化值(1-100)。

 

4.1 分類模型

4.1.1 數據預處理

   對那些loss >0 樣本,目標值設爲1.這樣就構建了二分類數據集。

  train_y_classify = np.asarray([1 if item > 0 else 0 for item in train_y])

4.1.2 特徵提取

實驗發現,有一個gold-feature對分類器auc的提高有個明顯的提升,這些特徵是f528 - f527 或着是f528- f274f528,f527, f274幾個特徵具有明顯的強相關性。這幾特徵其實就能讓auc值達到0.9+

 X = np.array([datas[:,521] - datas[:,520]]).T    

 X =np.hstack((X,np.array([datas[:,521]+ datas[:,520]]).T))

 X = np.hstack((X,np.array([datas[:,521]- datas[:,271]]).T))

 X = np.hstack((X,np.array([datas[:,521] + datas[:,268]]).T))

X = np.hstack((X,datas[:,0:datas.shape[1]]))

對這些特徵,我們最後根據重要性選取前150個特徵。特徵重要性計算方法:像randomforest, GBR模型都是能計算特徵重要性的。

實驗中,我用貪婪方式選取最大auc值得特徵組合,但是發現在cv上效果反而降低了,所以後來就放棄這種特徵選取方法了。

 

4.1.3 分類器模型

LogisticRegression 模型:

 clf_model = LogisticRegression(penalty='l1', dual=False, tol=0.0001,C=1e20, fit_intercept=True, intercept_scaling=1.0,class_weight='auto', random_state=None)

 

GradientBoostingClassifier 模型:

clf_model = GradientBoostingClassifier(n_estimators=200, learning_rate=0.3,min_samples_split=30, min_samples_leaf= 5)

對於上面兩個分類器模型, logistic regression auc0.98左右, GBM分類器auc能達到0.997.

GBM ROC 曲線如下:


 

 

GBM 預測概率分佈 曲線如下:

(註釋: 看起來不像長尾分佈)

 

 

 

4.2 迴歸模型

4.2.1 數據預處理

從原始訓練集中取出用於迴歸模型的訓練集: 把那些loss >0 樣本作爲本階段的訓練集,再加上少許loss =0 樣本(主要是爲了進一步降低上一步中分類器的錯誤)。

train_regressor_index = np.where(train_y >0)[0]    

train_x_regressor = train_x[train_regressor_index]

train_y_regressor = train_y[train_regressor_index] 

 

# add little y = 0 sampls;

 y_zero_index = np.where(train_y == 0)[0]

zeor_sample_indx = random.sample(y_zero_index, 300)

 train_x_regressor = np.vstack((train_x_regressor, train_x[zeor_sample_indx,]))

 train_y_regressor = np.hstack((train_y_regressor,  train_y[zeor_sample_indx]))

 

4.2.2 特徵選取

 X = np.array([datas[:,521] - datas[:,520]]).T    

 X = np.hstack((X,np.array([datas[:,521] + datas[:,520]]).T))

 X = np.hstack((X,np.array([datas[:,521] - datas[:,271]]).T))

 X = np.hstack((X,np.array([datas[:,521] + datas[:,268]]).T))

 X = np.hstack((X,datas[:,0:datas.shape[1]]))  

 

分類器特徵和迴歸的特徵是分開來計算的。

迴歸模型會取150個最重要的特徵作爲最後的特徵。

 

4.2.3 模型

同樣是採用GBM 模型。

regressor_model= GradientBoostingRegressor(n_estimators=200, learning_rate=0.1,                              min_samples_split=30, min_samples_leaf= 5, loss='lad')

值得提到是loss = 'lad', 因爲本次評估目標是MAE,所以設定loss = 'lad'對最後的結果有很好的提升。

訓練的時候,對目標值loss做一個log變換,這樣會使結果mae值有一個0.01的提升(我的提交結果中沒有包含這個變化,但是其他排在前面的參賽者採用該方法)。至於爲什麼? 有待研究。

還有值得一提的是,我不是直接對所有迴歸訓練集對GBM訓練,然後預測測試集,而是採用cv的方式來做預測,採用20cv,每次取19/20迴歸訓練集來訓練,然後預測測試集。最後把取這20cv預測結果的中值作爲最後的測試集預測值,這種cv的方法能讓mae值提升0.01


 

五:預測結果

採用常用的5cross-validation,沒用採用對losslog變換的前提下,我的cv結果大約是0.47leaderboard結果是0.48526, 排名是39/677(一共提交26個結果),加上log變換的cv結果是mae=0.4619 , auc  =  0.997, leaderboard的結果如下:

 

 

 

 

 

 

比賽結束後,loss加上log變換後:


 

  比賽結束前,我的結果:

 

 Leaderboard 第一名成績0.43732 baseline0.833.

  下面貼上實驗結果(其中一個cv結果)Fig. 2, 可以看到,我的模型在長尾預測上的效果並不好,同時,隨着loss值得增加,誤差呈現線性增長趨勢。我曾經試過重採樣的方法來降低長尾的誤差,但是效果不理想,因爲這個時候,長尾的誤差是降低了,但是非長尾的部分結果變差了,導致最後的mae值變得更高。

 

Fig. 2  loan default 預測結果圖

 

 

 

 

六:總結

通過這個比賽,我在分類方法和迴歸預測上的水平有了不錯的提升,尤其是迴歸方法上。現在越來越覺得machine learning & data mining就是各種trick,有經驗的人trick技巧就很豐富,比如,上面的提到對losslog變換,然後再做迴歸。其實,對於本次比賽,數據是不平衡的,我曾經查閱過很多learning for imbalance data,上面提到的各種欠採樣,重採樣的技術,但是,我在這次的實驗中,發現幾乎對預測結果沒什麼幫助,反而讓結果變得更差, what is happened? learning for imbalance data 是否靠譜?

 

七:參考文獻

 

[1] http://www.kaggle.com/c/loan-default-prediction

[2] http://scikit-learn.org/

[3] Liang J. Predicting borrowers’ chance of defaulting on credit loans[J].

[4] Dmytro G, Katerina V. Loan Default Prediction in Ukrainian Retail Banking[R]. EERC Research Network, Russia and CIS, 2013.

[5] He H, Garcia E A. Learning from imbalanced data[J]. Knowledge and Data Engineering, IEEE Transactions on, 2009, 21(9): 1263-1284.

[6] Ting K M, Witten I H. Stacked Generalization: when does it work?[J]. 1997.

[7] Breiman L. Stacked regressions[J]. Machine learning, 1996, 24(1): 49-64.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章