前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【评分卡实现】应用Python中的toad.ScoreCard函数实现评分卡

【评分卡实现】应用Python中的toad.ScoreCard函数实现评分卡

作者头像
阿黎逸阳
发布2023-10-08 16:24:37
2K0
发布2023-10-08 16:24:37
举报
文章被收录于专栏:阿黎逸阳的代码

逻辑回归已经在各大银行和公司都实际运用于业务。

之前的文章已经阐述了逻辑回归和sigmod函数的由来逻辑回归(logistics regression)原理-让你彻底读懂逻辑回归评分卡原理及Python实现

本文着重阐述应用toad库中的ScoreCard函数快速实现评分卡。

建议在建模前把原理和实现逻辑弄清楚,避免出现错误。

一、安装toad库

ScoreCard是toad库下的函数,调用需先要安装toad库。

打开cmd,安装语句如下:

代码语言:javascript
复制
pip install toad

若安装成功,会显示结果如下:

二、ScoreCard函数定义

ScoreCard函数的功能是实现评分卡转换。

其基本调用语法如下:

代码语言:javascript
复制
import toad

ScoreCard(pdo=60, rate=2, base_odds=35, base_score=750, card=None, combiner={}, transer=None, **kwargs)

pdo:每个分数段的分数差,默认为60。

rate:WOE转换的分箱数量,默认为2。

base_odds:基准坏好比,默认为35。

base_score:基准分,默认为750。

card:自定义分箱结果,如果不提供,则会使用WOE转换进行自动分箱。

combiner:用于组合各个特征的得分,默认为空字典。

transer:用于转换原始特征到得分,默认为None。

**kwargs:其他可选参数,例如min_samples,用于控制分箱的最小样本数。

在调用toad.ScoreCard对象的fit方法时,需要传入训练数据X和对应的标签Y。

调用export方法并设置to_frame=True,可以输出每个特征的得分情况。

三、评分卡实现

1   导入库并加载数据

背景:现需分析客户的多头、关联风险、三方评分等信息,用于构建客户的贷前评分卡A卡。

在进行评分卡搭建之前需要对客户的信息进行筛选,挑选出和客户逾期信息相关性高的变量。

本文用到的数据是经过变量挑选后的数据。

首先读取数据,具体代码如下:

代码语言:javascript
复制
import os 
import pandas as pd 

os.chdir(r'E:\date') 
train_f = pd.read_csv('train_date_f.csv', encoding='gbk')
test_f  = pd.read_csv('test_date_f.csv', encoding='gbk')
train_f = train_f.drop(columns='Unnamed: 0')
test_f = test_f.drop(columns='Unnamed: 0')
train_f.head(10)

os.chdir:设置数据存放的文件路径。

pd.read_csv:读取数据。

得到结果:

2 变量分箱

接着用toad库中的Combiner函数对变量进行分箱,具体代码如下:

代码语言:javascript
复制
import toad 

c = toad.transform.Combiner()
c.fit(train_f, y = 'target', method = 'chi', min_samples = 0.05)
#使用特征筛选后的数据进行训练,使用稳定的卡方分箱,规定每箱至少有5%数据,空值我已经转换成-999999
c.export()

得到结果:

可以得到每个变量分箱对应的分割点列表。

3 调整变量分箱

有些变量的分箱不符合业务逻辑或者有其它的分割点,可根据经验进行重新分箱,代码如下:

代码语言:javascript
复制
from toad.plot import bin_plot 

#调整分箱
col = 'txy_score'
rule = {col:[0, 50, 55,  65, 74, 80]}
c.update(rule)
bin_plot(c.transform(train_f[[col, 'target']], labels=True), x=col, target='target')

得到结果:

4 变量转woe

接着把变量转成对应的woe,代码如下:

代码语言:javascript
复制
transer = toad.transform.WOETransformer()            # 初始化
train_woe = transer.fit_transform(c.transform(train_f), train_f['target'], exclude=['target'])   #转化训练数据,并去掉target列
test_woe = transer.transform(c.transform(test_f))    # 转化测试数据
train_woe.head(10)

最后应用ScoreCard函数转评分卡,代码如下:

