☰
小额贷款信用风险评估实战:Logistic与Probit组合模型解析
2026/10/2 10:06:20 网站建设 项目流程

简介:小额贷款公司客群多为难以从传统金融机构获得贷款的个人与组织,信用风险评估因此成为控制坏账的关键环节。一份围绕该场景的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形曲线,在p=0.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诊断,对进入多变量回归的变量计算皮尔逊相关矩阵和VIF,VIF大于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(mean=4.6, sigma=0.6, size=n_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_months+1),作用是在高信用使用率且历史较短的人群里拉高违约率。这种非线性关系恰好是Logistic基准模型不容易精确拟合、而Probit模型因尾部形状不同可能产生差异化输出的场景。

参数说明:n_samples=5000比较贴近小额贷款公司单批次建模的样本量级;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_size=0.3, random_state=42) # 用statsmodels分别拟合Logistic和Probit logit_model = sm.Logit(y_train, sm.add_constant(X_train)).fit(disp=0) probit_model = sm.Probit(y_train, sm.add_constant(X_train)).fit(disp=0) print("=== Logistic 回归结果 ===") print(logit_model.params) print(logit_model.summary2())

逻辑说明:sm.add_constant是为设计矩阵加上截距项,statsmodels默认不会自动加;disp=0关闭训练过程的迭代信息输出,避免日志刷屏。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(drop=True)}) df_temp['decile'] = pd.qcut(df_temp['p'], 10, labels=False) 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概率的权重k,Probit权重自动对应1-k。在每个k值下,把组合概率按十分位分箱,再计算累积好客户占比和累积坏客户占比之差的峰值,也就是KS统计量。KS越大说明模型对好坏的排序能力越强。

参数说明:为什么步长选0.1而不是更细?因为组合模型对权重并不敏感,从0.2到0.8之间的KS变化通常不超过0.02,步长太细会增加计算时间而不会带来实际收益。如果想细调,常见做法是在最优k附近再做一次0.01步长的局部搜索,但不要在验证集上反复精细调,容易过拟合验证集。

# 将合成概率映射成标准评分卡分数 def prob_to_score(p, base_score=600, base_odds=50, pdo=50): 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_score=600是基准分,base_odds=50表示基准分处好客户是坏客户的50倍,pdo=50表示分数每提高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组合模型从纸面思路落成一套能跑、能解释、能上线验证的方案。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询