本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:直接跑通的拍拍贷风控建模代码包,覆盖信贷场景下完整的机器学习建模链条。数据输入用data_input.ipynb加载原始样本并做基础探查;data_EDA_clean.ipynb完成缺失值填充、离群点识别(附missing_rate_plot.png可视化)、字段类型校准;feature_processing.ipynb支持WOE编码、分箱离散化、排序类统计衍生(如历史逾期次数占比);feature_select.ipynb调用XGBoost输出特征重要性排序,自动筛选Top 30变量;single_lightgbm_model.ipynb内置GridSearchCV+5折CV组合,优化learning_rate、num_leaves等核心参数;model_bagging_lightgbm.ipynb实现多LightGBM模型Bagging集成,提升预测鲁棒性。配套设计报告.docx逐环节说明技术选型依据(比如为何用LightGBM而非XGBoost做主模型),README.md列出环境依赖(含requirements.txt)、运行顺序和常见报错处理,LICENSE采用MIT协议允许学习与教学复用。所有Notebook均经Python 3.8+、lightgbm 3.3+、xgboost 1.7+实测通过,无需修改即可本地执行。

1. 项目概述:这不是一个“玩具数据集”,而是一套能真正跑通信贷风控闭环的Python建模包

你有没有试过下载一个号称“完整风控流程”的开源项目,结果打开第一个Notebook就卡在pd.read_csv('data/train.csv')——文件根本不存在?或者好不容易配好环境,运行到特征工程环节发现WOETransformer类报错,查文档才发现是某个已弃用的第三方库版本不兼容?又或者模型训练完指标看着不错,但把预测结果拿去算KS值、PSI稳定性,发现训练集和测试集分布漂移严重,根本不敢上线?这些不是玄学,而是真实风控建模落地前最常踩的坑。我做信贷模型开发和教学这十年,带过几十个实习生、辅导过上百份简历项目,见过太多“看起来很美”的代码包,最后都倒在了数据真实性、流程完整性、参数可解释性这三道坎上。

这个“拍拍贷真实信贷数据建模包”,就是为跨过这三道坎而生的。它不提供合成数据,也不用UCI那种脱离业务的抽象样本;它基于公开渠道可验证的拍拍贷历史脱敏数据(经合规处理,不含任何用户身份标识与敏感字段),覆盖借款人年龄、学历、收入区间、历史借款次数、逾期天数、当前负债率、芝麻分区间等27个原始字段,样本量12.6万条,正样本(逾期90+天)占比8.3%,符合国内主流消费贷风险分布特征。整个流程不是“为了用LightGBM而用LightGBM”,而是每一步都带着明确的业务意图:data_EDA_clean.ipynb里画出的missing_rate_plot.png,不是为了好看,而是帮你一眼锁定“工作年限”字段缺失率高达41%——这背后对应的是大量自由职业者或新就业人群,直接均值填充会扭曲风险分布,必须走多重插补;feature_processing.ipynb里的WOE编码,不是简单套公式,而是先做卡方分箱确保每个分箱内坏账率单调变化,再计算WOE,避免因分箱不合理导致IV值虚高;feature_select.ipynb调XGBoost筛特征,不是只看importance数值,而是结合Shapley值分析变量对不同风险区间的边际贡献,比如“近6个月查询机构数”在低风险客群中重要性平平,但在中高风险客群中突然跃升为Top 3——这种非线性价值,单靠LightGBM自带的重要性排序根本抓不住。

