【教程】如何利用bbbrisk一步一步实现评分卡

news2025/4/5 0:25:15

利用bbbrisk一步一步实现评分卡

  • 一、什么是评分卡
    • 1.1.什么是评分卡
    • 1.2.评分卡有哪些
  • 二、评分卡怎么弄出来的
    • 2.1.如何制作评分卡
    • 2.2.制作评分卡的流程
  • 三、变量的分箱
    • 3.1.数据介绍
    • 3.2.变量自动分箱
    • 3.3.变量的筛选
  • 四、构建评分卡
    • 4.1.评分卡实现代码
    • 4.2.评分卡表
    • 4.3.阈值表与分数分布图

一、什么是评分卡

1.1.什么是评分卡

评分卡,一般是指用于小贷客户质量评分的评分卡表。
评分卡样式如下:
什么是评分卡
来了一个新客户,先根据客户的数据,判断客户在各个特征上属于哪一组
然后在评分卡表中找到对应的分数,对所有特征得分求和,并加上基本分,就是客户的总评分
假设客户在rev、due30、due90、city上的组别为【0、3、1、1】
那么客户在rev、due30、due90、city上的得分为【28、-30、-20、5】
则客户的总得分为28-30-20+5+780=763

1.2.评分卡有哪些

针对评分的使用不同场景,一般分为A、B、C、F卡

  • A卡:Application scorecard,申请评分卡
    A卡用申请数据,建立模型,评估用户是否会坏账
    作用:用于审批放款
  • B卡:Behavior scorecard,行为评分卡
    C卡作用于借贷中的客户。加入贷后还款等行为数据
    多种作用:可用于老客户提额
  • C卡:Collection scorecard,催收评分卡
    作用于借贷中的客户
    作用:预测用户是否会逾期,提前催收
  • F卡:(Fraud scorecard):欺诈评级评分卡
    作用于申请阶段,针对欺诈客户的判断

二、评分卡怎么弄出来的

2.1.如何制作评分卡

评分卡建模的思路与流程如下: 先在原始数据中,衍生并选择出建模的变量, 然后用建模变量与好坏客户标签建立逻辑回归模型。这样就能通过建模变量预测样本是坏客户的概率,最后,把逻辑回归模型的线性部分抽取出来,生成评分卡。
最后的最后,还需要分析当前业务应以哪个分数作为拒绝客户的临界值,以临界值作为评分阈值。

2.2.制作评分卡的流程

评分卡流程

  1. 建模数据准备
    数据准备主要是建模之前,对原始数据进行分箱与变量分析
    筛选出与客户质量相关的变量,作为建模的输入特征
  2. 建模
    (1)数据预处理:归一化,并预留测试数据
    (2)用逐步回归选出尽量少的特征(同时保持建模效果)
    (3)训练逻辑回归模型
    (4)检验AUC是否达标,并检查系数是否都为正
  3. 制作评分卡
    制作评分卡也俗称“模型转评分”
    将3中得到的逻辑回归模型,制作成评分卡表
  4. 确定评分阈值
    确定生产上判定为坏客户的分数阈值
    当分数低于该阈值时,就拒绝客户

三、变量的分箱

在构建评分卡之前,需要先对变量进行分析与分箱,并选择出有效的变量作为建模变量。

3.1.数据介绍

bbbrisk自带的小贷数据共包含10个变量与客户好坏标签,数据包含的10变量和标签如下:
数据介绍
数据共2万条,示例如下:
数据示例

3.2.变量自动分箱

变量的分箱可以使用算法进行自动分箱,常用的分箱算法有:等频分箱、等距分箱、决策树分箱、KS分箱和卡方分箱等等。
bbbrisk包提供了bins.autoBin函数来对多个变量进行自动分箱,具体代码如下:

import  bbbrisk  as br

# 加载数据                                                                     
data = br.datasets.load_bloan()                                      # 加载数据
x = data.iloc[:,:-1]                                                 # 变量数据
y = data['is_bad']                                                   # 标签数据

