BulletTech官方微信 2021-08-15 19:10:39 阅读数:524
去年九月份參加了天池舉辦的零基礎入門金融風控-貸款違約預測比賽,賽題以金融風控中的個人信貸為背景,要求選手根據貸款申請人的信息預測其是否有違約的可能,以此判斷是否通過此項貸款,是一個典型的分類問題。
賽題數據來源於某信貸平臺的貸款記錄,總數據量為120W,訓練集,測試集A,測試集B數據量各比特80W,20W,20W。原數據中包含47列變量信息,主要包括:貸款信息(金額,利率,貸款等級等),貸款人信息(就業信息,收入信息,債務比,FICO(一種信用評分),貸款記錄等),貸款人行為計數特征信息(匿名特征)。查詢完整的字段錶可以訪問賽題官網"賽題官網",或點擊閱讀原文查看我們Blog上的文章。
Field | Description |
---|---|
id | 為貸款清單分配的唯一信用證標識 |
loanAmnt | 貸款金額 |
term | 貸款期限(year) |
interestRate | 貸款利率 |
installment | 分期付款金額 |
grade | 貸款等級 |
subGrade | 貸款等級之子級 |
employmentTitle | 就業職稱 |
employmentLength | 就業年限(年) |
homeOwnership | 借款人在登記時提供的房屋所有權狀况 |
annualIncome | 年收入 |
verificationStatus | 驗證狀態 |
issueDate | 貸款發放的月份 |
purpose | 借款人在貸款申請時的貸款用途類別 |
postCode | 借款人在貸款申請中提供的郵政編碼的前3比特數字 |
regionCode | 地區編碼 |
dti | 債務收入比 |
delinquency_2years | 借款人過去2年信用檔案中逾期30天以上的違約事件數 |
ficoRangeLow | 借款人在貸款發放時的fico所屬的下限範圍 |
ficoRangeHigh | 借款人在貸款發放時的fico所屬的上限範圍 |
openAcc | 借款人信用檔案中未結信用額度的數量 |
pubRec | 貶損公共記錄的數量 |
pubRecBankruptcies | 公開記錄清除的數量 |
revolBal | 信貸周轉餘額合計 |
revolUtil | 循環額度利用率,或借款人使用的相對於所有可用循環信貸的信貸金額 |
totalAcc | 借款人信用檔案中當前的信用額度總數 |
initialListStatus | 貸款的初始列錶狀態 |
applicationType | 錶明貸款是個人申請還是與兩個共同借款人的聯合申請 |
earliesCreditLine | 借款人最早報告的信用額度開立的月份 |
title | 借款人提供的貸款名稱 |
policyCode | 公開可用的策略_代碼=1新產品不公開可用的策略_代碼=2 |
n系列匿名特征 | 匿名特征n0-n14,為一些貸款人行為計數特征的處理 |
賽題需要參賽者輸出每個測試樣本為1(違約)的概率,以AUC為指標評估模型,如若模型輸出有:
id | isDefault |
---|---|
800001 | 0.7 |
則代錶模型預測id為80001的貸款違約概率為70%。
該部分主要為了了解數據類型,各種特征的數據分布和缺失值情况,並了解特征間的相關關系以及特征和目標值之間的相關關系。為接下來對數據進行簡單清洗做准備。
整體而言賽題數據相對幹淨,通過箱線圖發現有一些數值特征中存在明顯的异常值,决定使用箱型圖+3-Sigma進行去除。對於缺失值,選擇先構造一個新字段記錄一個樣本中缺失特征/總特征數量的比例(missrate),再用縱向填充的方法填充缺失值。此外通過計算Pearson相關系數可以看出有幾對相關度很高的變量,例如匿名變n2-n3-n9,保留一個變量即可。
經過EDA可以發現特征中有較多離散型變量,如貸款等級,工作職稱,貸款目的,郵編等等,這些變量需要通過一定的編碼方法進行變換。常見的one-hot encoding對於較低維度的變量(unique values < 100)效果不錯,但是如果應用在高維變量上(如郵編,職稱等),會產生過於稀疏的矩陣,導致每個類別裏可以學習的數據過少。所以對於高維變量,一種比較有效的編碼方式是target encoding,即用類別對應的標簽的期望來代替原始的類別,這樣相當於將高維的離散變量轉換成了在0-1之間的數字變量。比較常用的定義方式為:
其中p為全部標簽的均值,alpha為系數,用於控制該變量對依賴變量的擬合程度。
特征交互方面,簡單構造了一些可能有實際意義的交互特征,這一部分的業務經驗不多,有經驗的小夥伴歡迎在評論區分享一下特征構造的思路。
# 利率/貸款總額
data['interestRateOLoanAmnt'] = data['interestRate']/data['loanAmnt']
# 年收入/貸款總額
data['annualIncomeOLoanAmnt'] = data['annualIncome']/data['loanAmnt']
# 年收入/就業年限
data['annualIncomeOImploymentLength'] = data['annualIncome']/data['employmentLength']
# 年收入*就業年限
data['annualIncomeMImploymentLength'] = data['interestRate']*data['loanAmnt']
# 未結信用額度的數量/當前的信用額度總數
data['openAccOTotalAcc'] = data['openAcc']/data['totalAcc']
# 未結信用額度的數量/最早信用額度開立距今時間
data['openAccOEarliestCreditLine'] = data['openAcc']/data['earliesCreditLine']
# 貶損公共記錄的數量/貸款發放距今時間
data['pubRecOissueDate'] = data['pubRec']/data['issueDate']
最後根據EDA中的相關系數計算,去除了有高相關性的特征n2,n3(匿名變量,隨機去除)和只有唯一值的特征,加上離散特征一共保留了約150個特征。
模型訓練部分的思路是嘗試構造幾個錶現較强的單模型,再進行模型融合。一共嘗試了 XGBoost, Light-GBM, Catboost以及MLP(4 layers) 4種模型,訓練時對模型進行獨立的參數優化。CatBoost 模型本身就可以很好地處理離散特征,並且碰巧它也是使用基於target encoding衍生的方法處理高維離散特征,所以使用CatBoost時省略了對離散特征進行預處理的步驟。此外對MLP模型處理之前,額外嘗試了使用自動編碼器進行變量交互,但是效果明顯不如Boosting模型。
為了沖刺競賽排名,模型融合也比較關鍵。我選擇了錶現較强的的三個Boosting模型,用簡單加權平均(每個模型權重相同)的方法進行ensemble,讓AUC成績由單模型的0.7342提高到最終的0.7397。
4個單模型的訓練錶現如下:
模型 | Training AUC | Validation AUC | Test AUC * |
---|---|---|---|
XGBoost(baseline) | 0.7845 | 0.7367 | - |
Light-GBM | 0.7407 | 0.7351 | - |
CatBoost | 0.7446 | 0.7434 | 0.7342 |
MLP | 0.7263 | 0.7247 | - |
從模型對比來看,XGBoost的過擬合現象較為嚴重,LightGBM 比較均衡,CatBoost泛化能力很好並且錶現出眾。XGBoost模型中,超參數min_child_weight的值相對其他LightGBM中較小,這可能是模型過擬合的原因。CatBoost的優秀錶現主要得益於對類別變量的强大處理能力。MLP模型錶現一般,可能是數據規模還沒有足够大到讓它能够完全發揮挖掘非線性特征的能力。
三個Boosting模型對特征重要性的評估略有區別,比較明顯的區別是CatBoost模型中,離散數據的重要性普遍較高。以CatBoost的SHAP值為例,最重要的特征有點出乎意料地是申請人職稱,此外,貸款期數,貸款子級,地區郵編,債務收入比等也有較高的SHAP值。對於數值型特征而言,三個模型的排序基本相似。在特征工程中構造的少數幾個變量如審批時間,有效賬戶/總賬戶比也有幸被選進重要度前20。
這次的賽題是一個經典的機器學習分類預測問題,Boosting模型實乃這種數據量的比賽中的大殺器,其中CatBoost又尤為適合挖掘離散型變量。再利用模型融合,最終在正賽階段排名榜的Top30。但是由於業務經驗有限,在特征工程方面給模型錶現帶來的提昇不多,這應該是後期模型錶現優化的主要方向。
版权声明:本文为[BulletTech官方微信]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815191017813p.html