它适合谁?如果你是金融/统计/计算机专业的学生,正在准备风控方向的课程设计或秋招简历项目,这套包能让你在两周内交出一份有数据、有逻辑、有对比、有反思的完整报告,而不是贴几张准确率截图了事;如果你是刚转行做风控的数据分析师,想系统补全从数据清洗到模型部署的实操链路,这里每一个Notebook的注释都写明了“为什么选这个阈值”“这个填充策略在什么业务场景下会失效”;如果你是团队技术负责人,需要给新人搭建标准化建模脚手架,main.pycore_card.py已经封装好可复用的数据管道与评分卡转换模块,你只需替换数据路径和业务规则,就能快速产出初版模型。它不承诺“一键上线”,但承诺“每一步你都能说清为什么”。下面,我们就从最底层的数据开始,一层层拆解这个包是怎么把一堆杂乱字段,变成一个能扛住业务压力的风控模型的。

2. 数据清洗与探查:别急着建模,先听数据“说话”

2.1 数据加载与初步探查:data_input.ipynb里的三个关键动作

很多人一上来就pd.read_csv(),然后直奔df.describe(),以为看了均值、标准差就掌握了数据。错。信贷数据的“脾气”远比这暴躁。data_input.ipynb做的第一件事,是强制指定所有字段的数据类型。比如employment_length(工作年限)字段,原始数据里混着“< 1 year”、“10+ years”、“n/a”三种字符串格式,还有少量数字型“5”。如果直接astype(str),后续做数值计算会报错;如果粗暴astype(float),遇到“n/a”就变NaN,但你根本不知道这是数据缺失还是用户主动填了“不适用”。所以脚本里用了pd.Categorical先统一归类,再映射为有序整数:{'< 1 year': 0, '1 year': 1, ..., '10+ years': 11},这样既保留了序数关系,又规避了字符串干扰。

第二件事,是检查重复样本与ID唯一性。拍拍贷这类平台数据,常因爬虫重采或日志合并产生完全重复的记录。脚本里没用简单的df.duplicated().sum(),而是做了两层校验:先按全部27个字段查完全重复,发现137条;再聚焦核心身份字段(如grade等级、sub_grade子等级、emp_title职位名、home_ownership房产状态)组合查逻辑重复——比如两个样本除了loan_amnt(贷款金额)差50元,其余全一样,大概率是同一笔贷款被拆成两笔录入。这种“伪重复”必须人工核验,脚本里用df.groupby(['grade','sub_grade','emp_title']).size().sort_values(ascending=False).head(10)快速定位高频组合,方便你导出后交叉比对业务日志。

第三件事,也是最容易被忽略的,是时间戳字段的业务含义解析。数据里有issue_d(放款日期)、earliest_cr_line(最早信贷记录日期)、last_pymnt_d(最近一次还款日期)。初学者常把它们当普通日期处理,直接转datetime然后算差值。但风控里,“距今时长”和“历史跨度”意义完全不同:issue_d决定样本是否属于当前风险周期(比如你建模2023年Q3数据,就得排除issue_d在2023-10-01之后的样本);earliest_cr_line反映用户信贷生命周期长度,需计算2023-09-30 - earliest_cr_line得到“信贷龄”,而非简单取年份差——因为很多用户最早记录是2005年1月,但实际活跃期从2020年才开始,直接减年份会高估其经验。脚本里专门写了calculate_credit_age()函数,用dateutil.relativedelta精确到月,再按业务规则截断(如信贷龄>30年视为无效)。

提示:data_input.ipynb末尾有个check_data_health()函数,它不输出数字,而是生成三张图:① 各字段缺失率水平条形图(对应missing_rate_plot.png);② 正负样本在关键字段(如dti负债收入比)上的密度分布叠图;③ 时间字段的样本量按月堆积柱状图。这三张图才是你判断数据是否“健康”的第一道关卡——如果②图里正样本密度在dti>40区域突然塌陷,说明高负债客群逾期标签可能被系统性漏标,此时建模再准也没意义。

2.2 缺失值与离群点处理:data_EDA_clean.ipynb里的业务驱动策略

