ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

小额贷款信用风险评估实战:Logistic与Probit组合模型解析

小额贷款信用风险评估实战:Logistic与Probit组合模型解析 简介小额贷款公司客群多为难以从传统金融机构获得贷款的个人与组织信用风险评估因此成为控制坏账的关键环节。一份围绕该场景的PDF论文提出以Logistic与Probit组合模型构建个人贷款信用风险评估体系论文先分析客户结构、风险成因再对比KMV等复杂模型的局限系统梳理了模型选型、组合设计到实证验证的全过程适合小额贷款公司风控人员、金融风险管理学习者及信贷产品设计者参考。资源包共1个文件即该PDF正文压缩后约1.88MB覆盖农村金融背景、模型适用性对比、组合模型建立与结论建议阅读后可复用其建模思路到实际业务分析中。目前已有156人学习下载核心实证显示组合模型识别违约客户的准确率约70%能为贷前审批与贷中监控提供较为可靠的量化依据。除模型外论文还强调信贷控制人员职业操守与个人判断能力的必要帮助读者在模型输出基础上作出更稳健的决策。1. 小额贷款信用风险评估为什么不能照搬银行评分卡先说清“Logistic和Probit组合模型”到底要解决什么小额贷款公司的个人贷款信用风险评估和银行零售信贷的评分卡不是一回事。借款人多数没有抵押物、收入流水不完整、征信记录薄单笔金额小但笔数多审批时效还压得紧。很多团队直接把银行那套单一Logistic评分卡搬过来结果训练集上KS值能做到0.4以上一上线区分度就掉到0.25附近坏账率不降反升。核心问题在于小额信贷数据噪声高、变量分布偏单一模型对“同一批客户”只能给出一个视角而真实违约行为往往是多因素叠加的结果。《小额贷款公司个人贷款信用风险评估研究——Logistic和Ptobit组合模型运用》这个标题里的Ptobit明显是Probit的笔误但这个思路本身是成立的不要求你在Logistic回归和Probit模型之间二选一而是把两者组合起来用用两个模型预测结果的差异去对冲数据噪声。这篇笔记就是围绕这个方向把两个模型的边界、组合建模流程、可复现代码和业务落地中的坑一次讲清楚适合正在搭小额信贷评分卡、做风控策略调优、或者刚开始接触组合建模的风控从业者。2. 先把两个模型说透Logistic和Probit在信用风险评估里的数学假设与适用边界2.1 Logistic回归sigmoid函数决定概率刻度但线性假设才是真正的命门Logistic回归在信用评分领域一直是事实标准几乎每家消金公司的第一版评分卡都是从它开始的。它的核心形式是把违约概率经过一个sigmoid函数映射到(0,1)区间逻辑回归和sigmoid函数的关系是模型结构里最基础也最容易被忽视的一环。具体来说模型假设的是log(p / (1-p)) w0 w1*x1 w2*x2 ... wn*xn左边叫logit链接函数右边是一组变量的线性组合。训练的过程就是通过最大似然估计把系数w求出来。这个结构有一个很深的含义模型真正假设的不是概率本身随变量线性变化而是“概率的对数优势比”随变量线性变化。所以logistic曲线画出来是一条S形曲线在p0.5附近斜率最陡两头慢慢趋于饱和。这意味着变量对违约概率的影响是边际递减的一个客户从“差”变到“更差”概率的提升幅度远小于从“中”到“稍微偏弱”。这个特性在信用风险评估中是优势也是陷阱。优势在于sigmoid函数的平滑性让模型在常规客群上的预测相当稳定对噪声的容忍度比线性概率模型高得多陷阱在于中间变量的阈值效应会被线性组合掩盖。举个例子收入从3000涨到6000和从6000涨到12000对还款能力的边际影响明显不一样但纯线性组合里这个差异只能靠变量本身的非线性变换去拟合模型结构本身表达不了这种分档变化。所以用Logistic回归时前期的变量分箱和WOE变换几乎决定了模型上限这也是很多熟手反复强调“建模一半时间在搞变量”的原因。2.2 Probit模型换一个链接函数尾部行为完全不同Probit模型和Logistic回归在框架上是同一个东西都是广义线性模型族下的二分类模型区别只在于链接函数。Logistic用的是logit函数Probit用的是标准正态分布的累积分布函数的逆函数Φ⁻¹(p) w0 w1*x1 w2*x2 ... wn*xn其中Φ是标准正态分布的CDF。用大白话说Logistic假设误差项服从逻辑分布尾巴比正态分布更厚Probit假设误差项服从标准正态分布中间的斜率更陡、两头更早进入饱和。这个差异在业务上会产生一个常见的现象用同一份数据分别训练两个模型Logistic在违约概率接近两端时给分更“保守”而Probit打分在中间区间更“敏感”。具体表现就是同样一个评分区间的客群两个模型可能给出相差5到10个百分点的违约概率。对经验少的风控团队来说这种差异往往被当成模型bug实际上恰恰是组合建模的信息来源。Probit模型在信用风险评估里用得比Logistic少原因有两个一是参数可解释性确实不如Logistic自然logit模型的系数可以直接换算成对数优势比而probit系数要谈效应大小还得在正态分布下做积分二是各类软件对Logistic的支持更完善报错率低大家的学习成本已经被市场教育得很低了。但从统计效率上看当违约事件背后的真实机制接近于“多个独立小冲击叠加总和超过阈值就违约”时Probit的正态误差假设更贴近真实数据生成过程。小额贷款客户的违约行为往往确实是多个负面因素累积到某个临界点才爆发这种情况下Probit的拟合优度和排序能力经常优于Logistic。2.3 组合建模不是平均主义两个模型输出同一批客户的概率差异正是信息增量所在组合模型能够成立的前提不是两个模型都做得足够好而是两个模型“犯错的地方不重叠”。如果两个模型总是对同一批客户同时高估风险、对另一批客户同时低估风险那组合只会把误差放大不会带来任何增益。Logistic和Probit恰好满足互补的条件一个尾巴厚、一个集中在中间区间一个对极端变量值敏感一个对中间分布敏感。当数据里有较多极端值比如个别客户负债率异常高、或者收入极低Logistic往往会对这些客户给出极高违约概率Probit则不会如此极端反过来对于处在分布中间的客户Probit能更敏锐地拉出差距。组合建模的另一个理论基础是模型平均的偏差-方差权衡。单模型如果训练充分偏差可能很低但方差大换一个样本区间结果就抖两个结构不同的模型加权之后方差通常能压下来偏差不一定会显著抬升。这在样本量有限的小额贷款场景里非常有实战价值。小额贷款公司通常不像银行那样有百万级的借贷样本单个模型的参数估计在子样本上波动明显组合模型相当于用两个不同视角互相锚定把“预测太少”和“预测太猛”的情形拉回合理区间。需要注意一点组合模型不是随便把两个概率拉出来求平均就完了。两个模型的概率刻度不同直接求均值在统计上没有明确意义。常见做法是先把每个模型的输出变成统一的评分刻度再做加权融合。这个流程到第四章会有完整代码示例。3. 组合模型怎么搭从融合策略到特征工程再到权重寻优的三段式流程3.1 先定组合策略概率融合、决策融合和分档融合各用在什么场景组合模型的第一步不是调参而是确定组合的方式。从业界常见做法来看组合策略大致分三类各有适用场景。第一类叫概率融合把两个模型预测的违约概率按权重直接加权得到一个合成概率。这个方案实现简单权重可以是固定的比如0.5/0.5也可以用网格搜索在验证集上找最优权重。适合场景两个模型的效果接近、相关性不高业务需要的是一个连续的风险分数而非硬分类。第二类叫决策融合两个模型分别给出通过/拒绝/人工复核的三分类结论再用规则合并。比如“两个模型都拒绝”才拒绝“两个模型都通过”才通过一真一假进人工复核。这种组合适合审批量较小、人工审核产能充足的小贷公司可以有效降低单一模型的误杀率。第三类是分档融合把每个模型的输出映射到信用等级比如A-E五档再用等级矩阵决定最终风险档位。这个方式在监管报送和业务解释上更友好风控人员可以直接看到客户被判定为A档但组合后进入B档的逻辑链条。对小额贷款公司来说我一般建议第一类和第三类结合使用先用概率融合产出连续分再按业务需求映射成等级分档。决策融合对人工成本的要求高小额贷款的自动化审批趋势下不太划算。3.2 特征筛选与多重共线性检查把变量体系做干净模型差异才有机会显现组合模型对特征质量的要求比单模型更高。因为两个模型虽然结构不同但如果输入变量本身就是高度共线、噪声占主导的那模型再组合也只是把噪声加权混合。常规的特征筛选流程包括三个步骤第一步是单变量分析对每个原始变量做IV值和坏样本占比趋势检验排除完全无区分度的变量。连续性变量先分箱再计算WOE和IV常见标准是IV低于0.02的变量直接弃用0.02到0.1之间弱变量看业务含义决定是否保留大于0.1的进入候选集。第二步是相关性检查和VIF诊断对进入多变量回归的变量计算皮尔逊相关矩阵和VIFVIF大于10的变量一般要剔除或做合并。这一步经常被新手跳过但小额信贷变量之间天然强相关比如“近3个月查询次数”和“近6个月查询次数”相关系数能到0.8以上不处理会让回归系数非常不稳换个样本区间系数正负号都可能翻转。第三步是前向/后向逐步回归结合业务经验的变量终选既看统计显著性也看业务解释是否通顺。这个流程做完Logistic和Probit模型吃进去的变量集合应当一致。只有输入一致组合模型的差异才能归因于两个模型的函数形式差异而不是变量选择差异。3.3 组合权重的寻优方法验证集上最大化KS或最小化Brier Score权重寻优是组合建模里的关键技术动作。通常的做法是在训练集上跑出两个模型然后在验证集上搜索权重w使得组合模型的目标指标最大。目标指标的选择取决于业务的最终诉求如果是审批排序优先最大化KS统计量如果是对违约概率的校准精度要求高优先最小化Brier Score。经验数据是当w取0.5附近时组合模型的KS通常和最优权重下的KS差距很小真正的差距来自变量分箱和模型训练细节而不是权重精度。所以权重寻优做一次网格搜索就够了不需要追求到小数点后两位。常见做法是让权重在0.2到0.8之间以0.1为步长做网格选出目标指标最高的组合再在0.5附近做一次细化验证防止过拟合到验证集上。另外需要注意组合模型的校准步骤不能省略。即使两个模型都训练得很充分加权后的概率分布也可能偏离真实违约率。常见做法是做一次等值校准比如把合成概率排序后按十分位分箱和每个箱体内的真实违约率做对比再用分段线性映射把偏差拉平。这一步在小额贷款这种坏样本率可能只有3%到5%的场景里特别重要因为概率微小的偏差放到信贷敞口上都对应真金白银的损失。4. 用Python从零复现这套组合模型样本构造、参数设置、加权融合与评分卡输出4.1 构造一个能体现两个模型差异的样本集非线性关系是组合增益的来源为了把组合模型的套路讲清楚我们不用真实业务数据涉及客户隐私和公司合规也不方便公开而是构造一个贴近小额贷款形态的模拟样本。重要变量包括年龄、月收入、贷款金额、信用使用率、信用历史长度。这些变量之间有明显的非线性交叉影响比如高负债率叠加短信用历史违约概率会显著抬升。import numpy as np import pandas as pd from scipy import stats import statsmodels.api as sm from sklearn.model_selection import train_test_split np.random.seed(42) n_samples 5000 df pd.DataFrame({ age: np.random.randint(22, 60, n_samples), income: np.random.lognormal(mean4.6, sigma0.6, sizen_samples), loan_amount: np.random.randint(2000, 20000, n_samples), credit_util: np.random.uniform(0, 0.95, n_samples), history_months: np.random.randint(1, 72, n_samples) }) # 构造违约概率注意credit_util和history_months存在交互效应 logit_score (-2.5 0.01 * (df[age] - 35) 0.25 * np.log(df[income]) - 0.00015 * df[loan_amount] - 2.0 * df[credit_util] - 0.35 * (df[credit_util] * np.log(df[history_months] 1)) 0.04 * np.log(df[history_months] 1)) prob_default 1 / (1 np.exp(-logit_score)) df[default] (np.random.rand(n_samples) prob_default).astype(int) print(df[default].mean()) print(df.shape)逻辑说明这里先构造违约概率时刻意引入交互项credit_util * log(history_months1)作用是在高信用使用率且历史较短的人群里拉高违约率。这种非线性关系恰好是Logistic基准模型不容易精确拟合、而Probit模型因尾部形状不同可能产生差异化输出的场景。参数说明n_samples5000比较贴近小额贷款公司单批次建模的样本量级random.seed(42)固定随机种子保证可复现lognormal生成收入是为了模拟偏态分布实际业务中收入也基本是右偏的直接取对数后再入模是常见预处理。接下来划分训练集和验证集。4.2 分别训练Logistic和Probit模型statsmodels的参数输出怎么看features [age, income_log, loan_amount, credit_util, history_months_log] df[income_log] np.log(df[income]) df[history_months_log] np.log(df[history_months] 1) X df[features] y df[default] X_train, X_val, y_train, y_val train_test_split(X, y, test_size0.3, random_state42) # 用statsmodels分别拟合Logistic和Probit logit_model sm.Logit(y_train, sm.add_constant(X_train)).fit(disp0) probit_model sm.Probit(y_train, sm.add_constant(X_train)).fit(disp0) print( Logistic 回归结果 ) print(logit_model.params) print(logit_model.summary2())逻辑说明sm.add_constant是为设计矩阵加上截距项statsmodels默认不会自动加disp0关闭训练过程的迭代信息输出避免日志刷屏。summary2()输出模型系数的z值、p值、置信区间和拟合优度指标。参数说明Logistic模型输出的系数是log-odds尺度解释方式是“变量每增加一个单位违约的对数优势比增加相应数值”更直观的做法是取exp(系数)得到优势比。Probit模型的系数在正态分布尺度上数值本身不能像Logistic那样直接解释成优势比但显著性检验和变量方向性判断是一致的。两个模型的AIC和伪R²可以直接对比通常差异在几个百分点以内。# 预测验证集上的违约概率 p_logit logit_model.predict(sm.add_constant(X_val)) p_probit probit_model.predict(sm.add_constant(X_val)) print(Logistic预测概率范围: {:.4f} ~ {:.4f}.format(p_logit.min(), p_logit.max())) print(Probit预测概率范围: {:.4f} ~ {:.4f}.format(p_probit.min(), p_probit.max()))逻辑说明对比两个模型在验证集上的概率分布会发现Logistic的范围略宽、极值更极端Probit整体更保守。这正是上一章讲过的尾部行为差异在实证数据上的体现。4.3 加权组合与阈值寻优把概率融合变成一张能对业务解释的评分卡from sklearn.metrics import roc_auc_score best_k 0 best_ks 0 ks_results [] for k in np.arange(0.2, 0.9, 0.1): p_combined k * p_logit (1 - k) * p_probit # 计算KS统计量 df_temp pd.DataFrame({p: p_combined, y: y_val.reset_index(dropTrue)}) df_temp[decile] pd.qcut(df_temp[p], 10, labelsFalse) cum_bad df_temp.groupby(decile)[y].mean().cumsum() cum_bad cum_bad / cum_bad.iloc[-1] cum_good (1 - df_temp.groupby(decile)[y].mean()).cumsum() cum_good cum_good / cum_good.iloc[-1] ks abs(cum_bad - cum_good).max() ks_results.append((k, ks)) if ks best_ks: best_ks ks best_k k print(最优权重k: {:.1f}, 最大KS: {:.4f}.format(best_k, best_ks)) best_weight_logit best_k best_weight_probit 1 - best_k逻辑说明这段代码的核心是遍历Logistic概率的权重kProbit权重自动对应1-k。在每个k值下把组合概率按十分位分箱再计算累积好客户占比和累积坏客户占比之差的峰值也就是KS统计量。KS越大说明模型对好坏的排序能力越强。参数说明为什么步长选0.1而不是更细因为组合模型对权重并不敏感从0.2到0.8之间的KS变化通常不超过0.02步长太细会增加计算时间而不会带来实际收益。如果想细调常见做法是在最优k附近再做一次0.01步长的局部搜索但不要在验证集上反复精细调容易过拟合验证集。# 将合成概率映射成标准评分卡分数 def prob_to_score(p, base_score600, base_odds50, pdo50): score base_score pdo / np.log(2) * np.log((1 - p) / p * base_odds) return np.clip(score, 300, 900) score_val prob_to_score(best_k * p_logit (1 - best_k) * p_probit) print(评分范围: {:.0f} ~ {:.0f}.format(score_val.min(), score_val.max()))逻辑说明把小额贷款的业务分数映射成标准信用评分公式里base_score600是基准分base_odds50表示基准分处好客户是坏客户的50倍pdo50表示分数每提高50分好坏比翻一倍。这些参数通常结合公司历史审批通过率和风险偏好来定这里用的是行业内常见的基准值。评分卡输出的意义在于把两个模型的概率融合结果转成业务人员和监管一眼能看懂的语言。5. 组合建模落地的5个坑从概率尺度到回测虚高全是真实的翻车记录5.1 概率尺度不同直接平均排序能力反而变差现象把Logistic和Probit输出的违约概率直接取平均值组合后的AUC和KS比两个单模型都低自己怎么也想不通。原因两个模型的概率并不是同一个“尺子”上量出来的。Logistic的尾部更厚对部分客户可能给出0.87的概率Probit对同一客户可能只给0.78。直接平均相当于把两个不同刻度的量强行相加破坏了排序关系。见过不止一个团队在这里踩坑还以为组合模型没有用。解决组合之前先把概率映射到统一的评分刻度上常见做法是先对概率做logit变换再用均值和标准差做标准化最后加权。这个顺序不能反。代码上就是把prob_to_score这一步放到加权之前而不是之后。5.2 坏样本占比过低时阈值寻优会失效现象样本里坏客户只有3%验证集上寻优出来的阈值把所有客户的概率阈值压到0.12审批通过率只有20%业务量直接崩了。原因在正负样本极不平衡的情况下KS或AUC寻优产生的概率阈值会紧盯“少数的坏客户”导致阈值偏高。模型排序能力没问题但业务上的通过率目标和风险容忍度没有被纳入寻优目标函数。解决阈值不能只看统计指标要结合业务通过率目标反推。常见做法是把“审批通过率不低于某个比例”作为约束条件再在满足约束的概率区间内找风险最小的阈值。也可以对样本做加权或过采样但要注意加权幅度不要超过4比1否则模型的概率校准会明显偏移。5.3 强相关变量双双入选模型系数方向半年后翻转现象变量清单里同时存在“近3个月查询次数”和“近6个月查询次数”两个变量IV值都很高模型训练时也都显著系数为正。过了半年重新训练同一模型近3个月查询次数的系数变成了负号。原因这就是典型的多重共线性削弱系数稳定性。两个变量时间窗口重叠信息高度重合在样本变动时回归系数会互相分摊、符号漂移。Logistic和Probit组合模型里输入变量共线问题会被放大因为两个模型各自的系数稳定性都差组合权重跟着一起抖。解决入模前跑一遍VIF诊断VIF大于10的变量采取合并或剔除策略。比如把“近3个月查询次数”和“近6个月查询次数”整合成“近6个月平均月查询次数”或保留历史更长的一个从源头上消除信息重叠。5.4 训练集和验证集时间窗口重叠回测KS虚高现象训练集用的是2024年1到6月放款的客户验证集也用了2024年1到6月放款的客户只是做了随机划分。回测KS 0.45模型上线后一个月实际KS只有0.22。原因同一时间段内的客户天然共享了宏观环境和展业策略随机划分把“同时期”的信息泄漏到了验证集里。线上预测的是未来客户和训练集所处的时间窗口不同宏观环境和客群结构都可能偏移回测必然乐观。解决小额贷款这类快周转业务正确的划分方法是按放款月份做时序切分用2024年1到6月训练、2024年7到9月做验证、2024年10月以后做上线测试。模型上线后还要持续监控滚动的KS和PSI发现衰减超过20%就要考虑重训。5.5 只盯AUC不盯Brier Score模型排序好但概率校准一塌糊涂现象组合模型AUC到0.74团队很高兴但把预测概率按十分位分箱后发现第10箱的预测违约概率是28%实际违约率到了41%。业务按概率定价这个偏差直接导致定价偏低、坏账损失上浮。原因AUC只衡量排序能力也就是好人分高、坏人分低它完全不关心概率绝对值是否贴近真实违约率。Logistic和Probit两个模型各自也有校准偏差加权之后偏差不会自动抵消。解决在评估指标里补上Brier Score计算方式是对每个样本取“预测概率减实际标签”的平方再求平均。Brier Score低于0.15算可用高于0.2就需要做概率校准。校准方法可以用Platt Scaling也可以用等值分箱校准简单说就是分箱后对比预测值和实际值做分段线性修正。以下是一个典型的风控模型性能对比表评估时按这个口径输出才算完整指标单一Logistic单一Probit组合模型判定口径KS0.370.350.41越大越好按十分位分箱计算AUC0.710.700.74越大越好关注排序能力Brier Score0.1480.1520.141越小越好小于0.15可用第10箱概率偏差9.5%7.8%5.2%偏差小说明校准好6. 把组合模型推向真实业务线之前两个必做的验证和一套止损习惯组合模型在进入审批流程前至少要在两个维度上做验证。第一个是分群稳定性验证把验证集按放款渠道、客户来源、金额区间拆成几个子群分别计算子群的KS和坏账率如果某个子群上组合模型比两个单模型效果都差说明这个群的特征和整体差异太大不能直接套用统一权重需要做分群建模或分群调权。第二个是模拟上线验证用历史某一段时间的真实申请数据跑过完整的审批流程计算模拟通过率、坏账率和件均额度下的预期损失对比当前策略的收益和风险缺口这一步能把“模型效果好”转化成“业务上能赚多少钱”是风控模型团队和大boss沟通时最有说服力的口径。另外需要特别注意拒绝推论问题。小额贷款公司的历史数据里被拒绝的客户没有真实违约标签直接用通过客户训练的模型去评估全量申请客群样本分布天然有偏。常见补救做法是为拒绝样本提取特征结合催收记录或人工复核结果构造拟标签或者在模型上线前用影子评分模式跑一段时间把模型预测结果记录但不参与决策观察被拒绝客户的后续表现。影子模式虽然增加了一个月的上线周期但它能给你一份数据上的后悔药避免模型直接带病上线。最后说一个我自己的习惯组合模型上线后每个月固定对比两个单模型和组合模型的KS衰减速度。如果连续三个月组合模型的KS不再领先单模型说明两个模型的差异化信息正在消失——这通常是对变量进行了重复改造导致的或者是客群结构发生了整体迁移。这种时候不要急着调权重先回去看占两个模型差异最大的那部分客户特征有没有变化。组合模型的维护成本比单模型高但它的另一半价值恰恰在于当两个模型开始趋同时它在提醒你业务输入变量已经退化该补充新变量了。希望这篇笔记能帮你把Logistic和Probit组合模型从纸面思路落成一套能跑、能解释、能上线验证的方案。本文还有配套的精品资源点击获取
返回列表