# 自动分箱
bin_sets  = br.bins.batch.autoBins(x, y,enum_var=['city','marital']) # 自动分箱,如果有枚举变量,必须指出哪些是枚举变量
bin_stats = br.bins.batch.bin_stats(x,y,bin_sets)                    # 统计各个变量的分箱情况
br.display.pd.set(width=300,max_colwidth=30,max_rows=30)             # 美化pandas的显示方式
for var in bin_stats:                                                # 逐个变量打印分箱结果
    print('\n变量'+var+'的分箱结果:\n',bin_stats[var])               # 打印当前变量的分箱统计结果

# 选择iv足够大的变量
select_bin_set = {}                                                  # 初始化选择的变量的分箱
for var,stat in bin_stats.items():                                   # 逐个变量循环
    if (stat['iv'].iloc[-1]>0.1):                                    # 当前变量的iv值是否满足要求
        select_bin_set[var] =  bin_sets[var]                         # 如果满足,则添加到选择池
print('\n iv > 0.1 的变量与分箱结果:\n',select_bin_set)              # 最终选择的变量的分箱

通过以上的代码,就对变量进行分箱了,它的结果如下:
rev变量分箱结果
age变量分箱结果

loan_num变量分箱结果

3.3.变量的筛选

一般来说,需要通过iv值来筛选出有效的变量。
IV全称为信息价值(Information Value),它常在评分卡中用于筛选变量。IV的原理是通过评估好、坏样本在变量分布上的差异,从而评估变量对y的信息价值。
IV值越高,变量的价值越高,一般来说,IV值与变量对好坏客户的区分度的关系如下:
IV < 0.02 :几乎没有区分度,
0.02 <= IV < 0.1 :有微弱的区分度;
0.1 <= IV < 0.3 :有明显的区分度;
0.3 <= IV :较强的区分度
通考上述的值,来筛选出有效的变量。在本例中,所有变量都是有效的。

四、构建评分卡

在完成变量分箱后,就可以直接使用bbbrisk的评分卡包来构建评分卡,以及打印相关报告
如果没有bbbrisk的包,需要先通过pip安装

pip install bbbrisk

4.1.评分卡实现代码

用bbbrisk构建评分卡的具体代码如下:

import bbbrisk as br

#加载数据                                                              
data = br.datasets.load_bloan()                                        # 加载数据
x = data.iloc[:,:-1]                                                   # 变量数据
y = data['is_bad']                                                     # 标签数据

# 构建评分卡
bin_sets  = br.bins.batch.autoBins(x, y,enum_var=['city','marital'])   # 自动分箱,必须指出哪些是枚举变量
model,card = br.model.scoreCard(x,y,bin_sets)                          # 构建评分卡
score      = card.predict(x[card.var])                                 # 用评分卡进行评分
# 打印结果
print('\n-----【 模型性能评估 】----')
print('* 模型训练AUC:',model.train_auc)                                # 打印模型训练数据集的AUC
print('* 模型测试AUC:',model.test_auc)                                 # 打印模型测试数据集的AUC
print('* 模型训练KS:',model.train_ks)                                  # 打印模型训练数据集的KS
print('* 模型测试KS:',model.test_ks)                                   # 打印模型测试数据集的KS
													                   
print('\n--------【 模型 】---------')                                 
print('* 模型使用的变量:',model.var)                                   # 模型最终使用的变量
print('* 模型权重:',model.w)                                           # 模型的变量权重
print('* 模型阈值:',model.b)                                           # 模型的阈值

													                   
print('\n--------【 评分卡 】---------')    
print('\n* 特征得分featureScore:   \n' ,card.featureScore      )       # 特征得分
print('\n* 基础得分baseScore:        ' ,card.baseScore         )       # 基础分

运行结果如下:

运行结果
可以看到,通过简单的代码,就可以得到评分卡模型的AUC/KS,以及模型的参数、评分卡表。

4.2.评分卡表

card.featureScore和card.baseScore里分别存放了特征得分与基础,两者合并后就是最终的评分卡表,如下:
评分卡表