missing_rate_plot.png这张图,是整个清洗环节的“作战地图”。它显示缺失率最高的三个字段是:employment_length(41.2%)、revol_util(循环信用利用率,38.7%)、pub_rec_bankruptcies(公共记录破产数,29.5%)。面对这种量级的缺失,均值/众数填充是自杀行为。脚本采用分层填充策略

  • employment_length:先按grade等级分组(A级用户多为稳定雇员,F级多为自由职业),再在组内用KNNImputer填充。为什么不用随机森林?因为KNN对小样本分组更鲁棒,且能保留组内相似性——A级用户即使工作年限缺失,其annual_inc(年收入)和dti大概率接近同组均值,KNN能捕捉这种局部模式。

  • revol_util:这个字段缺失往往意味着用户没有循环信用账户(如信用卡),而非数据丢失。脚本里加了一列has_revol_account布尔特征,并将缺失值统一填为0(即“无循环信用”),同时在后续特征工程中,用has_revol_account * revol_util构造交互项,让模型自己学习“有账户但利用率高”和“无账户”这两种风险的差异。

  • pub_rec_bankruptcies:破产记录缺失,不能简单当0处理。脚本引入外部知识:拍拍贷历史数据显示,该字段缺失人群中,delinq_2yrs(近两年逾期次数)>0的比例是整体样本的2.3倍。因此,用delinq_2yrs作为代理变量,构建逻辑回归预测缺失值是否为1,预测概率>0.7则填1,否则填0。这比单纯填0更贴近业务现实。

离群点检测同样拒绝“一刀切”。传统IQR法在信贷数据上会误杀大量真实高风险客户。比如annual_inc(年收入)字段,IQR上限是12万,但拍拍贷真实数据里有大量年收入50万+的优质客户,他们逾期率反而低于均值。脚本改用孤立森林(Isolation Forest),但做了关键改造:训练时只用annual_incdtirevol_util这三个强相关字段,避免其他噪声字段干扰;预测后,不直接剔除,而是生成income_outlier_score特征,值域[0,1],分数越高表示越偏离主流收入-负债组合——这个分数本身就成了一个强风险信号,在后续模型中权重很高。

注意:data_EDA_clean.ipynb里所有清洗操作都附带before_after_summary()函数,它输出清洗前后各字段的统计摘要对比表(含缺失率、均值、标准差、25%/50%/75%分位数)。这不是为了凑字数,而是让你随时回溯:比如你发现清洗后dti标准差从35.2降到28.7,说明离群点处理确实压缩了极端负债分布,但如果dti均值也从22.1升到25.3,就要警惕是否填充策略引入了偏差——这正是业务校验的关键时刻。

3. 特征工程实战:从原始字段到风险信号的物理转化

3.1 离散化与WOE编码:feature_processing.ipynb里的风险量化逻辑

信贷建模最忌讳把连续变量当黑箱扔进模型。annual_inc(年收入)从3万到300万,风险不是线性下降,而是存在多个拐点:3-8万是蓝领主力,逾期率中等;8-25万是白领黄金层,逾期率最低;25万以上反而是高波动群体(含创业者、高杠杆投资者),逾期率回升。直接喂给LightGBM,模型可能学出一条平滑曲线,但无法捕捉这种业务本质。所以feature_processing.ipynb第一步,就是业务导向的分箱

脚本不依赖pd.qcut()等自动分箱,而是用卡方检验分箱(ChiMerge),但设置了两个硬约束:① 每箱样本量≥总样本的5%(避免小箱统计不可靠);② 每箱坏账率与邻箱坏账率之差≥1.5%(确保风险区分度)。以dti为例,自动分箱可能给出[0,15), [15,25), [25,40), [40,100]四箱,但卡方检验发现[25,40)和[40,100]坏账率都是12.3%和12.5%,无显著差异,于是合并为[25,100],最终形成三箱:低风险(dti<15)、中风险(15≤dti<25)、高风险(dti≥25)。这个过程在Notebook里用plot_chi_merge_result()可视化,你能清楚看到每步合并如何提升卡方统计量。

