作者:黃天元,復旦大學博士在讀,熱愛數據科學與R,熱衷推廣R在工業界與學術界的應用。知乎專欄:R語言數據挖掘 郵箱:[email protected].歡迎合作交流。

相關連接:

HopeR:R語言信用評分卡:拒絕推斷(1) 問題定義

HopeR:R語言信用評分卡:拒絕推斷(2) 特徵篩選A

HopeR:R語言信用評分卡:拒絕推斷(3) 特徵篩選B

HopeR:R語言信用評分卡:拒絕推斷(4) 特徵工程A

HopeR:R語言信用評分卡:拒絕推斷(5) 特徵工程B

HopeR:R語言信用評分卡:拒絕推斷(6) 重抽樣

HopeR:R語言信用評分卡:拒絕推斷(7) 最小樣本量確定

HopeR:R語言信用評分卡:拒絕推斷(8) 動態建模A

提要:

Hope現在作為金融風控分析師就職於A金融公司,之前的風控模型在1月份違約率為6.5%,2月份調整之後達到了4.7%,可喜可賀。目前假設模型是相對穩定的,但是模型參數的權重卻會隨著時間發生變化,因此需要設置滑動窗口建立動態模型。也就是說,如果實時能夠獲得新的用戶數據,這些數據會馬上被用於創建新的模型,而很久以前的數據會被排除,不再用於建模。先來觀察數據表:

loan_dt為借出的時間,label為實際是否違約(1為違約),tag為是否允許放款(1為未允許)。我們不知道違約的時間,因此我們假設還款時間due date與借款時間loan date成正比例,因此直接用借款時間作為還款時間來建模(沒有數據,也是沒辦法...)。我們先來進行探索性數據分析。

我們在不同的時間,有多少用戶申請貸款呢?

raw_win %>%
count(loan_dt) %>%
ggplot(aes(loan_dt,n)) +
geom_line()

這個波動性感覺有點意思,不過先不深究了。那我們有多少有效數據(能夠最後知道用戶是否違約的)呢?有效數據中違約和不違約的數量相對多少是如何的呢?

raw_win %>%
filter(!is.na(label)) %>%
count(loan_dt,label) %>%
ggplot(aes(loan_dt,n,colour = as.factor(label))) +
geom_line()

上圖中,藍色線條是違約用戶的數量,紅色是沒有違約的用戶數量。我們看到藍色的用戶數量非常地少,因為模型是奏效的,所以違約的用戶被控制到一定範圍以內。

要建立動態模型,模型中的數據樣本一定要合理。這個合理性體現在兩方面:1、樣本量足夠大,能夠建立穩健的模型;2、響應變數的比例要合理,如果在一定時間內違約用戶數量太少,這樣建模明顯會有嚴重的類失衡問題,也不利於建模。

從策略上來講,如果滑動窗口檢測的違約樣本比例較少,說明這段時間內在上一期模型奏效,沒有必要繼續建立新的模型。如果違約樣本較多,則說明上一期模型失效,是時候建立新的模型。需要明確一點,新的模型不一定就好,舊的模型不一定就差,主要是看是否滿足這麼一個假設:隨著時間的改變,LR模型中每一個特徵所佔的權重已經改變,而且嚴重地影響了預測的準確性。而時間臨近的數據,更能夠表徵近期的用戶違約狀況,老的數據則「過時」了,會誤導模型的學習。

從極端的角度來說,如果我們認為模型沒有時效性,能夠得到永恆的真理,那麼我們就可以用全樣本來做,然後得到一個非常穩健的模型。另一個極端就是,我們認為模型一直在變,甚至天天變,那麼有新的數據進來,我們就用當天的數據做模型,然後來預測第二天的違約情況。一般不會走極端,而是在兩個極端之間找到一個平衡點,從而我們得到更新模型的最佳時機,以及每次建模應該用多長的時間窗口作為數據來源。

現在,我們需要得到兩個東西:1、模型更新的時機選擇:如果違約率突然升高(可以是每天的違約率,也可以是累計近n天的違約率),那麼把新的違約樣本納入模型,進行模型更新;2、模型時間窗口長度的確定:上一個項目中的n如何確定?這取決於樣本量是否夠大,已經違約樣本是否夠多。還有一個有意思的想法就是,近n天的違約率是否能夠作為一個新的特徵,來預測未來的違約率?

這個規則已經比較複雜,遲些有時間再試。


推薦閱讀:
相關文章