一篇入门之-小贷评分卡小白到入门-长文(含原理讲解、代码实现等)

评分卡是小贷风控中一种基于逻辑回归的的模型,它以卡表的形式对用户质量进行评分。评分卡一般分为A卡(申请评分卡)、B卡(行为评分卡)、C卡(催收评分卡)、F卡(欺诈评级评分卡)。本文讲解评分卡的原理,以及如何使用python实现一个评分卡。

一、什么是评分卡

1.1.什么是评分卡

评分卡,一般是指用于小贷客户质量评分的评分卡表。评分卡利用历史客户数据,分析出有效的特征(变量),并对变量对行分组(离散化),然后使用逻辑回归模型确定每个变量的权重和基础阈值。最后根据阈值、权重,确定基础分数和每个每个各个分组的分数。评分卡样式如下:
评分卡示例
在来了新用户后,根据以上卡表,算出用户最终的评分。

1.2. 评分卡的种类

针对评分的使用不同场景,评分卡一般分为A、B、C、F卡。
A卡(Applicationscorecard,申请评分卡)使用申请时的数据建立评分卡,一般用于审批放款。
B卡(Behaviorscorecard,行为评分卡)加入贷后还款等行为数据,一般用于借贷中的客户的授信等等。
C卡(Collectionscorecard,催收评分卡)使用贷后还款行为数据,一般用于逾期用户的催收。
F卡(Fraudscorecard,欺诈评级评分卡)作用于申请阶段,针对欺诈客户的判断。
使用得最多的是A卡,它是业务的最前端,也是借贷业务的关键。

二、评分卡-原理介绍

2.1. 评分卡原理介绍

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

上述流程仅供参考,它涉及的细节有许多,这里我们不展开讲述,因为我们借助评分卡包来实现并不需要过分的涉及每一个细节。
相关细节可参考《老饼讲解-评分卡教程

三、评分卡-实例讲解

这里我们使用bbbrisk评分卡包来实现评分卡,如果python里没有bbbrisk包,可以通过pip来安装。

pip install bbbrisk

3.1. 评分卡-数据介绍

bbbrisk包的bloan小贷数据共包含10个变量与客户好坏标签,数据包含的10变量和标签如下:
bloan数据介绍
数据共2万条,示例如下:
bloan数据示例
评分卡模型的目标是,依据客户特征数据(10个变量),判断客户是否坏客户(is_bad).,根据客户的特征数据,对客户进行评分,客户质量越好,评分越高。
评分卡最终需要输出两样最基本的东西:
1.评分卡表
2.评分阈值
评分表用于计算客户的评分,而评分阈值则用来判断客户是否能通过,例如,评分阈值为650,那么评分为649的用户就会被拒绝。

3.2. 评分卡-变量分箱

在构建评分卡之前,需要先对变量进行分析与分箱,并选择出有效的变量作为建模变量,如果只是粗糙地看一下评分卡的效果,变量的分箱可以使用算法进行自动分箱。但在实际中往往会手动分箱,效果会更加可控。
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变量分箱结果
一般来说,会将iv值太小的变量筛选掉,参见代码里的逻辑。

3.3. 评分卡-建模

在完成变量分箱后,就可以直接使用bbb的评分卡包来构建评分卡,以及打印相关报告,具体代码如下:

import bbbrisk as br

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

# 变量的分箱
bin_sets = {
    'rev'     :[[0,0.1],(['-',0],[0.1,0.37]),[0.37,0.64],([0.64,1.2],[2,'+']),[1.2,2],]
    ,'age'    :[[80,'+'],[60,80],[45,60],['-',45]]
    ,'city'   :[('J','E','I'),'_other',('D','N','S'),('F','P')]
    ,'income' :[[1000,5000],[5000,9000],(['-',1000],[20000,'+'],None),[9000,16000],[16000,20000]]
    ,'marital':[1,0,2]
    ,'debrate':[([0,0.1],[850,'+']),([0.1,0.5],[5,850]),([0.5,0.8],0),[0.8,5]]
    ,'due30'  :[0,1,2,(3,4),[4,'+']]
    ,'due60'  :[0,1,2,[2,'+']]
    ,'due90'  :[0,1,[1,'+']]
    ,'loan_num':[[3,'+'],(2,3),1,0]
    }