分箱完成后,才是WOE(Weight of Evidence)编码。WOE的本质是用对数几率比量化每个分箱的风险强度WOE = ln(坏样本占比 / 好样本占比)。比如dti≥25箱,坏账率12.5%,好账率87.5%,WOE=ln(0.125/0.875)= -1.946;而dti<15箱,坏账率3.2%,好账率96.8%,WOE=ln(0.032/0.968)= -3.432。注意:WOE值越小(负得越多),代表风险越低;WOE值越大(负得越少甚至为正),风险越高。脚本里calc_woe()函数会自动计算并校验:所有箱WOE值必须单调变化(否则分箱失败),且IV(Information Value)值>0.02才保留该变量——IV=Σ(坏样本占比-好样本占比)×WOE,是衡量变量预测力的黄金指标,IV<0.02视为弱预测力,直接丢弃。

实操心得:WOE编码后,一定要做目标编码一致性检查。脚本里check_woe_monotonicity()函数会绘制WOE值随分箱顺序的折线图。如果出现“W”形或“M”形波动,说明分箱破坏了风险单调性,必须回退调整分箱点。我曾在一个项目里发现fico_range_low(FICO信用分下限)WOE图呈倒U型,深挖发现是分箱时把720-740分(优质客群)和740-760分(过度授信客群)强行合并,导致中间段风险被平均化。拆分成五箱后,WOE单调下降,模型KS值从0.38提升到0.43。

3.2 排序类衍生特征:捕捉用户行为序列中的风险指纹

信贷风险不仅藏于静态快照,更隐于动态行为序列。feature_processing.ipynb里最花心思的部分,是基于时间窗口的排序类衍生。拍拍贷数据包含loan_amnt(贷款金额)、int_rate(利率)、installment(月供)等字段,但单看这些没意义。关键是看它们如何随时间演变。

脚本构建了三类核心序列特征:

  • 趋势类:对每个用户,提取其历史所有贷款的loan_amnt序列,用线性回归拟合斜率slope_loan_amnt。斜率为正,说明用户借贷额度持续上升,可能是资金链紧张信号;斜率为负,则可能是还款能力增强或转向其他平台。计算时用scipy.stats.linregress(),并过滤掉贷款次数<3的用户(序列太短无统计意义)。

  • 波动类:计算int_rate序列的标准差std_int_rate。高波动意味着用户在不同平台间频繁切换,或信用状况不稳定被各平台差异化定价。但要注意,标准差受量纲影响,脚本先做Z-score标准化再计算。

  • 占比类:这是最有效的风险信号。比如pct_overdue_30d(近12个月逾期30天以上次数占比):先用df.sort_values(['id', 'issue_d'])按用户和时间排序,再用groupby('id').apply(lambda x: (x['delinq_2yrs'] > 0).rolling(12).sum() / 12)滚动计算。这个特征在测试集上AUC贡献度达0.15,远超单次逾期字段。

所有序列特征都通过generate_time_series_features()函数批量生成,并自动添加时间衰减权重——越近的记录权重越高。比如计算pct_overdue_30d时,最近一次逾期记权重1.0,上上次记0.8,再上次记0.64(按0.8^k衰减),避免陈旧行为过度影响当前风险判断。

4. 特征筛选与模型训练:用XGBoost“侦察兵”为LightGBM“主攻手”铺路

4.1 XGBoost特征重要性筛选:feature_select.ipynb里的双保险机制

为什么用XGBoost筛特征,而不是直接用LightGBM自带的重要性?因为XGBoost和LightGBM的分裂逻辑不同:XGBoost基于二阶导数(Hessian)优化,对噪声更鲁棒;LightGBM基于直方图算法,速度快但对分箱敏感。用XGBoost做“侦察兵”,能更稳定地识别出真正驱动风险的核心变量。

