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

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

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

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

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

本文目录
  1. 安装toad库

  2. ScoreCard函数定义

  3. 评分卡实现

    3.1 导入库并加载数据

    3.2 变量分箱

    3.3 调整变量分箱

    3.4 变量转woe

    3.5 转评分卡


一、安装toad库

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

打开cmd,安装语句如下:

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


二、ScoreCard函数定义

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

其基本调用语法如下:

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,可以输出每个特征的得分情况。


三、评分卡实现

  导入库并加载数据

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

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

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

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

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:读取数据。

得到结果:


  变量分箱

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

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

得到结果:

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


  调整变量分箱

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

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')
得到结果:

  变量转woe

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

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函数转评分卡,代码如下:

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()           # 输出标准评分卡

得到结果:

{'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函数转评分卡已讲解完毕,如想了解更多建模内容,可以翻看公众号中“风控建模”模块相关文章。

往期回顾:

一文囊括Python中的函数,持续更新。。。

一文囊括Python中的有趣案例,持续更新。。。

一文囊括Python中的数据分析与绘图,持续更新。。。

一文囊括风控模型搭建(原理+Python实现),持续更新。。。



限时免费加群

19967879837

添加微信号、手机号

请使用浏览器的分享功能分享到微信等