评分卡建模工具scorecardpy全解读

2023-11-06

说到评分卡建模工具,做过评分卡的应该都能想到谢博士的scorecardpy和专为工业界模型开发设计的Python工具包--Toad,两者相比,scorecardpy更加轻量级,且依赖较少,可以满足大多数场景下的评分卡构建。

为了使评分卡建模流程更加便捷,该Python包针对建模中各个关键步骤都提供了现成的函数,如下:

  • 数据集划分 (split_df)

  • 变量筛选(iv, var_filter)

  • 变量分箱(woebin, woebin_plot, woebin_adj, woebin_ply)

  • 分数转换(scorecard, scorecard_ply)

  • 效果评估(perf_eva, perf_psi)

基于github主页上提供的案例,对每一步操作进行详细解读:

 

数据准备

 
 

import scorecardpy as sc # 加载德国信用卡相关数据集 dat = sc.germancredit()

得到的数据集情况如下:

 

变量筛选

然后根据变量的缺失率、IV值、同值性等因素,对20个变量进行筛选,并对目标变量进行标记,该数据集中creditability为目标变量:

 
 

dt_s = sc.var_filter(dat, y="creditability")

通过 var_filter() 函数筛选后,数据集保留以下13个变量:

默认的参数配置为:iv_limit=0.02, missing_limit=0.95, identical_limit=0.95,即当某个变量的 IV 值小于0.02,或缺失率大于95%,或同值率(除空值外)大于95%,则剔除掉该变量。

此外,该方法还内置了除上述以外的其他参数:

 
 

def var_filter(dt, y, x=None, iv_limit=0.02, missing_limit=0.95, identical_limit=0.95, var_rm=None, var_kp=None, return_rm_reason=False, positive='bad|1')

其中各参数含义如下:

  • varrm可设置强制保留的变量,默认为空;

  • varkp可设置强制剔除的变量,默认为空;

  • return_rm_reason可设置是否返回剔除原因,默认为不返回(False);

  • positive可设置坏样本对应的值,默认为“bad|1”。

 

数据集划分

将数据集划分成训练集和测试集:

 
 

train, test = sc.split_df(dt_s, 'creditability').values()

split_df()函数包括以下参数:

 
 

def split_df(dt, y=None, ratio=0.7, seed=186)

默认的切分比例为7:3,也可自行修改参数ratio设置不同的切分比例。

 

变量分箱

可通过woebin()函数对全部变量进行自动分箱,并基于woe_bin的结果,使用woebin_plot对各变量分箱的count distribution和bad probability进行可视化,可观察是否存在单调性:

 
 

bins = sc.woebin(dt_s, y="creditability") sc.woebin_plot(bins)

bins为字典形式,以变量名作为key,可获得单个变量的分箱结果详情:

woebin_plot()得到的可视化结果如下:

woebin()函数包括如下参数:

 
 

