评分卡之变量分箱

1.分箱是计算woe前重要的特征工程,能有效避免模型过拟合,提高模型鲁棒性

2.分箱的本质是把连续变量离散化

3.变量分箱分为有监督分箱和无监督分箱两种

4.有监督分箱主要包括卡方分箱BestKS分箱等

5.无监督分箱主要有等频分箱、等距分箱、聚类分箱等

4.变量分箱应遵循5项原则:箱子样本数占比不少于训练样本数5%;组间差距尽可能大;必须保证好坏样本;箱子数控制在5~8个;尽可能单调

《WOE编码和IV值》介绍了金融风控评分卡相关知识,本文来具体介绍变量分箱操作。

文章链接:WOE编码与IV值

变量分箱是评分卡的核心环节,也是直接决定变量woe和IV值的质量。根据woe的优势,合理的分箱可以消除变量的量纲影响,而且能减少异常值等噪声数据的影响,有效避免模型过拟合,提高模型鲁棒性。

分箱的本质是把连续变量离散化。对于本身就是离散型变量,每一种取值就是一个箱子,或者把几种取值合并为一个箱子即可。我们重点介绍连续型变量分箱的方法。

总体上,变量分箱有两种:有监督分箱和无监督分箱,前者主要包括卡方分箱BestKS分箱;后者主要有等频分箱、等距分箱、聚类分箱。通常上,变量分箱有五个原则:

  • 两两箱子bad%差距尽可能大

  • 每个箱子样本数占比不少于总体样本数的5%

  • 必须有好、坏分类(否则需要修正的woe计算公式)

  • 每个变量的箱子数控制在5~8个范围内(视训练样本数大小微调)

  • 每个变量的箱子尽可能保证单调性

下面我们针对各种分箱方法做介绍。

1.卡方分箱

根据最大分组数目和卡方阈值来控制最终的分箱数

分箱逻辑:

1)初始时,所有变量值都自成一组,统计频数。

2)然后按照各组起始值从小到大,依次扫描,取出两组拼成计算卡方值。

如果当前计算出的卡方值小于已观察到的最小卡方值,则标记当前坐标,并更新已观察最小卡方值为当前值。

3)扫描一遍后,如果当前分组数大于最大分组数,或者最小卡方值小于阈值,就将最小卡方值对应的两组频数合并,区间也合并。并回第2步执行。

否则,停止合并。输出当前各组的区间切分点。

下面代码实现这个过程:

#计算卡方值
def chi(arr):
    '''
    :param arr: 变量与标签值的numpy二维数组
    :return:返回卡方值
    '''
    assert(arr.ndim == 2)
    R_sum = np.sum(arr,axis=1) #行求和
    C_sum = np.sum(arr,axis=0) #列求和
    S_sum = np.sum(arr) #样本总量
    Likelihood_matrix = (R_sum / S_sum)
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
分箱和评分是用于信用评分模型开发中常见的技术手段。在Python中,有多种库可以用来进行分箱和评分的构建,比如pandas、numpy和scikit-learn等。 下面是一个使用pandas进行分箱的示例代码: ```python import pandas as pd # 假设有一个信用评分数据集,包含了一些特征变量和目标变量 data = pd.read_csv("credit_data.csv") # 对连续变量进行分箱 data['bin_age'] = pd.cut(data['age'], bins=[0, 18, 30, 40, 50, 60, 100], labels=False) data['bin_income'] = pd.qcut(data['income'], q=5, labels=False) # 对离散变量进行分箱 data['bin_education'] = data['education'].map({'Primary': 0, 'Secondary': 1, 'Tertiary': 2}) # 构建评分 score_card = pd.DataFrame() # 计算每个箱的一些统计指标,比如坏账率、好账率等 score_card['bin_age'] = data.groupby('bin_age')['target_variable'].mean() score_card['bin_income'] = data.groupby('bin_income')['target_variable'].mean() score_card['bin_education'] = data.groupby('bin_education')['target_variable'].mean() # 计算各个箱的WOE(Weight of Evidence)和IV(Information Value) score_card['WOE'] = np.log(score_card['bin_good_rate'] / score_card['bin_bad_rate']) score_card['IV'] = (score_card['bin_good_rate'] - score_card['bin_bad_rate']) * score_card['WOE'] # 根据IV值进行变量选择和分数分配 score_card['score'] = (score_card['WOE'] * (np.log(1 / 0.01))) * 10 + 500 print(score_card) ``` 上述代码中,我们首先使用pd.cut和pd.qcut对连续变量进行分箱,然后使用map函数对离散变量进行分箱。接下来,我们通过groupby计算每个箱的一些统计指标,如坏账率和好账率等。最后,根据WOE和IV值计算每个箱的评分,并打印出评分。 当然,这只是一个简单的示例,实际应用中可能还需要考虑到缺失值处理、异常值处理等问题。此外,还可以使用其他库和方法来完成分箱和评分的构建,具体选择则取决于实际需求和个人偏好。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

整得咔咔响

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值