📰 来源:Towards Data Science | 📅 翻译日期:2026年6月25日
🔗 原文:查看原文
🤖 翻译:DeepSeek AI · 仅供参考
本文所有代码可在 GitHub 上获取。业务逻辑和建模函数位于 src/selection 目录,具体文件为:
src/modeling/score_computation.py
对应的分析和结果记录在:
09_score_computation.qmd
图像、表格和图表均借助 Codex 编码助手生成。
FICO 信用评分逻辑
在美国,信用评分无处不在。它决定你是否能获得贷款、信用卡甚至租房。大多数决策背后的模型是 FICO。其逻辑简单明了:
- 付款历史(35%):按时支付账单。
- 欠款金额(30%):保持信用卡使用率低于 20%。
- 信用历史长度(15%):越长越好。
- 信用组合(10%):使用不同类型的信用。
- 新信用(10%):限制新申请。
如果你按时支付信用卡账单,分数就会上升。付款历史权重最高。
这些权重产生一个分数,分为几个区间:
300–579:较差580–669:一般670–739:良好740–799:优秀800–850:极佳
本文遵循相同的逻辑,但将其应用于我们自己的模型。
我们的模型与数据
我们使用本系列构建评分模型的数据集。目标很简单:为每个保留的变量分配权重,计算数据中每个客户的分数,并展示如何计算新客户的分数。
像之前一样,Codex 帮助编写代码并构建表格和图表。我反复强调这一点,因为它很重要:你可以使用 AI 代理来加快工作速度,但要检查它们的输出。只有验证后,信任才会增长。使用这些工具,但保持警惕。
上次我们保留了四个变量:
loan_int_rate:贷款利率loan_percent_income:收入用于还款的比例cb_person_default_on_file:借款人是否有过违约home_ownership_3:借款人的住房状况
像 FICO 一样,我们为每个变量分配权重,并从 0 到 1000 构建分数。高分意味着低风险,低分意味着高风险。
从模型系数到分数
我们将每个系数转化为分数。
变量每个类别的分数
以 loan_int_rate 为例。类别 ii 的分数为:
$$ SC(j,i) = 1000 \times \frac{ |c(j,i)-\alpha_j| }{ \sum_{j=1}^{p}\alpha_j } $$
其中,c(j,i) 是变量 j 类别 i 的系数,α_j 是变量 j 的最大系数。例如,对于 loan_int_rate,最大系数为 α_j = 1.357044926979。
该公式给出了下面的分数表。
客户分数计算步骤
以一个新客户为例,我们逐一检查每个变量所属的类别:
loan_int_rate为 10%:分数181.72loan_percent_income为 25%:分数0- 无过往违约(
cb_person_default_on_file = N):分数59.52 - 拥有房屋(
home_ownership_3 = OWN):分数373.94
将这些分数相加得到客户的最终分数:
$$ 181.72 + 59.52 + 0 + 373.94 = 615.18 $$
我们对数据中的每个客户重复此过程。
每个变量的重要性
一旦有了分数,我们便询问:哪个变量的影响最大?
我们在训练数据上测量:
$$ q_j = \frac{ \sum_{k=1}^{m_j} p_k \cdot |\overline{SC}_j - SC_k| }{ \sum_{j'=1}^{n} \sum_{k=1}^{m_{j'}} p_k \cdot |\overline{SC}_{j'} - SC_k| } $$
其中,
p_k:变量 j 中类别 k 的客户比例;\overline{SC}_j:变量 j 经人口加权的平均得分;m_j:变量 j 的类别数量;n:模型中变量数量。
简而言之,q_j 表示变量 j 对分数的驱动程度。其不同类别之间的差异越大,权重越高。
下表显示每个变量的权重:
loan_percent_income权重最大,为 35%。- 其次是
home_ownership_3,31%。 - 然后是
loan_int_rate,28%。 - 最后是
cb_person_default_on_file。
这很合理。将超过 20% 的收入用于还款的客户风险高。该变量对分数影响最大是好消息:模型捕捉到了正确的信号。
分数能否有效区分风险?
在构建风险网格之前,我们检查分数是否履行了职责:区分违约者与非违约者。
我们绘制每组分数密度图,按违约状态分割,并覆盖训练集、测试集和跨期数据。
两条曲线相距越远,分数效果越好。
我们看到:违约集中在低分区域,非违约集中在高分区域。这正是我们想要的:高分低风险。
构建风险网格
现在我们构建网格。
步骤 1:按分数分组的违约率
我们将分数划分为 20 个等分组,并绘制各组的违约率。从分数二十等分位(20个等大小分段)与违约率的关系图开始。
该图表是网格的基础:它自然地提供了将 20 个分段合并为六个风险类别的起始点。
步骤 2:六个风险类别
基于上图,我们将 20 个分段分组如下:
- 组 1、2、3:分数
0-241,最低分,最高风险。 - 组 4、5、6:分数
241-331。 - 组 7、8:分数
332-498。 - 组 9、10、11、12:分数
498-589。 - 组 13、14、15、16、17:分数
589-780。 - 组 18、19、20:分数
781-1000,最高分,最低风险。
这些类别必须满足三个规则:
✓ 每个类别内部风险一致;
✓ 每个类别与下一个类别的风险差异至少 30%;
✓ 每个类别至少包含 1% 的所有客户。
上表显示这些规则被遵守。
步骤 3:检查稳定性
风险网格只有在时间推移中保持稳定才有效。我们检查两点:
- 较风险类别在后续时间段中是否保持高风险?
- 较安全类别是否保持低风险?
我们将在后续文章中进行验证。
参考资料
- GitHub 仓库 - 完整代码
- FICO 评分标准官方文档
评论已关闭