def woebin(dt, y, x=None, var_skip=None, breaks_list=None, special_values=None, stop_limit=0.1, count_distr_limit=0.05, bin_num_limit=8, # min_perc_fine_bin=0.02, min_perc_coarse_bin=0.05, max_num_bin=8, positive="bad|1", no_cores=None, print_step=0, method="tree", ignore_const_cols=True, ignore_datetime_cols=True, check_cate_num=True, replace_blank=True, save_breaks_list=None, **kwargs)

woebin()可针对数值型和类别型变量生成最优分箱结果,方法可选择决策树分箱、卡方分箱或自定义分箱。其他各参数的含义如下:

  • var_skip: 设置需要跳过分箱操作的变量;

  • breaks_list: 切分点列表,默认为空。如果非空,则按设置的切分点进行分箱处理。

  • special_values: 设置需要单独分箱的值,默认为空。

  • count_distr_limit: 设置分箱占比的最小值,一般可接受范围为0.01-0.2,默认值为0.05;

  • stop_limit: 当IV值的增长率小于所设置的stop_limit,或卡方值小于qchisq(1-stoplimit, 1)时,停止分箱。一般可接受范围为0-0.5,默认值为0.1;

  • bin_num_limit: 该参数为整数,代表最大分箱数。

  • positive: 指定样本中正样本对应的标签,默认为"bad|1";

  • no_cores: 设置用于并行计算的 CPU 数目;

  • print_step: 该参数为非负数,默认值为1。若print_step>0,每次迭代会输出变量名。若iteration=0或no_cores>1,不会输出任何信息;

  • method: 设置分箱方法,可设置"tree"(决策树)或"chimerge"(卡方),默认值为"tree";

  • ignore_const_cols: 是否忽略常数列,默认值为True,即忽略常数列;

  • ignore_datetime_cols: 是否忽略日期列,默认值为True,即忽略日期列;

  • check_cate_num: 检查类别变量中枚举值数目是否大于50,默认值为True,即自动进行检查。若枚举值过多,会影响分箱过程的速度;

  • replace_blank: 设置是否将空值填为None,默认为True。

若对自动分箱结果不满意,还可手动自定义分箱:

 
 

breaks_adj = { 'age.in.years': [26, 35, 40], 'other.debtors.or.guarantors': ["none", "co-applicant%,%guarantor"] } bins_adj = sc.woebin(dt_s, y="creditability", breaks_list=breaks_adj)

于是年龄变量的分箱结果变成:

分箱完成后,使用woebin_ply()函数对变量进行woe变换,之后需要把所得到的woe值作为模型的输入:

 
 

train_woe = sc.woebin_ply(train, bins_adj) test_woe = sc.woebin_ply(test, bins_adj)

 

模型训练

 
 

y_train = train_woe.loc[:,'creditability'] X_train = train_woe.loc[:,train_woe.columns != 'creditability'] y_test = test_woe.loc[:,'creditability'] X_test = test_woe.loc[:,train_woe.columns != 'creditability'] # 逻辑回归 ------ from sklearn.linear_model import LogisticRegression lr = LogisticRegression(penalty='l1', C=0.9, solver='saga', n_jobs=-1) lr.fit(X_train, y_train) lr.coef_ lr.intercept_ # 预测 train_pred = lr.predict_proba(X_train)[:,1] test_pred = lr.predict_proba(X_test)[:,1]

 

效果评估

可使用perf_eva()函数对模型效果进行计算及可视化,基于预测的概率值和label值,提供KS(kolmogorov-smirnow), ROC, lift以及precision-recall四种评估指标:

 
 

train_perf = sc.perf_eva(y_train, train_pred, title = "train") test_perf = sc.perf_eva(y_test, test_pred, title = "test")

该函数还包括以下参数:

 
 

def perf_eva(label, pred, title=None, groupnum=None, plot_type=["ks", "roc"], show_plot=True, positive="bad|1", seed=186)

参数plot_type可设置为:"ks", "lift", "roc", "pr",默认为["ks", "roc"]。

 

分数转换

然后基于’woebin'的结果和sklearn.linear_model的LogisticRegression,创建scorecard()函数,用于构建评分卡,只需一行代码:

 
 

card = sc.scorecard(bins_adj, lr, X_train.columns)

生成的结果为各变量名及其分箱、对应得分组成的字典,例如:

scorecard()包括以下参数:

 
 

def scorecard(bins, model, xcolumns, points0=600, odds0=1/19, pdo=50, basepoints_eq0=False, digits=0)

各参数含义如下:

  • bins:由`woebin`得到的分箱信息;

  • model:LogisticRegression模型对象;

  • points0:基准分数,默认值为600;

  • odds0: 基准 Odds(好坏比),与真实违约概率对应,可换算得到违约概率,Odds = p/(1-p)。默认值为 1/19;

  • pdo: Points toDouble theOdds,即Odds变成2倍时,所增加的信用分。默认值为50。

然后基于`scorecard`的结果,用scorecard_ply()函数计算train和test数据集的信用分数:

 
 

train_score = sc.scorecard_ply(train, card, print_step=0) test_score = sc.scorecard_ply(test, card, print_step=0)

直接生成各样本的评分:

最后用perf_psi()得到该评分卡在测试数据集上的表现:

 
 

sc.perf_psi( score = {'train':train_score, 'test':test_score}, label = {'train':y_train, 'test':y_test} )

perf_psi()可计算群体稳定性指标(PSI),并提供信用分数的分布图:

 

参考资料

scorecardpy github主页:https://github.com/ShichenXie/scorecardpy


⬇️ 扫描下方二维码关注公众号【小数据研究院】 ⬇️

回复【算法】,获取最全面的机器学习算法网络图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

评分卡建模工具scorecardpy全解读 的相关文章

  • Lighttpd 和 cgi python

    我正在尝试通过 lighttpd 执行一些 python 脚本 但是当我尝试运行它时 我只得到一个要求我下载的空白文件 lighttpd conf server modules mod access mod alias mod access
  • 使用 python requests 模块时出现 HTTP 503 错误

    我正在尝试发出 HTTP 请求 但当前可以从 Firefox 浏览器访问的网站响应 503 错误 代码本身非常简单 在网上搜索一番后我添加了user Agent请求参数 但也没有帮助 有人能解释一下如何消除这个 503 错误吗 顺便说一句
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • Pandas Merge (pd.merge) 如何设置索引和连接

    我有两个 pandas 数据框 dfLeft 和 dfRight 以日期作为索引 dfLeft cusip factorL date 2012 01 03 XXXX 4 5 2012 01 03 YYYY 6 2 2012 01 04 XX
  • 从Python中的字典列表中查找特定值

    我的字典列表中有以下数据 data I versicolor 0 Sepal Length 7 9 I setosa 0 I virginica 1 I versicolor 0 I setosa 1 I virginica 0 Sepal
  • 如何在不丢失注释和格式的情况下更新 YAML 文件 / Python 中的 YAML 自动重构

    我想在 Python 中更新 YAML 文件值 而不丢失 Python 中的格式和注释 例如我想改造 YAML 文件 value 456 nice value to value 6 nice value 界面类似于 y yaml load
  • 如何通过 TLS 1.2 运行 django runserver

    我正在本地 Mac OS X 机器上测试 Stripe 订单 我正在实现这段代码 stripe api key settings STRIPE SECRET order stripe Order create currency usd em
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • 如何使用 pybrain 黑盒优化训练神经网络来处理监督数据集?

    我玩了一下 pybrain 了解如何生成具有自定义架构的神经网络 并使用反向传播算法将它们训练为监督数据集 然而 我对优化算法以及任务 学习代理和环境的概念感到困惑 例如 我将如何实现一个神经网络 例如 1 以使用 pybrain 遗传算法
  • Numpy - 根据表示一维的坐标向量的条件替换数组中的值

    我有一个data多维数组 最后一个是距离 另一方面 我有距离向量r 例如 Data np ones 20 30 100 r np linspace 10 50 100 最后 我还有一个临界距离值列表 称为r0 使得 r0 shape Dat
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • python import inside函数隐藏现有变量

    我在我正在处理的多子模块项目中遇到了一个奇怪的 UnboundLocalError 分配之前引用的局部变量 问题 并将其精简为这个片段 使用标准库中的日志记录模块 import logging def foo logging info fo
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk
  • Kivy - 单击按钮时编辑标签

    我希望 Button1 在单击时编辑标签 etykietka 但我不知道如何操作 你有什么想法吗 class Zastepstwa App def build self lista WebOps getList layout BoxLayo

随机推荐

  • FAT16 FAT32 文件系统

    FAT 英文为File Allocation Table 文档分配表 先要记住几个概念 扇区 一般扇区为512个字节 簇 由若干个扇区组成 而FAT文件系统 其他文件系统应该相似 就是专门管理这些簇的 一个文件可能占据一个或者多个簇 按正确
  • 计算机图形学【GAMES-101】3、着色计算(深度缓存、着色模型、着色频率)

    快速跳转 1 矩阵变换原理Transform 旋转 位移 缩放 正交投影 透视投影 2 光栅化 反走样 傅里叶变换 卷积 3 着色计算 深度缓存 着色模型 着色频率 4 纹理映射 重心坐标插值 透视投影矫正 双线性插值MipMap 环境光遮
  • 一篇文章搞懂最容易入的坑之一:java语言中equals和==的区别,同时也搞清栈和堆,基本数据类型和引用数据类型等基本概念的区别

    经常我们在比较字符串是否相等时 会使用 或equals方法 但往往却得不到自己想要的结果 纠其原因 是需要搞清这两者比较到底是什么 要搞清这个问题 首先我们要理解一个问题 就是我们的对象是如何在内存空间中存放的 栈内存和堆内存 在JVM中
  • 模式分类与“组件协作模式”

    1 GOF 23 模式分类 从目的来看 创建型 Creational 模式 将对象的部分创建工作延迟到子类或者其他对象 从而应对需求变化为对象创建时具体类型实现引来的冲击 结构型 Structural 模式 通过类继承或者对象组合获得更灵活
  • java——内部类和异常处理

    文章目录 内部类 成员内部类 局部内部类 匿名内部类 静态内部类 异常处理 异常捕获与处理 多重异常捕获和处理 抛出异常 内部类 Java内部类 Inner Class 是嵌套在其他类中的类 它可以访问外部类的成员变量和方法 同时也可以被外
  • Java 将两个有序数组合成为一个有序数组

    基本思路 1 如果其中一个数组的元素均大于另一个数组的元素 则可以直接组合 不用拆分 即 其中一个数组的第一个元素大于或者小于另一个数组的最后一个元素 2 若不满足1中的情况 则表明数组需要拆分 拆分的方法如下 1 拆分前 默认两个数组以及
  • matlab内置随机数生成器及随机模拟举例

    一 matlab内置的密度函数于随机数生成器 离散均匀分布 离散均匀分布用于描述等概率发生事件的状况 仅限于有限的事件数 matlab提供 1 2 N 上的均匀分布的概率密度函数黑累计分布函数 其相应的命令为 unidpdf X N 给出X
  • Waiting for table metadata lock究极解决办法(绝对管用)

    简单描述一下遇到的问题 根据项目数据入库要求 在之前没有设置唯一约束的表上添加唯一约束 这就涉及到需要修改表结构 在对其他表进行修改的时候 无论是修改字段长度还是删除索引添加唯一约束都没有问题 但是唯独有一张表 无论进行什么表操作全部都会出
  • 响应式函数编程

    http blog csdn net lzyzsd article details 41833541 comments
  • 如何判断dpr的倍数

    1 js中有window devicePixelRatio可直接查看倍率 2 用css技术判断dpr的倍数 响应式设计 媒介查询 通过设置断点来实现响应 max device pixel ratio 最大设备dpr max resoluti
  • react的ref三种使用方式,获取元素内容

    react的ref三种使用方式 获取元素内容 注意 应尽可能少的使用ref 优先使用state 1 字符串 refGetData1 gt alert 获取到的内容 this refs div1 innerText div 点我是ref字符串
  • 运放的虚短与虚断

    虚断 理想情况下 运放的同向反向输入端等效电阻无穷大 而实际情况下 输入电阻Ri也达到兆欧 M 级别 例如OP07 7 31M 因此 输入端电流很小 微安级别 uA 可以将同相输入端与反相输入端的电流近似为0 输入阻抗无穷大 电流近似为零
  • QT 使用qcustomplot 图库 总结

    qcutomplot是一个写好的图标库 下面讲几点注意事项 使用步骤一 导入qcustomplot h cpp文件后 要在 pro 文件中加入 QT printsupport 使用步骤二 添加一个widget 打开ui 在widget右键点
  • java 延迟执行代码(定时作用)

    延时执行 间隔某段时间之后 再去执行某段代码 实现这种结果有两种方式 1 使用Sleep方法 就是去新建一个线程 然后里边放一个Thread sleep 方法 这也是比较通俗的做法 new Thread public void run tr
  • 手把手教你配置CUDA, cuDNN-十分钟配置本地CUDA, cuDNN

    前文书说到 类似tensorflow和pytorch这种框架有一个很大的优点就是提供了对GPU的支持 那么 如果我们的电脑上正好有一块十分强劲的显卡 就请跟着下面的教程配置本地的CUDA cuDNN环境 这样就可以让我们使用GPU版本的te
  • NFS高可用方案:NFS+keepalived+Sersync

    1 背景 因为某系统需要部署生产 但是云平台的nas存储资源不足需要重新采购 采购周期较长 需要有一个临时的解决方案 这样时候就需要采用nfs服务来提供网络存储服务了 在部署nfs服务的时候需要考虑生产环境需要有一定的高可用性 经过考虑之后
  • el-date-picker组件设定指定时间起一个月的限制(PS:日常笔记)

  • eclipse运行项目时用内置浏览器能打开项目,但是在外置浏览器输入地址无法访问

    解决方案 window gt perferences gt General gt Web Browser gt use external web browser
  • 【管理篇 / 配置】❀ 02. 常用设置 ❀ FortiGate 防火墙

    简介 这个实验提供FortiGate飞塔防火墙命令及图形管理入门 此外 这个实验将指导你怎样正确的备份和恢复一个配置文件 建立一个新的管理员帐号和改变管理员访问权限 工作在命令行界面 你可以使用命令行界面 CLI 访问一台FortiGate
  • 评分卡建模工具scorecardpy全解读

    说到评分卡建模工具 做过评分卡的应该都能想到谢博士的scorecardpy和专为工业界模型开发设计的Python工具包 Toad 两者相比 scorecardpy更加轻量级 且依赖较少 可以满足大多数场景下的评分卡构建 为了使评分卡建模流程