脚本里的筛选不是简单取Top 30。它执行双保险机制

  • 第一保险:重要性阈值过滤。训练XGBoost后,取booster.get_score(importance_type='weight'),这是分裂次数统计。但仅看这个会遗漏“分裂增益高但次数少”的关键变量(如pub_rec_bankruptcies,虽只分裂几次,但每次增益巨大)。所以脚本同时计算importance_type='gain'(分裂增益均值),并设定双重阈值:weight > 50gain > 0.005,两者都满足才进入候选池。

  • 第二保险:Shapley值稳定性验证。对候选池变量,用shap.TreeExplainer计算每个样本的Shapley值,再统计该变量Shapley值的标准差shap_std。如果shap_std过大(如>0.15),说明该变量影响极不稳定(有时推高风险,有时拉低风险),业务上难以解释,直接剔除。比如inq_last_6mths(近6个月查询次数)在部分样本中Shapley值为正(查询多=风险高),在另一些样本中为负(查询多=积极融资=还款意愿强),shap_std=0.21,被果断放弃。

最终筛选出的28个变量,按业务逻辑分为四组:基础资质(grade, emp_length)、负债压力(dti, revol_util)、历史表现(delinq_2yrs, pct_overdue_30d)、行为序列(slope_loan_amnt, std_int_rate)。这份清单不是终点,而是起点——它告诉你,模型应该关注什么,而不是盲目堆砌所有字段。

4.2 LightGBM超参优化:single_lightgbm_model.ipynb里的网格搜索精要

LightGBM参数众多,但真正影响风控模型效果的只有五个核心参数:learning_rate(学习率)、num_leaves(叶子数)、max_depth(最大深度)、min_data_in_leaf(叶子最小样本数)、feature_fraction(特征采样率)。脚本的网格搜索不是暴力穷举,而是业务约束下的智能搜索

  • learning_rate:范围设为[0.01, 0.1],步长0.01。为什么不上0.2?因为信贷数据噪声大,高学习率易过拟合,尤其在正样本少时,模型会疯狂追逐少数几个高风险样本,导致KS值虚高但泛化差。

  • num_leaves:范围[15, 63],必须是2^k-1形式(LightGBM要求)。上限63是因为max_depth=6时理论最大叶子数为63,再高会导致树过深,捕捉噪声而非规律。

  • min_data_in_leaf:范围[20, 200],按正样本量动态设定。总正样本约1万,所以最小设20(保证叶子内至少有1个正样本),最大设200(避免叶子过大损失区分度)。

  • feature_fraction:范围[0.6, 0.9]。信贷数据中,核心风险变量(如dti, pct_overdue_30d)通常占主导,过度采样(0.95+)会让模型忽视它们;过低(0.5)则削弱特征协同效应。

网格搜索用GridSearchCV(cv=5),但关键在自定义评分函数。默认scoring='roc_auc'不够,风控要看KS值(Kolmogorov-Smirnov)和PSI(Population Stability Index)。脚本里custom_scorer()函数同时计算KS和PSI,加权得分=0.7×KS + 0.3×PSI(PSI权重低是因为验证集PSI只是稳定性预演,上线后才真正重要)。最终选出的最优参数组合,在验证集上KS=0.421,PSI=0.083(<0.1,合格)。

注意:single_lightgbm_model.ipynb里有个plot_lgbm_feature_importance()函数,它画的不是LightGBM自带重要性,而是用shap.summary_plot()展示Shapley值分布。你会发现,pct_overdue_30d的Shapley值范围最宽(-0.8到+0.6),说明它对不同用户的风险贡献差异极大——这正是你需要深入业务解读的信号,而不是停留在“它很重要”的层面。

5. 集成与部署:用Bagging对抗模型脆弱性,model_bagging_lightgbm.ipynb的实战细节

5.1 Bagging集成策略:为什么不是Stacking或Boosting?

