评分卡应用 - 利用Toad进行有监督分箱(卡方分箱/决策树分箱)

2023-12-21 02:58

本文主要是介绍评分卡应用 - 利用Toad进行有监督分箱(卡方分箱/决策树分箱),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

toad是针对工业届建模而开发的工具包,针对风险评分卡的建模有针对性的功能。toad持续更新优化中,本教程针对toad的各类主要功能进行介绍,
包括:

  1. EDA相关功能
  2. 如何使用toad高效分箱并进行特征筛选
  3. WOE转化
  4. 逐步回归特征筛选
  5. 模型检验和评判
  6. 标准评分卡转化和输出
  7. 其他功能

中文教程:toad使用教程


文章目录

  • 1 Toad — EDA 工具
  • 2 变量的iv值 —— quality
    • 2.1 IV值解读
    • 2.2 toad.quality
  • 3 如何使用toad高效分箱并进行特征筛选
  • 4 toad分箱
    • 4.1 卡方分箱
    • 4.2 决策树分箱
    • 4.3 toad调用函数
  • 5 观察分箱并调整
  • 6 WOE转化
  • 7 用gbdt编码,用于gbdt + lr建模的前置
  • 8 一个完整的code示例
  • 9 等频分箱


1 Toad — EDA 工具

虽然没有pandas_profiling那么完整,但是已经不错了

用于检测数据情况(EDA)。输出每列特征的统计性特征和其他信息,主要的信息包括:缺失值、unique values、数值变量的平均值、离散值变量的众数。

toad.detect(train)[:10]

在这里插入图片描述

  • 正样本占比2.2%:target的mean是0.0219479
  • 部分特征有缺失值,且缺失值不等:注意missing列。
  • 数值型变量和离散型变量有若干个,部分离散型变量的unique values较多,有10多个甚至84个:离散型变量的unique列。

2 变量的iv值 —— quality

2.1 IV值解读

其中IV值( 参考:二元分类特征的选择:IV值):
IV值衡量了某个特征对目标的影响程度,其基本思想是根据该特征所命中黑白样本的比率与总黑白样本的比率,来对比和计算其关联程度,计算公式如下:
在这里插入图片描述
其中Distribution Good(i)表示i分组命中白样本的占比,如果用#good(i)表示i分组命中的样本数,#good(T)表示所有的白样本总量,则 Distribution Good(i) = #good(i) / #good(T)。

当我们计算出特征的IV值后,该如何去解释它的预测能力。
或者说,当IV值取到多大时,我们才选择这个特征。这里给出一个经验参考表:

IV值预测能力
< 0.02无预测能力
0.02 ~ 0.1较弱的预测能力
0.1 ~ 0.3预测能力一般
0.3 ~0.5较强的预测能力
> 0.5可疑

并不是IV值越大越好,当IV值大于0.5时,我们需要对这个特征打个疑问,因为它过于太好而显得不够真实。
通常我们会选择IV值在[0.1-0.5]这个范围的特征。
可能不同场景在取值的细节上会有所不同,比如某些风控团队会将IV值大于0.05的特征也纳入考虑范畴,而学术界则有观点认为选择0.1~0.3这个范围会更好。

2.2 toad.quality

输出每个变量的iv值,gini,entropy,和unique values,结果以iv值排序。
”target”为目标列,
”iv_only”决定是否只输出iv值。

注意:1. 对于数据量大或高维度数据,建议使用iv_only=True 2. 要去掉主键,日期等高unique values且不用于建模的特征

to_drop = ['APP_ID_C','month'] # 去掉ID列和month列
toad.quality(data.drop(to_drop,axis=1),'target',iv_only=True)[:15]

在这里插入图片描述


3 如何使用toad高效分箱并进行特征筛选

toad.selection.select(dataframe, target=’target’, empty=0.9, iv=0.02, corr=0.7, return_drop=False, exclude=None):

根据缺失值占比,iv值,和高相关性进行变量筛选,赋值为:

  • (1)empyt=0.9: 若变量的缺失值大于0.9被删除
  • (2)iv=0.02: 若变量的iv值小于0.02被删除
  • (3)corr=0.7: 若两个相关性高于0.7时,iv值低的变量被删除
  • (4)return_drop=False: 若为True,function将返回被删去的变量列
  • (5)exclude=None: 明确不被删去的列名,输入为list格式

