小额贷款信用评分:Logistic与Probit双模型组合实战
发布时间:2026/9/18 5:36:27来源:尧图网络
简介小额贷款公司个人贷款信用风险评估研究PDF围绕Logistic与Probit组合模型在小额信贷风控中的应用展开面向小额贷款公司风控人员、金融专业学生及从事信用评分模型研究的读者。内容先阐述信用风险评估对小额贷款公司的重要性再对比两种常用模型的特点随后给出组合模型的构建方法与实证结果指出该组合模型识别准确率约为70%能为贷款决策提供相对可靠依据。资源包为1个pdf文件压缩包大小约1.88MB便于直接阅读文件包含完整的摘要、关键词、研究背景、模型论述及结论适合用于了解小额贷款信用风险建模思路与参考论文写作结构。内容已有156人学习浏览对于正在研究信用评分模型或准备相关论文的人群具有一定参考价值。1. 小额贷款公司的信用风险评估不能照搬银行的评估体系优质客户基本被现有金融机构垄断剩下的客群信用记录薄弱加上“只贷不存”的资本约束风险压力远高于常规金融机构。直接上KMV这类依赖市场数据的现代信用风险模型对小贷公司既不现实也不经济。相对务实的路径是Logistic和Probit这类信用评分模型它们只需要贷款记录和违约标签两类数据构建成本低、可解释性强在个人信贷场景下识别准确率能做到70%左右。这里要拆解的是一条完整的建模路径因子分析降维、双模型构建、加权组合预测让它直接嵌入信贷审批流程。适合正在搭建风控初版、或想改进现有审批流程的团队。动手前先明确定位模型不替代信贷员而是提供量化参考把主观判断和违约概率放在同一张桌面上比对。2. Logistic与Probit的理论边界与选型依据2.1 从Z-score到广义线性模型的演进逻辑个人信用评估的方法论演进本质上是在判别准确性和假设条件宽松度之间找平衡。最早的Beaver单变量模型靠一个财务比率定生死简单但粗糙。Altman 1968年的Z-score模型用多元判别分析MDA把5个变量线性组合在20世纪70年代后很长一段时间里是主流。但MDA有两个严格的假设前提变量服从多元正态分布且两类样本的协方差矩阵相同。实际信贷数据里变量偏态分布、存在离群值这两个假设几乎不可能满足强行使用时系数的稳定性会很差。Ohlson在1980年把Logistic回归引入信用风险判别领域打破了这种约束。Logistic不做正态性和协方差假设直接对违约概率P(y1|x)建模输出天然落在(0,1)区间内。论文里提到Logistic在个人信用和小企业信用评价上的准确率在54%到90%之间这个区间跨度非常大反映出它对数据质量的敏感——样本量、变量选择、违约标签的准确性都会影响最终效果。也正是因为单一模型的波动范围太大作者才引入Probit做双模型组合两个结构不同但数学上近似的模型在各样子本子集上的误差模式不一样加权后可以互相纠正。2.2 Logistic与Probit的本质区别Probit和Logistic在数学上极其相似都是广义线性模型区别在于连接函数的选择。Logistic用logit连接把违约概率的log-odds作为自变量的线性组合Probit则用标准正态分布累积分布函数的逆函数Φ⁻¹做连接函数logit: log(p/(1-p)) β₀ β₁x₁ ... βₖxₖprobit: Φ⁻¹(p) β₀ β₁x₁ ... βₖxₖ区别体现在三个层面。第一误差项分布假设不同Logistic对应的是标准差约1.81的Logistic分布尾部比正态分布略厚意味着Logistic对小概率事件的估计比Probit更敏感。第二参数解释方式不同Logistic回归的系数取exp之后就是比值比OR可以直接说“某个变量每增加一个单位违约odds变为原来的多少倍”Probit系数不能这样解释只能计算边际效应汇报给业务方时不如OR直观。第三在大样本下两者基本等价但在样本量小、违约比例低的时候Probit的参数估计往往比Logistic更稳定因为正态CDF在极端值附近变化更平缓不容易被少量极端样本带偏。维度LogisticProbit链接函数log(p/(1-p))Φ⁻¹(p)误差分布Logistic分布厚尾标准正态分布参数解释exp(系数)即OR值只能做边际效应小样本稳定性对极端值略敏感更平缓、更稳计算复杂度logit显式表达收敛快需正态CDF迭代略慢2.3 为什么组合模型能提升稳定性组合预测的思想来自Bates和Granger 1969年的研究两个模型如果结构不同、误差来源不同那么对它们的结果做加权平均可以在不增加数据需求的前提下降低预测方差。针对个人信贷场景Logistic和Probit在数学上的等价性保证了它们给出的违约概率不会打架而误差分布假设的差异又保证了它们不会在同一个样本子集上同时犯错。论文在实证里也验证了这一点。单独用Logistic的准确率区间在54%到90%波动范围很大单独用Probit的结果也类似但把两者线性组合后在论文的小额贷款公司案例中识别准确率稳定在70%左右。这个提升不是调参调出来的而是组合本身消除了单一模型在特定样本子集上的系统性预测偏差。对数据量有限的小贷公司来说这是性价比最高的模型增强手段。3. 指标体系设计与因子分析降维实操3.1 个人信贷指标体系的搭建小额贷款公司建模的原始数据来自自身的放款记录常见字段包括年龄、月收入、职业、负债收入比、贷款金额、贷款期限、授信利率、担保方式、历史还款记录、贷款用途等。这些字段同时包含定量数据和定性数据其中定性变量如职业、贷款用途需要处理成哑变量或有序编码。指标不是越多越好小额贷款公司的样本量通常只有几千条甚至几百条按EPV原则每个自变量至少需要10到15个违约样本否则参数估计会非常不稳定。一个经过筛选的参考指标体系如下变量含义类型age年龄数值型income月收入元数值型debt_ratio负债/收入数值型loan_amount贷款金额元数值型loan_term贷款期限月数值型has_guarantee有无担保/抵押0/1house_own自有住房情况0/1late_days_hist历史最大逾期天数数值型loan_purpose贷款用途类别型education教育程度有序类别型default是否违约标签0/1论文里对违约的定义是贷款到期后一定期限内未足额还款这个定义直接决定违约率的基线水平也会影响后续所有评估指标的数值。建模前建议先画一下违约率在各变量上的分布确认类别变量没有零频次水平比如某个职业类别的样本数为0会让该变量的系数无法估计。个人的经验是指标体系的搭建应该在业务访谈基础上完成变量含义要先和信贷员对齐再进代码否则后面每一步都是在错误假设上堆积。3.2 数据预处理的关键细节预处理有四个关键细节。缺失值方面收入、负债比这类数值变量用中位数填充比均值更稳因为收入分布通常右偏少数高收入申请人的均值会明显拉高填充基准对类别变量把缺失单独编码为一个“unknown”级别保留信息完整性。离群值方面收入字段经常同时出现几百和几百万的极端值用1%和99%分位数做截尾否则标准化之后离群值仍然会主导模型的损失函数。标准化方面后续要做因子分析各变量量纲差异太大直接用StandardScaler把每个特征放到零均值和单位方差下因子旋转才能得到均衡的载荷分布。样本均衡性也要单独检查。小额贷款公司的违约率通常低于10%直接用原始样本训练模型会倾向于把所有样本判为正常客户AUC看着不低但坏客户一个都抓不住。常见的处理是违约样本过采样、正常样本欠采样或者用SMOTE合成少数类样本这些方法不改变原始数据分布的信息量但能让模型在训练时平等看待两类样本。这一步不影响因子分析的结构但要放在训练集和测试集划分之后再做。import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split df pd.read_csv(micro_loan_data.csv) target default num_cols [age, income, debt_ratio, loan_amount, loan_term, late_days_hist] # 中位数填充缺失值 for c in num_cols: df[c] df[c].fillna(df[c].median()) # 1%/99%分位数截尾处理离群值 def winsorize(s, lower0.01, upper0.99): lo, hi s.quantile([lower, upper]) return s.clip(lo, hi) for c in num_cols: df[c] winsorize(df[c]) # 分类变量独热编码 cat_cols [loan_purpose, education, has_guarantee] df_model pd.get_dummies(df, columnscat_cols, drop_firstTrue) # 标准化 scaler StandardScaler() X scaler.fit_transform(df_model.drop(columns[target])) y df_model[target].values X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, stratifyy, random_state42 )这段代码的处理顺序有讲究先填充缺失再截尾再做哑变量编码最后标准化。如果先标准化再截尾离群值已经被压缩进标准化计算里截尾就失去意义了。stratifyy保证训练集和测试集的违约比例与总体一致这是分类任务里避免评估偏差的基本操作特别是在违约率本身就很低的情况下不设置stratify可能在随机划分时把违约样本全分到某一侧。3.3 因子分析降维的Python实现论文在进入回归建模之前先做因子分析目的不是为了降维本身而是消除多重共线性。信贷指标里收入、贷款金额、负债比之间天然高度相关直接放进回归模型系数的标准误会变大甚至出现符号不符合常理的情况。因子分析把高频共线的原始变量浓缩成少数几个公共因子再用因子得分替代原始变量进入Logistic或Probit回归模型的系数稳定性会明显改善。用factor_analyzer库实现先检验适用性再做因子旋转最后抽取因子得分。# pip install factor_analyzer from factor_analyzer import FactorAnalyzer from factor_analyzer.factor_analyzer import ( calculate_kmo, calculate_bartlett_sphericity ) kmo_all, kmo_model calculate_kmo(pd.DataFrame(X_train)) bartlett_stat, bartlett_p calculate_bartlett_sphericity(pd.DataFrame(X_train)) print(fKMO {kmo_model:.3f}, Bartlett p {bartlett_p:.4f}) # 用特征值大于1的经验法则确定因子数 fa_init FactorAnalyzer(rotationNone, n_factorsX_train.shape[1]) fa_init.fit(pd.DataFrame(X_train)) ev, _ fa_init.get_eigenvalues() n_factors (ev 1).sum() print(f特征值大于1的因子数: {n_factors}) # varimax旋转的因子分析 fa FactorAnalyzer(n_factorsn_factors, rotationvarimax) fa.fit(pd.DataFrame(X_train)) X_train_factors fa.transform(pd.DataFrame(X_train)) X_test_factors fa.transform(pd.DataFrame(X_test))KMO值低于0.6就说明变量间的公共度不够不适合做因子分析Bartlett球形检验的p值小于0.05才说明相关矩阵显著异于单位阵可以继续。因子数用特征值大于1的经验法则确定后建议看一眼累积方差贡献率不足70%就多取一个因子。varimax旋转让每个因子只在少数变量上有高载荷后续给因子起业务名时会更直观比如载荷集中在收入、贷款金额、负债比上的因子可以解释为“偿付能力因子”。这里有一个容易被忽略的关键点因子分析和StandardScaler一样必须在训练集上拟合再对测试集做transform。如果在全量数据上做因子分析再划分训练集测试集会引入数据泄露测试集上的评估结果虚高上线后实际效果和离线验证对不上。上面这段代码严格遵循了“先划分、后拟合”的顺序这部分操作直接复用到Logistic和Probit的构建上。4. Logistic与Probit双模型构建与组合预测4.1 Logistic回归构建与参数解读因子得分替代原始变量后用statsmodels的Logit来训练。statsmodels输出标准的回归汇总表能直接看到每个因子的系数、标准误、z值和p值这对理解模型的业务含义很重要。sklearn的LogisticRegression只给出系数不做显著性检验在信贷风控这种强监管场景下可解释性优先级高于便捷性所以我一般用statsmodels。import statsmodels.api as sm X_train_const sm.add_constant(X_train_factors) logit_model sm.Logit(y_train, X_train_const) logit_res logit_model.fit(disp0) print(logit_res.summary()) # 检查收敛状态 print(Converged:, logit_res.mle_retvals[converged])输出里重点看Pseudo R-squ和系数的p值。Pseudo R-squ不像线性回归的R²有明确的方差解释意义它反映的是模型相对空模型的似然比提升度一般大于0.1就有参考价值。系数p值大于0.05说明该因子对违约概率没有显著贡献可以考虑从模型里剔除。statsmodels的Logit不会自动加正则化如果变量的共线性没有被因子分析完全消除系数标准误仍然会偏大这一点反过来可以用来验证因子分析的效果对比原始变量建模和因子得分建模的系数标准误后者通常会小一截。p_logit logit_res.predict(sm.add_constant(X_test_factors))4.2 Probit回归构建与对比Probit的训练方式和Logistic几乎一样换一个类名即可。statsmodels对Probit的实现用的是标准正态CDF做连接函数模型估计同样基于最大似然。probit_model sm.Probit(y_train, X_train_const) probit_res probit_model.fit(disp0) print(probit_res.summary()) p_probit probit_res.predict(sm.add_constant(X_test_factors))把两个模型的预测概率放在一起对比通常会看到在违约概率处于0.2到0.8的中段区间两个模型的输出几乎重合在两端即概率低于0.1或高于0.9的区域Probit的预测值会略为保守因为正态CDF的尾部衰减比Logistic分布快。这个差异在单个样本上无足轻重但在大批量审批时会影响到通过率的零点几个百分点而正是这部分差异为后面的组合模型提供了互补信息。需要注意statsmodels的Probit默认假设误差方差为1这是识别约束。潜变量模型的方差和阈值无法同时识别必须固定其中一个标准做法就是固定方差为1。实际使用中不要动这个约束否则所有参数估计都会失去参照基准。4.3 线性加权组合模型的实现论文把Logistic和Probit组合成一个线性加权模型权重确定没有唯一标准。最朴素的方案是简单平均α0.5相当于取两个模型预测概率的均值实现成本最低也最容易向业务方解释。更好的方案是Bates-Granger误差方差加权计算两个模型在验证集上的误差向量误差方差更小的模型获得更高的权重。公式是α Var(e_probit) / (Var(e_logit) Var(e_probit))权重自动落在0到1之间当两个模型的误差方差相等时退化为简单平均。第三种做法是回归法用测试集真实标签对两个预测概率做线性回归回归系数就是最优权重但过拟合风险更高样本量不足时不如前两种可靠。e_logit y_test - p_logit e_probit y_test - p_probit var_logit np.var(e_logit, ddof1) var_probit np.var(e_probit, ddof1) alpha var_probit / (var_logit var_probit) p_combo alpha * p_logit (1 - alpha) * p_probit print(fLogistic权重 {alpha:.3f}, Probit权重 {1 - alpha:.3f})alpha对应赋予Logistic的权重。当Logistic的误差方差更大时alpha会偏小模型自动把更多权重给Probit反之亦然。背后的逻辑是最小化组合预测的误差方差理论上可以推导出解析解。实际落地时建议配合AUC做交叉验证如果两个模型的AUC差距不大权重直接用误差方差公式就行如果AUC差距明显先检查预处理和变量选择而不是靠调权重弥补。4.4 模型评估与阈值选择评估信用评分模型不能只看准确率。违约率只有5%的数据集上即使全判为正常客户准确率也有95%但这样的模型毫无用处。AUC和KS是更主流的判别力指标。AUC反映模型把违约客户排在正常客户之前的概率0.7以上基本可用0.8以上算优秀KS是ROC曲线上TPR和FPR的最大差值代表模型在某个阈值下的最大区分能力。from sklearn.metrics import roc_auc_score, roc_curve models {logit: p_logit, probit: p_probit, combo: p_combo} for name, p in models.items(): auc roc_auc_score(y_test, p) fpr, tpr, thr roc_curve(y_test, p) ks max(tpr - fpr) print(f{name}: AUC{auc:.3f}, KS{ks:.3f})阈值选择不能直接定0.5因为信贷场景里两类错误的代价不对称把坏客户放进来直接产生坏账损失把好客户拒掉只损失一笔预期利息收入。论文里“识别准确率70%左右”这个数字是在特定阈值下得到的结果落到业务场景里必须重新校准。下面用一组模拟数字演示阈值对业务指标的影响阈值通过率坏账率误拒率0.378.2%3.1%12.4%0.571.5%1.8%19.7%0.763.0%0.9%28.6%阈值从0.3提到0.7通过率下降约15个百分点坏账率从3.1%压到0.9%但误拒的正常客户比例从12.4%上升到28.6%。怎么权衡取决于这家公司当前是更缺资金成本还是更怕坏账损失。一个可操作的思路是设定坏账率上限比如不超过2%反推出最低可接受阈值。5. 模型验证技巧与信贷实务边界5.1 组合模型的稳定性验证方法模型在内部评审或上线前稳定性验证比判别力验证更重要。信贷数据的分布会随着宏观周期、展业区域和进件策略变化发生偏移一个在训练集上KS达到0.45的模型半年后KS掉到0.2以下并不罕见。常用的稳定性验证手段有两类时间外推验证和群体稳定性指数PSI。时间外推验证是把时间上前80%的样本做训练集、后20%做测试集模拟模型在真实“未来”的表现。它能暴露两个常规随机划分暴露不了的问题一是训练集和测试集重叠在同一时间段模型把特定时期的宏观波动当成规律学进去了二是随着展业策略调整新进件客户的画像和存量客户有明显差异。下面这个函数计算PSI衡量的是模型在训练样本上的概率分布和最新样本上的概率分布之间的偏移程度def calculate_psi(expected, actual, bins10): expected_bins np.percentile(expected, np.linspace(0, 100, bins 1)) expected_counts np.histogram(expected, expected_bins)[0].astype(float) 1e-6 actual_counts np.histogram(actual, expected_bins)[0].astype(float) 1e-6 expected_ratio expected_counts / expected_counts.sum() actual_ratio actual_counts / actual_counts.sum() return np.sum((expected_ratio - actual_ratio) * np.log(expected_ratio / actual_ratio)) psi calculate_psi(p_logit_train, p_logit_recent) print(fLogistic PSI {psi:.3f})PSI小于0.1表示分布稳定0.1到0.25说明有明显偏移超过0.25需要考虑重训。bins的选择会影响PSI的绝对值用等分位数分箱比较稳健固定分箱边界则更利于跨期比较。建议在评估时把训练集和最近三个月的进件数据都跑一遍PSI如果三个月的PSI趋势单调上升即使绝对值还没超标也说明有系统性变化在发生。对Logistic、Probit和组合模型分别计算PSI哪个模型的PSI最低哪个就更适合作为当前阶段的主模型。5.2 应用中的常见陷阱与信贷员配合模型落地最容易踩的坑不是算法问题而是数据质量问题。小额贷款公司的客户自报收入普遍存在高估征信口径和信贷员实地考察口径经常不一致这个变量的测量误差会直接影响模型参数。建议的做法是在进件系统里把评分模型需要的字段设为必填项并与征信报告做关联校验不一致程度超标的记录打标记由信贷员复核后再进入评分流程。样本量不足时不要盲目引入过多变量。论文里也提到小额贷款公司的客户多数是从银行体系里被筛出来的违约模式比银行客群更复杂模型的作用是辅助决策而不是替代信贷员。这里的关键在于把模型输出和人工判断当成两个独立信号模型给违约概率信贷员看还款意愿和担保条件两个信号都强才放款任一个信号弱就走补充调查流程。信贷员的职业操守和个人判断能力是对模型结果做最后把关的必备条件评分模型做的是客群层面的风险分层单笔贷款的最后决策始终需要人来完成。本文还有配套的精品资源点击获取
网站建设高端定制企业官网