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