如下面的cell,没有变量由于缺失值高被删除,大量变量因为低iv值被删除,部分相关性高的变量被删除。从165个特征中选出了32个变量。

train_selected, dropped = toad.selection.select(train,target = 'target', empty = 0.5, iv = 0.05, corr = 0.7, return_drop=True, exclude=['APP_ID_C','month'])
print(dropped)
print(train_selected.shape)

4 toad分箱

4.1 卡方分箱

参考:【数据建模 特征分箱】特征分箱的方法
有监督的卡方分箱法(ChiMerge)

自底向上的(即基于合并的)数据离散化方法。

它依赖于卡方检验:具有最小卡方值的相邻区间合并在一起,直到满足确定的停止准则。
对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开。而低卡方值表明它们具有相似的类分布。
在这里插入图片描述

4.2 决策树分箱

数据处理实战: Chimerge和决策树分箱
不同于Chimerge的自下而上, 决策树是自顶向下划分的, 但两者都是监督式分箱方法, 即都需要使用到标签变量。由于分箱时使用了类信息, 因此区间的边界更有可能定义在有帮助于提高分类准确率的地方。

4.3 toad调用函数

toad的分箱功能支持数值型数据和离散型分箱,默认分箱方法使用 卡方分箱。

c.fit(dataframe, y = ‘target’, method = ‘chi’, min_samples = None, n_bins = None, empty_separate = False)
  • y: 目标列
  • method: 分箱方法,支持’chi’ (卡方分箱), ‘dt’ (决策树分箱), ‘kmean’ , ‘quantile’ (等频分箱), ‘step’ (等步长分箱)
  • min_samples: 每箱至少包含样本量,可以是数字或者占比
  • n_bins: 箱数,若无法分出这么多箱数,则会分出最多的箱数
  • empty_separate: 是否将空箱单独分开

一般来说,min_samples / n_bins 需要结合起来使用,可能更能够找到最佳分箱点

其他关联函数:

*查看分箱节点*:c.export()
*手动调整分箱*: c.load(dict)
*apply分箱结果*: c.transform(dataframe, labels=False):- labels: 是否将分箱结果转化成箱标签。False时输出0,1,2…(离散变量根据占比高低排序),True输出(-inf, 0], (0,10], (10, inf)。
# initialise
c = toad.transform.Combiner()# 使用特征筛选后的数据进行训练:使用稳定的卡方分箱,规定每箱至少有5%数据, 空值将自动被归到最佳箱。
c.fit(train_selected.drop(to_drop, axis=1), y = 'target', method = 'chi', min_samples = 0.05) #empty_separate = False# 为了演示,仅展示部分分箱
print('var_d2:',c.export()['var_d2'])
print('var_d5:',c.export()['var_d5'])
print('var_d6:',c.export()['var_d6'])

输出的结果为:

var_d2: [747.0, 782.0, 820.0]
var_d5: [['O', 'nan', 'F'], ['M']]
var_d6: [['PUBLIC LTD COMPANIES', 'NON-RESIDENT INDIAN', 'PRIVATE LTD COMPANIES', 'PARTNERSHIP FIRM', 'nan'], ['RESIDENT INDIAN', 'TRUST', 'TRUST-CLUBS/ASSN/SOC/SEC-25 CO.', 'HINDU UNDIVIDED FAMILY', 'CO-OPERATIVE SOCIETIES', 'LIMITED LIABILITY PARTNERSHIP', 'ASSOCIATION', 'OVERSEAS CITIZEN OF INDIA', 'TRUST-NGO']]

简单来解读一下,

  • var_d2是一个连续变量,那么分段就是,[0-747],[747-782],[782-820],[820-inf],就分为四段了
  • var_d5是一个分类变量,那么就是分成两类

5 观察分箱并调整

toad.plot的module提供了一部分的可视化功能,帮助调整分箱节点。

 toad.plot.bin_plot(dataframe, x = None, target = ‘target)

来看一个示例:

from toad.plot import bin_plot
col = 'sepal length (cm)'
bin_plot(c.transform(iris[[col,'target']], labels=True), x=col, target='target')

这里是单个特征sepal length (cm)跟target的关系:

在这里插入图片描述
双坐标轴的意义:

  • 蓝色bar代表了样本量占比,
  • 红线代表了正样本占比(e.g. 坏账率),也就是target的汇总

