控大賽數(shù)據(jù)集解析:從原始數(shù)據(jù)到風(fēng)控模型實(shí)戰(zhàn))
簡(jiǎn)介面向金融風(fēng)控學(xué)習(xí)與競(jìng)賽實(shí)戰(zhàn)的ppd拍拍貸風(fēng)控大賽數(shù)據(jù)集適合數(shù)據(jù)科學(xué)初學(xué)者、信貸風(fēng)控從業(yè)者及Kaggle/科賽類競(jìng)賽選手用于練習(xí)信用風(fēng)險(xiǎn)評(píng)估、用戶違約預(yù)測(cè)等建模任務(wù)。壓縮包共176個(gè)文件以20個(gè)csv核心數(shù)據(jù)文件為主輔以xlsx表格、ipynb分析腳本、png/jpg圖表及html/css/js頁(yè)面素材整體約37.37MB可直接用于建模訓(xùn)練與特征工程復(fù)現(xiàn)。目前已有1120人學(xué)習(xí)/下載。通過(guò)這份數(shù)據(jù)可以體驗(yàn)從特征工程、模型構(gòu)建到風(fēng)控策略制定的完整流程參考notebook中的建模思路嘗試邏輯回歸、隨機(jī)森林或深度學(xué)習(xí)方案并利用AUC-ROC等指標(biāo)評(píng)估模型區(qū)分違約用戶的能力兼顧模型可解釋性與業(yè)務(wù)落地需求是入門金融風(fēng)控與備賽的實(shí)用資料。 做數(shù)據(jù)競(jìng)賽或者信貸風(fēng)控這行的估計(jì)都繞不開(kāi)一個(gè)名字ppd拍拍貸風(fēng)控大賽。這個(gè)比賽當(dāng)年在圈子里熱度很高原因很簡(jiǎn)單——它是國(guó)內(nèi)少有的、真正開(kāi)放真實(shí)信貸業(yè)務(wù)數(shù)據(jù)的比賽不是那種隨便造點(diǎn)合成數(shù)據(jù)糊弄人的。我手頭這份“ppd拍拍貸風(fēng)控大賽數(shù)據(jù)集.7z”壓縮包不大但里面裝的東西夠一個(gè)新手從零開(kāi)始走完一整套風(fēng)控建模流程也夠老手拿來(lái)驗(yàn)證自己新的特征工程思路。這篇東西我想好好拆一下這個(gè)數(shù)據(jù)集里面到底有什么、每張表能挖出什么信息、怎么從原始數(shù)據(jù)一步步走到一個(gè)能用的風(fēng)控模型以及我在實(shí)際跑這個(gè)數(shù)據(jù)集時(shí)踩過(guò)的坑。無(wú)論你是準(zhǔn)備入門金融風(fēng)控、想練手特征工程還是想復(fù)現(xiàn)一下當(dāng)年優(yōu)勝者的思路這篇應(yīng)該都能幫上忙。1. 賽題背景與數(shù)據(jù)集全貌1.1 拍拍貸風(fēng)控大賽到底在干什么拍拍貸是國(guó)內(nèi)最早做P2P網(wǎng)貸的平臺(tái)之一業(yè)務(wù)模式說(shuō)白了就是撮合借貸。平臺(tái)上借錢的人成千上萬(wàn)平臺(tái)方最關(guān)心的問(wèn)題就一個(gè)這筆錢借出去對(duì)方能不能按時(shí)還所以風(fēng)控就是P2P平臺(tái)的命門而這個(gè)大賽的核心任務(wù)就是讓參賽者基于平臺(tái)提供的真實(shí)脫敏數(shù)據(jù)去預(yù)測(cè)借款用戶是否會(huì)逾期。具體到建模目標(biāo)這是一個(gè)典型的二分類問(wèn)題——預(yù)測(cè)用戶“逾期”還是“非逾期”。但這個(gè)數(shù)據(jù)集的難點(diǎn)不在于算法多復(fù)雜而在于特征極其稀疏、極其碎片化。用戶的還款能力、還款意愿都藏在各種行為記錄里需要你去拼湊、去解讀。所以這個(gè)比賽本質(zhì)上考的是特征工程能力和對(duì)業(yè)務(wù)的理解而不是誰(shuí)會(huì)用更花哨的深度學(xué)習(xí)模型。1.2 壓縮包內(nèi)文件結(jié)構(gòu)與數(shù)據(jù)表解壓.7z之后你會(huì)看到幾個(gè)csv文件這就是整個(gè)數(shù)據(jù)集的核心資產(chǎn)。不同渠道流出的版本表結(jié)構(gòu)可能略有出入但大體上包含以下幾張表表名大致內(nèi)容核心價(jià)值user_info用戶基本信息年齡、性別、教育程度等用戶畫像底座user_repay歷史還款記錄評(píng)估歷史信用行為user_loan借款記錄金額、期限、利率等借款行為畫像bill_detail賬單明細(xì)應(yīng)還、實(shí)還、還款時(shí)間還款能力與習(xí)慣login_info登錄日志登錄頻次、時(shí)間段行為活躍度與穩(wěn)定性你要注意這些都是脫敏后的數(shù)據(jù)字段名和值都做過(guò)匿名化處理。比如年齡可能是一個(gè)區(qū)間區(qū)間學(xué)歷是編碼后的數(shù)字用戶ID是隨機(jī)字符串。所以別指望直接從字段名讀懂一切很多時(shí)候需要你通過(guò)數(shù)據(jù)分布去反推字段的業(yè)務(wù)含義這也是比賽的一半樂(lè)趣所在。2. 數(shù)據(jù)內(nèi)容深度拆解與業(yè)務(wù)洞察2.1 千奇百怪的字段怎么判斷一個(gè)字段有沒(méi)有用拿到數(shù)據(jù)后第一件事不是急著建模而是遍歷每一個(gè)字段看分布、看缺失率、看和目標(biāo)變量的相關(guān)性。這個(gè)數(shù)據(jù)集里有大量字段是類別型編碼值域可能是0、1、2這樣的小整數(shù)也可能是幾百上千的ID類編碼處理方式完全不同。我一般分三步走先看缺失率超過(guò)90%的字段基本可以直接扔掉再看取值個(gè)數(shù)如果字段只有兩三個(gè)取值多半是類別標(biāo)記直接做編碼如果取值非常多且無(wú)規(guī)律可能是ID類或文本編碼要么不建模要么做頻次統(tǒng)計(jì)。最后看目標(biāo)相關(guān)性單個(gè)字段的區(qū)分度如果太低就考慮做組合特征或跨表聚合。那時(shí)候比賽群里有個(gè)共識(shí)這個(gè)數(shù)據(jù)集跨表聚合特征比單表字段好用得多。比如“過(guò)去30天內(nèi)登錄次數(shù)的標(biāo)準(zhǔn)差”、“歷史借款金額的均值與最大值的比值”這些特征是從login_info和user_loan兩張表聚合出來(lái)的信息量遠(yuǎn)大于原始字段本身。2.2 一張表的秘密從user_repay看用戶還款習(xí)慣user_repay這張表很有意思它記錄了用戶每一期的還款情況。很多人一開(kāi)始只盯著“逾期標(biāo)簽”卻忽略了這張表里積累的歷史行為模式。我舉個(gè)例子兩個(gè)用戶最終都沒(méi)逾期但一個(gè)是每個(gè)月都是最后一天卡點(diǎn)還款另一個(gè)是每個(gè)月賬單日出賬當(dāng)天就還。這兩種人雖然結(jié)果一樣但信用質(zhì)量和資金緊張程度天差地別。這種差異性怎么捕捉可以在user_repay里計(jì)算“實(shí)際還款日與應(yīng)還日的時(shí)間差”然后統(tǒng)計(jì)均值、最晚時(shí)間差、準(zhǔn)點(diǎn)率等。還有一點(diǎn)這個(gè)數(shù)據(jù)集中某些版本包含“提前還款”標(biāo)記這在國(guó)內(nèi)信貸場(chǎng)景里其實(shí)是很好的信號(hào)——提前還款的人往往資金充裕或者對(duì)利息敏感逾期概率相對(duì)更低。這類細(xì)節(jié)文檔里不會(huì)明說(shuō)得自己去翻數(shù)據(jù)才能發(fā)現(xiàn)這也正是這場(chǎng)比賽真正的樂(lè)趣。3. 從原始數(shù)據(jù)到風(fēng)控模型的完整實(shí)操3.1 環(huán)境準(zhǔn)備與數(shù)據(jù)預(yù)處理既然壓縮包是.7z格式第一步自然是解壓。Windows用戶用7-Zip就能解壓Linux或macOS用戶直接用命令行解壓就行。解壓之后按表分門別類放好建議用pandas直接讀取編碼注意用utf-8或gbk看情況。數(shù)據(jù)預(yù)處理的管道我按這個(gè)順序來(lái)檢查各表主鍵確認(rèn)user_id可以關(guān)聯(lián)去掉全空列和單一取值列填充缺失值——數(shù)值型用中位數(shù)類別型用眾數(shù)或單獨(dú)標(biāo)記為-1統(tǒng)一日期格式把時(shí)間戳轉(zhuǎn)成標(biāo)準(zhǔn)datetime便于后續(xù)做時(shí)間窗口的聚合數(shù)據(jù)合并——多以u(píng)ser_info為基底表其他的按需join進(jìn)來(lái)。這里有個(gè)容易踩的坑多張表join之后行數(shù)會(huì)膨脹比如user_loan是“一用戶多借款”的結(jié)構(gòu)直接join會(huì)讓每筆借款重復(fù)用戶基本信息造成嚴(yán)重的樣本重復(fù)。正確的做法是先把跨表特征聚合好再拼接到主表而不是盲目地合并原始表。3.2 特征工程從三張表里榨出有效信息特征工程才是這個(gè)賽題的主戰(zhàn)場(chǎng)。我基于多方經(jīng)驗(yàn)和當(dāng)年比賽的討論整理一份常用特征清單基礎(chǔ)畫像特征年齡區(qū)間、性別、學(xué)歷編碼、注冊(cè)時(shí)長(zhǎng)。借款行為特征歷史借款總金額、平均每筆借款金額、最大借款金額/最小借款金額、平均借款期限、借款次數(shù)。還款行為特征歷史逾期次數(shù)、最長(zhǎng)逾期天數(shù)、平均還款時(shí)間差、準(zhǔn)點(diǎn)還款率、提前還款次數(shù)。登錄行為特征總登錄次數(shù)、平均每日登錄次數(shù)、登錄天數(shù)占比、最近一次登錄距今天數(shù)、夜間登錄比例。組合特征借款金額增幅、最近三個(gè)月借款占?xì)v史總借款的比例、還款能力系數(shù)月均流水/月均應(yīng)還。這些特征的產(chǎn)出要寫成可復(fù)用的腳本因?yàn)槟愫竺娲蟾怕室磸?fù)調(diào)。建議分成兩層第一層是單表聚合第二層是跨表拼接這樣方便排查問(wèn)題。3.3 模型選型與訓(xùn)練驗(yàn)證這類表格型數(shù)據(jù)經(jīng)典機(jī)器學(xué)習(xí)模型的表現(xiàn)往往不比深度學(xué)習(xí)差而且訓(xùn)練快、可解釋性強(qiáng)。我用過(guò)的靠譜組合是LightGBM或者XGBoost樹模型天然能處理缺失值和類別特征且不用做太復(fù)雜的特征縮放。訓(xùn)練時(shí)要注意樣本不均衡問(wèn)題。逾期用戶占比通常只有百分之幾如果直接訓(xùn)練模型會(huì)傾向把所有樣本預(yù)測(cè)成“非逾期”——準(zhǔn)確率虛高但沒(méi)有實(shí)際用處。對(duì)策有三一是用AUC評(píng)價(jià)別死盯accuracy二是在訓(xùn)練時(shí)給少數(shù)類加樣本權(quán)重三是用SMOTE或NearMiss做過(guò)采樣/欠采樣但樹模型里更推薦調(diào)權(quán)重簡(jiǎn)單有效。驗(yàn)證方案上如果比賽數(shù)據(jù)是按時(shí)間切分的最好也用時(shí)間序列切分來(lái)驗(yàn)證模型穩(wěn)定性否則你拿隨機(jī)切分的驗(yàn)證集分?jǐn)?shù)去評(píng)估很可能高估模型在真實(shí)場(chǎng)景中的表現(xiàn)。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄4.1 7z解壓與數(shù)據(jù)讀取階段的坑這個(gè)數(shù)據(jù)集用的是.7z壓縮格式如果你電腦上沒(méi)有裝7-ZipWindows自帶的解壓工具是解不開(kāi)的會(huì)一直報(bào)“壓縮文件格式未知或損壞”很多人第一反應(yīng)是文件壞了其實(shí)是工具不對(duì)。注意不是所有.7z都要解壓后才能讀取如果你熟悉Python可以直接用py7zr庫(kù)讀取壓縮包內(nèi)的文件但為了操作方便我還是建議先解壓到本地再處理。解壓后讀取csv要注意內(nèi)存問(wèn)題。這個(gè)數(shù)據(jù)集總共也就幾百M(fèi)B理論上內(nèi)存夠了但如果你pandas讀取時(shí)類型推斷太智能可能會(huì)把某些ID列當(dāng)int64白白浪費(fèi)內(nèi)存。建議read_csv時(shí)用dtype參數(shù)指定列類型能省不少內(nèi)耗。4.2 特征拼接與跨表關(guān)聯(lián)的經(jīng)典翻車點(diǎn)這個(gè)比賽里最常見(jiàn)的報(bào)錯(cuò)就是join之后數(shù)據(jù)行數(shù)暴增或大量NaN。比如你要用user_repay的還款記錄構(gòu)建用戶特征如果直接用mean、max等聚合方式正常不會(huì)有問(wèn)題但如果你不小心把user_loan的多條借款記錄join到了user_info上每一行用戶信息會(huì)重復(fù)出現(xiàn)多次后續(xù)特征計(jì)算就會(huì)失真。我自己的排查思路join完以后先看行數(shù)如果行數(shù)等于主表行數(shù)說(shuō)明沒(méi)出問(wèn)題如果行數(shù)變多就用groupbyagg重新聚合。另一個(gè)翻車點(diǎn)是對(duì)時(shí)間窗口的處理。如果數(shù)據(jù)集里用戶注冊(cè)時(shí)間和賬單時(shí)間跨度不一致必須在聚合時(shí)先按時(shí)間篩選再做統(tǒng)計(jì)否則會(huì)把未來(lái)的信息泄露給模型導(dǎo)致線下驗(yàn)證分?jǐn)?shù)虛高、線上卻表現(xiàn)崩塌。4.3 數(shù)據(jù)泄露問(wèn)題必須時(shí)刻警惕風(fēng)控賽題最忌諱的就是數(shù)據(jù)泄露。這個(gè)題目中有幾個(gè)可能的泄露源一是直接用了“當(dāng)前已經(jīng)逾期”作為標(biāo)簽去訓(xùn)練而測(cè)試集不允許這種信息二是用用戶還款記錄匯總特征時(shí)不小心把目標(biāo)期之后的還款信息也算進(jìn)去了三是用了用戶ID類的編碼直接作為特征這在監(jiān)督學(xué)習(xí)里風(fēng)險(xiǎn)極高因?yàn)槟P涂赡芸俊坝涀 蹦承㊣D來(lái)預(yù)測(cè)完全沒(méi)有泛化能力。解決方案也簡(jiǎn)單特征構(gòu)建時(shí)統(tǒng)一按時(shí)間截止點(diǎn)做窗口截?cái)嘤?xùn)練集和測(cè)試集用同一套特征工程代碼以及去掉高基數(shù)ID字段。比賽里很多隊(duì)伍線下分?jǐn)?shù)能刷到很高線上卻崩得一塌糊涂十有八九就是沒(méi)處理好泄露問(wèn)題。5. 個(gè)人經(jīng)驗(yàn)與擴(kuò)展思考這個(gè)數(shù)據(jù)集雖然已經(jīng)過(guò)去幾年但我一直認(rèn)為它是國(guó)內(nèi)信貸風(fēng)控入門最好的素材之一。原因有三數(shù)據(jù)真實(shí)脫敏規(guī)范字段豐富度剛好在你“跳一跳夠得著”的水平。比起很多比賽動(dòng)輒上億樣本的操作這個(gè)數(shù)據(jù)集的人量級(jí)更適合快速迭代思路也適合配合Kaggle上的經(jīng)典信貸風(fēng)控賽題一起對(duì)比著看。我在實(shí)際跑這個(gè)數(shù)據(jù)集時(shí)最有感觸的一點(diǎn)是模型能給你的提升是有限的特征工程才是決定排名上限的那只手。我當(dāng)時(shí)花了一個(gè)周末的時(shí)間把一個(gè)“歷史借款金額均值”拆成“最近三個(gè)月均值”和“更早歷史均值”就這一拆線下AUC直接漲了0.01。這種收益靠調(diào)參是換不來(lái)的。如果你已經(jīng)把這個(gè)數(shù)據(jù)集跑通了我建議你再做兩件事一是模仿評(píng)分卡的邏輯把LightGBM的訓(xùn)練結(jié)果轉(zhuǎn)成標(biāo)準(zhǔn)評(píng)分卡看看業(yè)務(wù)上能否解釋得通二是嘗試引入一些外部公開(kāi)的宏觀經(jīng)濟(jì)數(shù)據(jù)或地區(qū)數(shù)據(jù)看看能不能進(jìn)一步提升模型的區(qū)分度。這個(gè)數(shù)據(jù)集的上限還有不少挖掘空間。最后給大家一個(gè)實(shí)在的建議別只盯著跑分把特征工程的過(guò)程記錄下來(lái)寫成文檔下次遇到類似數(shù)據(jù)集你就能直接套用套路。畢竟風(fēng)控這個(gè)行業(yè)看的是你能不能在有限的特征里盡可能還原出一個(gè)人的還款意愿和還款能力。這個(gè)數(shù)據(jù)集就是最好的練手場(chǎng)。本文還有配套的精品資源點(diǎn)擊獲取