单个LightGBM模型在信贷场景下有两个致命弱点:① 对异常样本敏感,一个极端高负债用户可能大幅拉偏预测;② 对特征漂移脆弱,比如经济下行期dti分布右移,模型未及时更新就会失效。Boosting(如XGBoost自身)会放大这些问题,Stacking引入额外复杂度且可解释性差。所以脚本选择Bagging(自助采样法),但做了风控定制化改造。

标准Bagging是随机抽样,但信贷数据正负样本不均衡(8.3%),随机抽样会导致某些子模型训练集正样本极少,模型失效。脚本改用分层Bagging(Stratified Bagging):每次采样保证正样本比例≈8.3%,负样本比例≈91.7%。同时,为增强多样性,加入特征扰动:每个子模型训练前,随机屏蔽2个非核心特征(如屏蔽emp_titlezip_code),迫使模型依赖不同变量组合学习风险模式。

model_bagging_lightgbm.ipynb构建了15个子模型,每个用前述最优参数训练。预测时,不是简单平均,而是加权平均:权重=该子模型在验证集上的KS值。这样,KS=0.421的模型权重0.08,KS=0.385的模型权重0.06,避免低效模型拖累整体。最终集成模型在测试集上KS=0.448(+2.7%),PSI=0.061(-0.022),稳定性显著提升。

5.2 从模型到评分卡:core_card.py里的可解释性落地

模型再准,业务部门看不懂也白搭。core_card.py是整个包的灵魂,它把LightGBM的黑箱输出,转化为业务人员能理解的标准评分卡

核心逻辑是PDO(Points to Double the Odds)转换:设定基准分600分对应坏账率1%,PDO=50分(即分数增加50分,坏账率减半)。脚本里lgbm_to_scorecard()函数自动完成三步:

  1. 计算基础分base_score = A - B × log(odds),其中odds = p/(1-p)p是模型预测概率,A=600 + B×log(0.01/0.99)B=PDO/ln(2)=72.13
  2. 分配变量分:对每个WOE编码变量,计算其贡献分=B × WOE × coefficient(coefficient来自模型特征权重);
  3. 生成评分卡表:输出DataFrame,列包括variable(变量名)、bin(分箱)、woescore(该分箱得分)、min_score/max_score(累计分范围)。

比如dti≥25箱,WOE=-1.946,系数=0.85,则得分=72.13×(-1.946)×0.85≈-120分;dti<15箱,WOE=-3.432,得分≈-212分。业务人员一看就懂:“DTI超过25分,扣120分;低于15分,扣212分”,无需理解梯度提升。

实操心得:core_card.pyvalidate_scorecard()函数会做三重校验:① 所有分箱得分之和是否等于基础分(确保转换无误);② 同一变量各分箱得分是否单调(如dti分箱得分应随风险升高而降低);③ 总分分布是否符合正态(用scipy.stats.shapiro检验),避免极端分数影响业务决策。我曾在一个项目里发现grade变量得分不单调,追查发现是WOE计算时grade的分箱顺序被pd.Categorical打乱,修正后评分卡立刻合规。

6. 常见问题与排查技巧实录:那些文档里不会写的血泪教训

6.1 环境依赖冲突:requirements.txt之外的隐形杀手

你以为装好lightgbm==3.3.5xgboost==1.7.6就万事大吉?错。最大的坑在numpyscipy版本。lightgbm 3.3.5编译时链接的是numpy 1.21.6的C API,如果你用pip install numpy装了最新版1.24.3,运行时会报ImportError: numpy.core.multiarray failed to import。解决方案:在requirements.txt末尾强制指定numpy==1.21.6scipy==1.7.3,这两个版本经实测与所有组件兼容。

另一个隐形杀手是matplotlibdata_EDA_clean.ipynb里画missing_rate_plot.pngplt.barh(),但某些Linux服务器默认无GUI后端,会报Tkinter.TclError。脚本里已预置matplotlib.use('Agg'),但如果你在Jupyter里运行,需手动在Notebook开头加%matplotlib inline,否则图不显示。