4.3.阈值表与分数分布图

阈值表与分数分布图,可以进一步使用report.get_threshold_tb来计算阈值表,以及用report.draw_score_disb则用于绘制分数分布图。代码如下:

# 计算阈值表与分数分布图
thd_tb    = br.report.get_threshold_tb(score,y,bin_step=10)                    # 阈值表
br.report.draw_score_disb(score,y,bin_step=10,figsize=(14, 4))                 # 分数分布

评分阈值表的结果如下:
评分阈值表
样本的分数分布结果如下:
分数分布
好了,以上就是如何制作一个评分卡了。
更多可以参考:
【1】老饼讲解-评分卡
【2】bbbrisk评分卡API说明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2326451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

丝杆,同步带,链条选型(我要自学网)

这里的选型可以70%的正确率&#xff0c;正确率不高&#xff0c;但是选型速度会比较快。 1.丝杆选型 后面还有一堆计算公式&#xff0c;最终得出的结果是导程25&#xff0c;轴径25mm的丝杆。 丝杆选择长度时&#xff0c;还要注意细长比&#xff0c;长度/直径 一般为30到50。 2…

【YOLO系列】基于YOLOv8的无人机野生动物检测

基于YOLOv8的无人机野生动物检测 1.前言 在野生动物保护、生态研究和环境监测领域&#xff0c;及时、准确地检测和识别野生动物对于保护生物多样性、预防人类与野生动物的冲突以及制定科学的保护策略至关重要。传统的野生动物监测方法通常依赖于地面巡逻、固定摄像头或无线传…

一文详细讲解Python(详细版一篇学会Python基础和网络安全)

引言 在当今数字化时代&#xff0c;Python 作为一种简洁高效且功能强大的编程语言&#xff0c;广泛应用于各个领域&#xff0c;从数据科学、人工智能到网络安全等&#xff0c;都能看到 Python 的身影。而网络安全作为保障信息系统和数据安全的关键领域&#xff0c;其重要性不言…

【Java】Hibernate的一级缓存

Session是有一个缓存, 又叫Hibernate的一级缓存 session缓存是由一系列的Java集合构成的。当一个对象被加入到Session缓存中&#xff0c;这个对象的引用就加入到了java的集合中&#xff0c;以后即使应用程序中的引用变量不再引用该对象&#xff0c;只要Session缓存不被清空&…

学习笔记--(6)

import numpy as np import matplotlib.pyplot as plt from scipy.special import erfc# 设置参数 rho 0.7798 z0 4.25 # 确保使用大写 Z0&#xff0c;与定义一致def calculate_tau(z, z_prime, rho, s_values):return np.log(rho * z * z_prime * s_values / 2)# 定义 chi_…

JWT在线解密/JWT在线解码 - 加菲工具

JWT在线解密/JWT在线解码 首先进入加菲工具 选择 “JWT 在线解密/解码” https://www.orcc.top 或者直接进入JWT 在线解密/解码 https://www.orcc.top/tools/jwt 进入功能页面 使用 输入对应的jwt内容&#xff0c;点击解码按钮即可

飞桨PP系列新成员PP-DocLayout开源,版面检测加速大模型数据构建,超百页文档图像一秒搞定

背景介绍 文档版面区域检测技术通过精准识别并定位文档中的标题、文本块、表格等元素及其空间布局关系&#xff0c;为后续文本分析构建结构化上下文&#xff0c;是文档图像智能处理流程的核心前置环节。随着大语言模型、文档多模态及RAG&#xff08;检索增强生成&#xff09;等…

飞速(FS)HPC无损组网:驱动AI高性能计算网络转型升级

案例亮点 部署低功耗、高密度飞速&#xff08;FS&#xff09;以太网交换机&#xff0c;紧凑机身设计节省70%机房空间&#xff0c;冗余电源和智能风扇确保系统高可用性&#xff0c;有效优化散热和降低能耗。 支持25G/40G/100G多速率自适应交换架构&#xff0c;构建超低时延企业…

git 常用操作整理

