逻辑回归已经在各大银行和公司都实际运用于业务。
之前的文章已经阐述了逻辑回归和sigmod函数的由来、逻辑回归(logistics regression)原理-让你彻底读懂逻辑回归、评分卡原理及Python实现。
本文着重阐述应用toad库中的ScoreCard函数快速实现评分卡。
建议在建模前把原理和实现逻辑弄清楚,避免出现错误。
一、安装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,可以输出每个特征的得分情况。
1 导入库并加载数据
背景:现需分析客户的多头、关联风险、三方评分等信息,用于构建客户的贷前评分卡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:读取数据。
得到结果:
2 变量分箱
接着用toad库中的Combiner函数对变量进行分箱,具体代码如下:
import toad
c = toad.transform.Combiner()
c.fit(train_f, y = 'target', method = 'chi', min_samples = 0.05)
#使用特征筛选后的数据进行训练,使用稳定的卡方分箱,规定每箱至少有5%数据,空值我已经转换成-999999
c.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,代码如下:
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函数转评分卡已讲解完毕