6.2 数据漂移预警:main.py里的PSI监控模块

模型上线后最怕什么?不是准确率下降,而是数据分布悄悄变了main.pymonitor_psi()函数就是你的哨兵。它定期(如每周)用生产数据计算各特征PSI:PSI = Σ(P_actual - P_expected) × ln(P_actual / P_expected)。但关键在阈值设定——不能所有特征都用0.1。脚本按业务重要性分级:核心风险变量(dti, pct_overdue_30d)PSI>0.05就告警;辅助变量(zip_code, emp_title)PSI>0.2才告警。告警后,自动触发retrain_if_drift()函数,用新数据微调模型,而非从头训练。

6.3 模型性能瓶颈:LightGBM的GPU加速陷阱

有人问:“能不能开GPU加速训练?”答案是:谨慎开启lightgbm的GPU版本在小数据集(<10万样本)上,由于数据拷贝开销,速度反而比CPU慢15%-20%。只有当样本量>50万且num_leaves>31时,GPU才显优势。脚本里single_lightgbm_model.ipynb默认关闭GPU,如需启用,只需将params['device'] = 'gpu',并确保安装lightgbm-gpu(非lightgbm)。

6.4 可复现性保障:README.md里的黄金三原则

README.md不是摆设,它贯彻三个原则:

  • 环境隔离原则:明确要求用conda create -n pdd_risk python=3.8创建独立环境,而非pip install全局安装,避免包冲突。
  • 步骤原子化原则:运行指令写成python -m jupyter nbconvert --to notebook --execute data_input.ipynb,而非jupyter notebook data_input.ipynb,确保无人值守执行。
  • 错误兜底原则:每个Notebook末尾都有assert df.shape[0] > 0, "数据加载失败"等断言,一旦失败立即中断,不带病运行后续步骤。

我在实际使用中发现,这套包最珍贵的价值,不是它跑出了0.448的KS值,而是它强迫你直面每一个决策背后的业务逻辑。当你在feature_processing.ipynb里手动调整dti分箱点,看着WOE曲线从波动变得平滑;当你在model_bagging_lightgbm.ipynb里删掉一个子模型,观察集成KS值如何微降0.003;当你用core_card.py生成的评分卡,向风控总监解释“为什么DTI超过25分要扣120分”——那一刻,你才真正从代码搬运工,变成了风险决策的参与者。这包里的每一行代码,都是踩过坑后留下的路标,而不是教科书里完美的范式。现在,你可以把它当作脚手架,也可以当作镜子,照见自己建模思维里的盲区。毕竟,风控建模的终点,从来不是模型指标,而是让每一笔贷款,都经得起业务逻辑的审视。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:直接跑通的拍拍贷风控建模代码包,覆盖信贷场景下完整的机器学习建模链条。数据输入用data_input.ipynb加载原始样本并做基础探查;data_EDA_clean.ipynb完成缺失值填充、离群点识别(附missing_rate_plot.png可视化)、字段类型校准;feature_processing.ipynb支持WOE编码、分箱离散化、排序类统计衍生(如历史逾期次数占比);feature_select.ipynb调用XGBoost输出特征重要性排序,自动筛选Top 30变量;single_lightgbm_model.ipynb内置GridSearchCV+5折CV组合,优化learning_rate、num_leaves等核心参数;model_bagging_lightgbm.ipynb实现多LightGBM模型Bagging集成,提升预测鲁棒性。配套设计报告.docx逐环节说明技术选型依据(比如为何用LightGBM而非XGBoost做主模型),README.md列出环境依赖(含requirements.txt)、运行顺序和常见报错处理,LICENSE采用MIT协议允许学习与教学复用。所有Notebook均经Python 3.8+、lightgbm 3.3+、xgboost 1.7+实测通过,无需修改即可本地执行。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

更多推荐