一.git 的概念 Git 是一个分布式版本控制系统&#xff0c;用于跟踪文件的更改历史&#xff0c;帮助开发者管理代码的版本。以下是关于 Git 的一些基本概念&#xff1a; 1. 仓库&#xff08;Repository&#xff09; - **本地仓库**&#xff1a;在你的计算机上存储的项目文件及…

JAVA数据库增删改查

格式 Main.java(测试类) package com.example;import com.example.dao.UserDao; import com.example.model.User;public class Main {public static void main(String[] args) {UserDao userDao new UserDao();// 测试添加用户System.out.println(" 添加用户 ");Us…

上海某海外视频平台Android高级工程师视频一面

问的问题比较细&#xff0c;有很多小细节在里面&#xff0c;平时真不一定会注意到&#xff0c;做一个备忘&#xff1a; 1.Object类里面有哪些方法&#xff1f; Object 类是 Java 中所有类的根类&#xff0c;它定义了一些基本方法&#xff0c;供所有类继承和重写1. 常用方法 1…

前后端数据序列化:从数组到字符串的旅程(附优化指南)

&#x1f310; 前后端数据序列化&#xff1a;从数组到字符串的旅程&#xff08;附优化指南&#xff09; &#x1f4dc; 背景&#xff1a;为何需要序列化&#xff1f; 在前后端分离架构中&#xff0c;复杂数据类型&#xff08;如数组、对象&#xff09;的传输常需序列化为字符…

idea报错:程序包不存在

这里的程序包是我们项目里自己写的&#xff0c;idea却报错不存在。 解决方法: 参考这位大佬的方法&#xff0c;OK。

spring boot 整合redis

1.在pom文件中添加spring-boot-starter-data-redis依赖启动器 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2.编写三个实体类 RedisHash("p…

进程间信号

进程间信号 信号的认识信号的产生进程对信号的处理机制普通信号的处理机制实时信号的处理机制 信号集操作函数信号的捕捉 信号的认识 信号的概念&#xff1a;  信号是一种软件中断&#xff0c;它用于通知进程一个异步事件的发生。  这些事件可能来自系统内部&#xff08;如硬…

2011-2019年各省地方财政国债还本付息支出数据

2011-2019年各省地方财政国债还本付息支出数据 1、时间&#xff1a;2007-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、地方财政粮油物资储备管理等事务 4、范围&#xff1a;31省 5、指标说明&#xff1a;地方财政的国债…

2025华为软件精英挑战赛2600w思路分享

这里写自定义目录标题 得分展示对象定义请求价值计算时间同步删除操作完整思路 得分展示 对象定义 // 将一个磁盘划分为多个基于标签聚合的区块 class Block{ public:int tag 0; // 区块标签int start_pos;int end_pos;int id;int use_size 0;int v;// 为区块确定范围Bloc…

WEB安全-CTF中的PHP反序列化漏洞

什么是序列化&#xff1f; 简单来说序列化是将数组或对象转换成字符串的过程&#xff0c;这样的好处是利于对象存储与传输&#xff0c;在PHP中&#xff0c;序列化函数是serialize()&#xff0c;反序列化是unserialize() 无类序列化 无类序列化顾名思义就是不包含class的序列…

【论文阅读】Co2l: Contrastive continual learning

原文链接&#xff1a;[2106.14413] Co$^2$L: Contrastive Continual Learning 阅读本文前&#xff0c;需要对持续学习的基本概念以及面临的问题有大致了解&#xff0c;可参考综述&#xff1a; Wang L, Zhang X, Su H, et al. A comprehensive survey of continual learning: …

OpenMCU(五):STM32F103时钟树初始化分析

概述 本文主要描述了STM32F103初始化过程系统时钟的初始化,主要描述了系统时钟的初始化&#xff0c;AHB总线时钟&#xff0c;APB总线时钟等的初始化。 硬件板卡3d图 时钟树 STM32F103的时钟树&#xff0c;如下所示: 时钟源选择 从STM32F103的时钟树框图&#xff0c;我们可以…