20211206补充:
这里红色的折线计算逻辑是类别的平均数,比如,[7.1,+)有8%的样本,一共10个,每个类别label都是2,那么这里就等于2;
比如,[6.3,7.1)有28%的样本,一共有40个样本,y分别为[1,2,0,1,2,0,…],这里求平均(除以个数)得到1.64


6 WOE转化

WOE转化在分箱调整好之后进行,步骤如下:

  • 用调整好的Combiner转化数据: c.transform(dataframe, labels=False) 只会转化被分箱的变量
  • 初始化woe transer: transer = toad.transform.WOETransformer()
  • fit_transform: transer.fit_transform(dataframe, target, exclude = None)
  • 训练并输出woe转化的数据,用于转化train/时间内数据
    • target:目标列数据(非列名)
    • exclude: 不需要被WOE转化的列 注意:会转化所有列,包括未被分箱transform的列,通过 ‘exclude’ 删去不要WOE转化的列,特别是target列
  • *根据训练好的transer,转化test/OOT数据:*transer.transform(dataframe)
# 初始化
transer = toad.transform.WOETransformer()# combiner.transform() & transer.fit_transform() 转化训练数据,并去掉target列
train_woe = transer.fit_transform(c.transform(train_selected), train_selected['target'], exclude=to_drop+['target'])
OOT_woe = transer.transform(c.transform(OOT))print(train_woe.head(3))

7 用gbdt编码,用于gbdt + lr建模的前置

gbdt_transer = toad.transform.GBDTTransformer()
gbdt_transer.fit(final_data[col+['target']], 'target', n_estimators = 10, max_depth = 2)gbdt_vars = gbdt_transer.transform(final_data[col])gbdt_vars.shape
>>> (43576, 40)

8 一个完整的code示例


import pandas as pd
import numpy as np
import toad
from sklearn.datasets import load_iris# 数据载入
iris = load_iris()
target = iris['target']
iris = pd.DataFrame(iris['data'],columns = iris['feature_names'])
iris['target'] = target# 数据洞察
eda = toad.detect(iris)
qualitys = toad.quality(iris,'target',iv_only=True)# 分箱
c = toad.transform.Combiner()# 使用特征筛选后的数据进行训练:使用稳定的卡方分箱,规定每箱至少有5%数据, 空值将自动被归到最佳箱。
c.fit(iris, y = 'target', method = 'chi', min_samples = 0.05) #empty_separate = False# 为了演示,仅展示部分分箱
c.export()
print('var_d2:',c.export()['var_d2'])
print('var_d5:',c.export()['var_d5'])
print('var_d6:',c.export()['var_d6'])# 画分箱图
from toad.plot import bin_plot
# 看'var_d2'在时间内的分箱
col = 'sepal length (cm)'
bin_plot(c.transform(iris[[col,'target']], labels=True), x=col, target='target')# bar代表了样本量占比,红线代表了正样本占比(e.g. 坏账率)# GBDT + LR的树模型特征输出
col = 'sepal length (cm)'
gbdt_transer = toad.transform.GBDTTransformer()
gbdt_transer.fit(iris, 'target', n_estimators = 10, max_depth = 2)
gbdt_vars = gbdt_transer.transform(iris[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)','petal width (cm)']])
iris.shape,gbdt_vars.shape

9 等频分箱

分位数分箱,每段样本量数量一致:

  • method = ‘quantile’
  • n_bins = 3 ,分成多截
# initialise
c = toad.transform.Combiner()# 使用特征筛选后的数据进行训练:使用稳定的卡方分箱,规定每箱至少有5%数据, 空值将自动被归到最佳箱。
c.fit(data, method = 'quantile',n_bins  = 3) 

可以设置的参数有n_bins 等频数量

如果要让源数据进行直接等级化,可以使用:

c.transform(data, labels=False)

这里主要,data的格式是dataframe,所以如果是data['columns']是需要改成data[['columns']]

这篇关于评分卡应用 - 利用Toad进行有监督分箱(卡方分箱/决策树分箱)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/518432

相关文章

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

SpringSecurity6.0 如何通过JWTtoken进行认证授权

《SpringSecurity6.0如何通过JWTtoken进行认证授权》:本文主要介绍SpringSecurity6.0通过JWTtoken进行认证授权的过程,本文给大家介绍的非常详细,感兴趣... 目录项目依赖认证UserDetailService生成JWT token权限控制小结之前写过一个文章,从S

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2