简介:一套面向金融风控场景的拍拍贷风控大赛实战数据集,适合数据建模学习者、算法工程师和信贷风控从业者。压缩包为7z格式,共176个文件,约37.37MB;以20个CSV数据表、2个XLSX表格和1个IPYNB分析脚本为核心,配合67个JPG、28个PNG图表以及HTML/JS/CSS可视化页面,覆盖数据清洗、特征探索和模型展示等常见环节。数据集中包含主训练表、用户日志信息表、Kesci 9万级主表等多张核心表,整合借款人基本信息、借款还款记录、登录行为日志与信用评估相关字段,可用于违约预测、特征工程、异常检测和信用评分模型构建。目前已有1120人学习下载,热度较高。借助这份数据,可完整演练从数据理解、特征构造、模型训练到效果评估的风控全流程,也能支撑特征重要性分析、风险策略制定与模型解释性研究,为参赛冲刺和实际业务风控策略落地提供直接参考。 这是一份在很多搞数据竞赛的朋友硬盘里都出现过的经典压缩包,ppd拍拍贷风控大赛数据集.7z,我当初为了把它玩明白,前后花了差不多两个周末,踩了不少坑才把整套流程跑顺。先说人话,这份数据集解决的是信贷风控里最核心的问题:给一个借款用户做信用评估,预测他未来会不会逾期或者坏账。无论你是刚接触金融机器学习的新手,还是在自己做风控特征工程的老手,这套数据都非常适合拿来练手,尤其是里面带着时间的用户行为字段,很多公开数据集给不到这么细。
这篇文章我会从解压这个7z文件开始,一直讲到模型评估和常见坑位,尽量把我实际操盘的经验都还原出来。
1. 这份数据到底在解决什么问题
1.1 比赛任务与业务背景
拍拍贷举办的这个风控大赛,赛题任务往简单说就是二分类:根据用户借款申请时的信息、历史还款行为、以及征信相关字段,预测该笔借款未来是否会逾期。主办方给出的训练集里包含大量样本,每一行是一个用户的借款记录,同时带着一个标签列,1代表坏样本(逾期或违约),0代表好样本(正常还款)。
你可能会说,这种任务太常见了,和网上的信用评分数据集差不多。但其实细节都在业务口径上。比如逾期的观察期是多长?30天以上算逾期还是90天以上才算坏账?这些直接决定了标签的分布,也决定了模型优化的方向。实际比赛中,不同口径下坏样本比例可能从3%到10%不等,直接套用通用分类流程不一定好用。
金融风控领域管这类问题叫申请评分卡,业务上要求模型不仅有区分度,还要有一定的稳定性和可解释性。这也是为什么后面我会单独讲特征工程和模型评估,因为只看准确率会严重失真。
1.2 这份数据不可替代的价值
市面上有Lending Club、Give Me Some Credit等公开数据,但PPD这份数据有几个特色,特别适合做深入研究:
- 时间切片信息丰富。很多公开数据是已经聚合好的宽表,用户只有一行、字段就是最终数值,你完全没法做时间窗口衍生。而这份数据里,很多行为统计字段是按周期拆开的,比如过去3个月、6个月、12个月的逾期次数和金额都有,这种结构给特征工程留了巨大的空间。
- 特征维度覆盖全面。既有借款层面的金额、利率、期限,也有个人信用层面的历史成功借款、历史逾期,还有额度使用、征信查询次数等信息,玩起来很过瘾。
- 坏样本比例相对合理。不需要像处理某些极端不平衡数据集那样,一上来就要做复杂的采样策略,你可以专注在设计特征和调模型上。
我的建议是,如果你只想快速证明自己会用LightGBM,确实跑个baseline就够了;但如果你真想理解风控建模的完整链路,一定要在字段理解上多花时间,把每一列的业务含义搞透。
2. 拿到手的第一步:解压7z与数据概览
2.1 7z压缩格式与解压实操
文件名后缀是.7z,这种格式很多人不熟悉。7z是一种开源的高压缩率归档格式,比zip能多压出不少空间,特别适合存放几百MB甚至几个GB的表格数据。代价就是你常用的Windows资源管理器默认不支持打开,需要借助外部工具。
Windows下,我推荐直接安装7-Zip,安装后右键压缩包选择提取到当前目录即可。如果你想用命令行,可以这样操作:
7z x ppd拍拍贷风控大赛数据集.7z -o./datamacOS用户如果装了Homebrew,可以执行brew install p7zip,这样同样能用7z命令。不想装命令行的,用The Unarchiver把文件拖进去解压也很方便。Linux用户直接sudo apt install p7zip-full就完事了。
解压之前千万要注意磁盘空间。7z压缩率高,解压后体积往往要翻好几倍,我见过有人只给C盘留了不到1G,结果解压到一半磁盘写满直接失败。所以在解压前先看下目标盘的剩余空间,这是新手最容易忽略的地方。
如果你不想解压到本地,想在Python里直接读,可以简单封装一下:
import py7zr with py7zr.SevenZipFile('ppd拍拍贷风控大赛数据集.7z', mode='r') as archive: archive.extractall(path='./data')解压完成之后,一定要检查解压出的文件数量和大小,最好和赛题说明核对一下。我有一次解压显示成功,但里面有个文件是0字节,读数据时直接崩了。这种破损文件在下载中断后很容易出现。
2.2 核心字段与业务含义
不同年份的比赛数据字段可能略有不同,但整体维度基本一致。就我实际摸过的数据来看,大致可以分几类:
- 主键字段:UserID、ListingID这类标识字段,建模时不作为特征,但用来关联和去重。
- 借款信息字段:借款金额、借款利率、借款期限、借款类型、还款方式等。这一组直观表达了这笔贷款长什么样,是模型判断风险的基础。
- 历史行为字段:历史成功借款笔数、历史逾期笔数、历史逾期金额、历史正常还款次数、当前逾期天数等。这部分是风控模型的灵魂,直接反映用户过往的还款意愿和能力。
- 征信相关字段:授信总额、额度使用率、征信查询次数等。这些字段能体现用户的负债压力和对资金的渴求程度,一般和风险呈正相关。
- 时间窗口统计字段:类似近3个月逾期率、近6个月平均借款金额这类。它们把行为扩展到了时间维度,是最容易做出区分度的地方。
- 目标标签:是否逾期,也就是我们建模要预测的Y。
看完字段别急着开始建模,我建议先跑一下df.describe()和df.info(),把每一列的缺失率、均值、分布都摸一遍。有很多坑藏在数据里,比如某个字段全为0、某个字段异常大、某两个字段高度相关,这些都会在后续建模时给你添乱。
3. 从清洗到建模的完整实操
3.1 数据清洗与预处理细节
拿到一份真实赛题数据,第一步不是建模,而是把数据彻底洗干净。
我先做了三件事:重复值检查、缺失值统计、类型压缩。重复值方面,重点看主键列是否有重复,如果有,要确认是同一笔借款重复出现还是同一用户的多笔借款,这个必须分清楚。缺失值方面,我先按列统计缺失率,超过50%的字段会严重影响模型稳定性,通常直接删除;缺失率在10%到50%之间的字段,我会保留并构造一个“是否缺失”的指示特征;缺失率很低的,用中位数填充就可以,树模型本身也能处理缺失,但填充后特征利用更充分。
类型压缩是很多新手会忽略的优化。赛题数据动辄上百万行,如果不做处理,光是读入就会占用好几个G内存,后面训练LightGBM就被卡得动弹不得。我通常这样做:
import pandas as pd df = pd.read_csv('train.csv', encoding='gbk') for col in df.columns: if df[col].dtype == 'float64': df[col] = df[col].astype('float32') elif df[col].dtype == 'int64': df[col] = df[col].astype('int32')这样转换之后,内存占用能降一半左右,训练速度也会明显提升。如果你的机器内存不太够,这一步一定要做。
还有一个特别容易踩的坑:读入CSV时编码问题。有的文件是UTF-8,有的文件是GBK或者GB2312,pd.read_csv默认UTF-8直接读就会出现乱码或者报错。如果报UnicodeDecodeError,就试着换成encoding='gbk'或者encoding='gb18030',读取时多试几个编码总没错。
3.2 建模前为什么不能跳过特征工程
风控领域的特征工程,和其他领域不太一样,核心是处理好三件事:历史行为统计、时间窗口聚合、比率类特征。
历史行为统计是最基础的。直接用原始字段,比如历史逾期笔数、历史逾期金额、历史成功借款笔数等,模型也能学到一些规律,但泛化性通常有限。我习惯在此基础上做比率类特征,比如逾期笔数占比、逾期金额占借款金额的比例、成功借款比例,这类特征比绝对数值更稳定,对不同类型的用户来说也更具可比性。
时间窗口聚合是这份数据里最值得玩的地方。因为原数据本身就包含不同时间周期的统计字段,我会把它们组合成新的特征,比如近6个月的成功借款次数和近12个月的成功借款次数做差,就能反映用户最近是不是在频繁借款。再比如近3个月逾期次数除以近12个月逾期次数,能看出逾期是偶发还是持续恶化。这类趋势特征在实际业务中非常管用。
交叉特征也值得一试。例如借款利率和授信使用率的交叉,利率高且额度用满的人,往往资金紧张,风险偏高。借款期限和月还款额的组合,能反映用户的短期偿债压力。不需要做太多复杂的数学变换,先把业务逻辑想清楚,再做交叉,往往更有效。
这里特别提醒一下:做特征工程时一定要控制特征数量,不要一上来就生成几千个特征。特征太多不仅训练慢,还容易过拟合。我一般先做一轮核心特征,跑模型看特征重要性,再逐步迭代增加新特征,保持特征集的可解释性。
3.3 模型选型与评估指标
建模阶段,我的标配是“逻辑回归+LightGBM”,两者配合使用。逻辑回归作为baseline和可解释性参考,LightGBM作为主力模型提升效果。如果你的经验比较丰富,也可以加XGBoost或者CatBoost做对比,但从实际效果看,LightGBM在这类表格数据上基本是最优解,训练快、调参少、效果稳定。
怎么评估模型呢?准确率这个指标在风控场景里基本可以忽略,因为样本本身是高度不平衡的,如果你预测全部为0,准确率也可能超过90%,但这个模型没有任何实际价值。重点关注AUC和KS这两个指标。
AUC反映的是模型对好坏用户的排序能力,0.5代表随机,0.7以上已经有不错的区分度,0.8以上在风控竞赛里就算很优秀了。KS的计算逻辑是累计坏样本占比和累计好样本占比的最大差值,业务上更直观地表示能区分出多少风险。在评估代码里,我一般这样同时计算AUC和KS:
from sklearn.metrics import roc_auc_score, roc_curve auc = roc_auc_score(y_valid, y_pred) fpr, tpr, _ = roc_curve(y_valid, y_pred) ks = max(tpr - fpr) print(f'AUC: {auc:.4f}, KS: {ks:.4f}')训练LightGBM的时候,我用5折交叉验证配合早停,防止过拟合。核心参数不需要一开始就精调,先用一组默认偏保守的参数跑通:
import lightgbm as lgb params = { 'objective': 'binary', 'metric': 'auc', 'learning_rate': 0.05, 'num_leaves': 31, 'max_depth': -1, 'feature_fraction': 0.8, 'bagging_fraction': 0.8, 'bagging_freq': 1, 'verbose': -1, } model = lgb.LGBMClassifier(**params) model.fit(X_train, y_train, eval_set=[(X_valid, y_valid)], callbacks=[lgb.early_stopping(100)])跑完基线之后,再根据特征重要性做特征筛选,以及针对num_leaves、min_child_samples等参数做简单调优。我个人的经验是,在这个数据集上,特征工程带来的提升通常比盲目调参大得多。
4. 常见问题与实操心得
4.1 我实际遇到过的四类坑
- 第一个坑是训练集和测试集的时间窗口不一致。有人用全部数据做训练,结果线上分数很低,因为测试集来自更晚的时间段,用户行为已经发生了漂移。正确做法是尽量按时间切分验证集,而不是随机切分。
- 第二个坑是数据泄露。我在做特征的时候,不小心把某个字段用到了未来的信息,导致本地验证AUC高达0.95,线上却只有0.7。所以每次做特征之前,都要反复确认这个特征在预测时点是否真的已知。
- 第三个坑是内存爆掉。原始CSV直接用pandas读进来,加上特征工程后内存直接满了,训练进程崩溃。后来我把中间特征分块保存成parquet,再用的时候按需读取,问题才解决。如果你用的是32位Python,还要考虑内存上限的问题。
- 第四个坑是中文文件名和列名的编码乱码。解压后所有文件名是中文,在Linux环境下经常显示乱码,处理起来很麻烦。我后来习惯先批量重命名成纯英文字母,再进入建模流程,能省下不少烦心事。
4.2 给新手的几条建议
如果你正准备拿这份数据集做练习,我给你几个实际的建议。
第一,先跑通一个简单baseline,再考虑复杂的特征和模型。很多人一上来就拼命造特征、调模型,结果一旦出错根本不知道问题出在哪。先把最基本的数据读入、清洗、训练、预测流程走通,拿到一个AUC基线,再逐步迭代提升,这才是科学的节奏。
第二,重要的不是AUC最后刷到多少,而是能不能讲清楚每个特征为什么有效。面试官问起这个项目的时候,你如果说“我用LightGBM跑了一个0.8的AUC”,对方没什么感觉;但你要是能说清楚某个时间窗口特征捕捉了用户资金状况的恶化趋势,效果完全不一样。
第三,保存好你的数据预处理和特征工程pipeline。每次迭代都要重新跑特征,如果脚本组织混乱,改一个参数就要从最前面重来,非常浪费时间。我现在习惯把每一个特征函数化,数据字典和版本号都记录下来,方便回溯。
第四,多去看看相关的竞赛方案分享。很多选手喜欢在比赛结束后公开自己的特征工程思路,哪怕只是读别人的文字描述,也能打开你的思路,少走很多弯路。
5. 实战中的扩展方向
这份数据集的价值远不止完成一次模型训练。如果你有余力,可以接着往下延伸几个方向。
一个是模型解释性分析,用SHAP值去分析特征对预测结果的影响方向,验证是不是和业务常识一致。比如授信使用率越高、预测风险越大,如果模型学出来的方向相反,说明特征或者标签可能有问题。我每次用这份数据自我训练时,都会过一遍这个检查流程,能发现不少之前忽略的细节。
另一个方向是模型融合与阈值选择。把LightGBM、XGBoost、逻辑回归的输出做加权融合,然后再结合业务坏账成本去选择最优概率阈值。很多人把模型输出当成最终结果,但其实在真实风控场景里,阈值的选择直接决定坏账率和通过率之间的平衡,这同样值得练手。
还有一点,是用这份数据做一个端到端的“申请评分卡”分析。不仅能训练模型,还可以把概率值转换为标准评分,比如转换成300到850分之间的信用分。这个过程涉及分数刻度设计、变量分箱、WOE转换等,虽然比直接用LightGBM麻烦,但能让你真正理解传统风控模型的构建逻辑,对职业发展很有帮助。
我个人在反复处理这份数据的过程里,最大的体会是:数据竞赛和真实风控建模最大的区别,不在于模型有多复杂,而在于你有多懂数据和业务。ppd这份数据集之所以经典,就是因为它把真实业务里会遇到的问题浓缩进了一个压缩包。把这份数据研究透,你的特征工程能力、识别数据陷阱的敏锐度,都会比只刷公开benchmark的人高出一截。
本文还有配套的精品资源,点击获取