# 构建评分卡
model,card = br.model.scoreCard(x,y,bin_sets,train_param={'random_state':0})   # 构建评分卡,为了使结果能重现,笔者设置了固定的随机种子 
score      = card.predict(x[card.var])                                         # 用评分卡进行评分
card.featureScore                                                              # 评分卡-特征得分表
card.baseScore                                                                 # 评分卡-基础分

# 打印结果
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)                                                   # 模型的阈值


# 计算阈值表与分数分布图
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))                 # 分数分布

代码运行结果如下:
评分卡结果
在评分卡建模时,会先用逐步回归筛选变量,减少最终模型使用的变量个数, 如图所示,当添加marital变量时,AUC提升不明显,因此不再添加变量,最终只选择5个变量。
card.featureScore和card.baseScore里分别存放了特征得分与基础分,两者合并后就是最终的评分卡表,如下:
评分卡
代码中的report.get_threshold_tb用于计算阈值表,report.draw_score_disb则用于绘制分数分布图, 阈值表计算结果如下:
阈值表
根据阈值表,就可以选择一个合适的阈值,用于判断样本是否能通过,具体方法见《阈值表与评分阈值》,所有样本的分数分布图如下:
分数分布图
这里的横轴代表的是分数起始值,例如610代表[610,620)之间的样本个数,其中绿色是好样本、红色是坏样本。

四、结束语

评分卡的内容比较多,更多的细节可以参考如下教程:
《评分卡-入门教程》
《评分卡-分箱教程》
《bbrisk-API说明》

### 关于ESP8266的全面学习资料 #### ESP8266简介与功能详解 ESP8266是一款专为物联网(IoT)设计的Wi-Fi模块,具备强大的网络连接能力。此款微控制器不仅支持TCP/IP协议栈还提供了一系列用于处理字符串的API接口以及最佳实践指导[^1]。 对于基于ESP8266的应用开发而言,理解其内置函数库至关重要。这些库涵盖了从基本的数据类型定义到复杂的网络编程等多个方面: - **字符串操作**:包括创建、复制、拼接等常见任务; - **内存管理**:动态分配和释放堆空间的方法; - **串口通讯**:通过UART与其他设备交换数据的技术细节; - **网络安全特性**:确保传输过程中的信息安全措施; - **性能调优技巧**:提高应用程序运行效率的方式; - **错误恢复机制**:当遇到意外情况时如何优雅地应对并恢复正常服务; 以上各项内容均能在官方文档中找到详尽描述,并配有实际案例供参考学习。 #### 示例代码展示 为了更好地掌握上述知识点,在这里给出一段简单的Python风格伪代码来说明怎样利用ESP8266发送HTTP请求获取网页内容: ```python import urequests as requests # 导入轻量级http客户端库 def fetch_webpage(url): try: response = requests.get(url) # 发送GET请求至指定URL if response.status_code == 200: # 如果状态码表示成功,则打印页面主体部分 print(response.text) response.close() # 记得关闭连接以节省资源 except Exception as e: print(f"Error occurred while fetching webpage: {e}") ``` 这段代码展示了如何使用`urequests`这个专门为MicroPython环境定制的小型化版本requests库来进行标准HTTP GET请求的操作流程。它能够有效地简化原本较为繁琐的过程,让开发者可以更专注于业务逻辑本身而不是底层实现。 另外,还有更多实用的例子可以在开源项目【ESP8266-Demos】里发现,该项目包了多个不同场景下的具体实施方案,非常适合用来加深理解和练习技能[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老饼讲解-BP神经网络

请老饼喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值