代码语言:javascript
复制
columns = list(train_woe.columns)
card = toad.ScoreCard(
    combiner = c,
    transer = transer,
    #class_weight = 'balanced',
    #C=0.1,
    #base_score = 600,
    #base_odds = 35 ,
    #pdo = 60,
    #rate = 2
)
card.fit(train_woe[columns[:-1]] ,train_woe['target'])  # 训练评分
card.predict(train_woe) # 直接使用原始数据进行评分
card.export()           # 输出标准评分卡

得到结果:

代码语言:javascript
复制

{'r360_score': {'[-inf ~ 490)': 39.51, '[490 ~ inf)': 57.93},
 'br_d15_id_bank_region_allnum': {'[-inf ~ -0.524)': 45.32,
  '[-0.524 ~ -0.402)': 46.65,
  '[-0.402 ~ 0.737)': 47.72,
  '[0.737 ~ inf)': 51.22},
 'br_m1_id_nbank_else_rel_orgnum': {'[-inf ~ -0.314)': 59.34,
  '[-0.314 ~ -0.297)': 42.43,
  '[-0.297 ~ 1.924)': 57.81,
  '[1.924 ~ 2.4930000000000003)': 37.37,
  '[2.4930000000000003 ~ 3.148)': 29.16,
  '[3.148 ~ inf)': 16.17},
 'br_m3_id_nbank_else_cons_allnum': {'[-inf ~ 0.895)': 65.01,
  '[0.895 ~ 2.454)': 57.22,
  '[2.454 ~ 3.657)': 51.37,
  '[3.657 ~ 5.897)': 43.43,
  '[5.897 ~ 8.354)': 34.84,
  '[8.354 ~ inf)': 24.89},
 'br_m3_id_nbank_weekend_orgnum': {'[-inf ~ 2.307)': 57.48,
  '[2.307 ~ 3.38)': 52.39,
  '[3.38 ~ 5.757000000000001)': 48.54,
  '[5.757000000000001 ~ 7.217)': 43.93,
  '[7.217 ~ 9.142)': 40.48,
  '[9.142 ~ inf)': 32.86},
 'br_m6_id_nbank_sloan_allnum': {'[-inf ~ -0.512)': 74.65,
  '[-0.512 ~ 1.09)': 59.31,
  '[1.09 ~ 1.906)': 53.05,
  '[1.906 ~ 2.709)': 50.41,
  '[2.709 ~ 4.333)': 41.43,
  '[4.333 ~ 6.636)': 34.65,
  '[6.636 ~ inf)': 20.67},
 'br_scoreylbase-V1_0': {'[-inf ~ 593)': 42.73,
  '[593 ~ 643)': 46.1,
  '[643 ~ inf)': 50.93},
 'DXM_score': {'[-inf ~ 388)': 30.86,
  '[388 ~ 417)': 40.99,
  '[417 ~ 437)': 48.36,
  '[437 ~ inf)': 66.66},
 'jd_score': {'[-inf ~ 683.0)': 37.46,
  '[683.0 ~ 695.0)': 44.28,
  '[695.0 ~ 702.0)': 46.94,
  '[702.0 ~ 730.0)': 49.84,
  '[730.0 ~ inf)': 58.27},
 'score': {'[-inf ~ 0.1014787919177038)': 100.25,
  '[0.1014787919177038 ~ 0.1256704335224775)': 73.0,
  '[0.1256704335224775 ~ 0.1642140287230228)': 54.73,
  '[0.1642140287230228 ~ 0.2209920799957538)': 28.86,
  '[0.2209920799957538 ~ inf)': -9.22},
 'zj_score': {'[-inf ~ 0.0571)': 94.1,
  '[0.0571 ~ 0.0953)': 68.38,
  '[0.0953 ~ 0.1571)': 42.84,
  '[0.1571 ~ inf)': 5.35},
 'txy_score': {'[-inf ~ 0)': -0.46,
  '[0 ~ 50)': 70.91,
  '[50 ~ 55)': 54.78,
  '[55 ~ 65)': 47.97,
  '[65 ~ 74)': 35.85,
  '[74 ~ 80)': 24.03,
  '[80 ~ inf)': 20.0}}

可以发现每个变量不同值段都给了对应分数,即得到了评分卡。

至此,Python中应用ScoreCard函数转评分卡已讲解完毕

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿黎逸阳的代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 三、评分卡实现
  • 3 调整变量分箱
  • 4 变量转woe
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档