金融风控实战——有监督分箱

卡方分箱

  分箱的方法有很多,卡方分箱属于其中一种,属于有监督系列的。卡方分箱正是一种基于卡方检验的分箱方法,更具地说是基于上面提到的第二种应用,独立性检验,来实现核心分箱功能的。
  卡方分箱算法简单来说,有两个部分组成:1)初始化步骤;2)合并。
小栗子:

  • 计算所有相邻分箱的卡方值:也就是说如果有1,2,3,4个分箱,那么就需要绑定相邻的两个分箱,共三组:12,23,34。然后分别计算三个绑定组的卡方值。
  • 从计算的卡方值中找出最小的一个,并把这两个分箱合并:比如,23是卡方值最小的一个,那么就将2和3合并,本轮计算中分箱就变为了1,23,4。

  背后的基本思想是:如果两个相邻的区间具有非常类似的类分布,那么这两个区间可以合并。否则,它们应该分开。低卡方值表明它们具有相似的类分布。(卡方值衡量推断值和观察值之间的偏离程度)
  停止条件:1)卡方停止的阈值 ,2)分箱数目的限制

卡方分箱公式理解:
χ 2 = ∑ i = 1 m ∑ j = 1 k ( A i j − E i j ) 2 E i j \chi^{2}=\sum_{i=1}^{m} \sum_{j=1}^{k} \frac{\left(A_{i j}-E_{i j}\right)^{2}}{E_{i j}} χ2=i=1mj=1kEij(AijEij)2

  • m=2:表示相邻的两个分箱数目
  • k:表示目标变量的类别数,比如目标是网贷违约的好和坏,那么k=2。k也可以是多类,大于2。
  • A i j A_{ij} Aij:实际频数,即第i个分箱的j类频数
  • E i j E_{ij} Eij:期望频数

其中,期望频数的公式如下,可根据P(AB)=P(A)P(B)推导出来: E i j = R i ∗ C j N E_{i j}=\frac{R_{i} * C_{j}}{N} Eij=NRiCj R i R_{i} Ri C j C_{j} Cj:分别是实际频数整列和整行的加和

举个例子说明一下这个公式是如何用的,对于相邻两个分箱的卡方值计算:
在这里插入图片描述
  实际频数和期望频数都有了,带入卡方公式求解,过程如下: χ 2 = ∑ i = 1 m ∑ j = 1 k ( A i j − E i j ) 2 E i j = [ ( A 11 − E 11 ) 2 E 11 + ( A 12 − E 12 ) 2 E 12 ] + [ ( A 21 − E 21 ) 2 E 21 + ( A 22 − E 22 ) 2 E 22 ] \begin{aligned} \chi^{2} &=\sum_{i=1}^{m} \sum_{j=1}^{k} \frac{\left(A_{i j}-E_{i j}\right)^{2}}{E_{i j}} \\ &=\left[\frac{\left(A_{11}-E_{11}\right)^{2}}{E_{11}}+\frac{\left(A_{12}-E_{12}\right)^{2}}{E_{12}}\right]+\left[\frac{\left(A_{21}-E_{21}\right)^{2}}{E_{21}}+\frac{\left(A_{22}-E_{22}\right)^{2}}{E_{22}}\right] \end{aligned} χ2=i=1mj=1kEij(AijEij)2=[E11(A11E11)2+E12(A12E12)2]+[E21(A21E21)2+E22(A22E22)2]
  如果计算结果是所有卡方值中最小的,说明:这组中两个分箱具有最相似的类分布,因此把它们合并。
在这里插入图片描述
  如果性别和化妆与否没有关系,四个格子应该是括号里的数(期望值,用极大似然估计55=100*110/200,其中110/200可理解为化妆的概率,乘以男人数100,得到男人化妆概率的似然估计),这和实际值(括号外的数)有差距,理论和实际的差距说明这不是随机的组合。

应用拟合度公式
∑ i = 1 k ( f i − n p i ) 2 n p i = ( 95 − 55 ) 2 55 + ( 15 − 55 ) 2 55 + ( 85 − 45 ) 2 45 + ( 5 − 45 ) 2 45 = 129.3 \sum_{i=1}^{k} \frac{\left(f_{i}-n p_{i}\right)^{2}}{n p_{i}}=\frac{(95-55)^{2}}{55}+\frac{(15-55)^{2}}{55}+\frac{(85-45)^{2}}{45}+\frac{(5-45)^{2}}{45}=129.3 i=1knpi(finpi)2=55(9555)2+55(1555)2+45(8545)2+45(545)2=129.3

决策树分箱

  决策树分箱的原理就是用想要离散化的变量单变量用树模型拟合目标变量,例如直接使用sklearn提供的决策树(是用cart决策树实现的),然后将内部节点的阈值作为分箱的切点。
  补充,cart决策树和ID3、C4.5决策树不同,cart决策树对于离散变量的处理其实和 连续变量一样,都是将特征的所有取值从小到大排序,然后取两两之间的均值,然后遍历所有这些均值,然后取gini系数最小的点作为阈值进行划分数据集。并且该特征后续还可参与划分。
  这里需要说明一下:cart的决策树是一颗二叉树,所以对于离散变量处理时会遍历所有值,然后取一个作为一类,剩下的作为另一类,这样建树的结果就是一颗二叉树;但在sklearn包并没有实现对离散属性的单独处理,所以我们传入的离散属性值也会被当成连续值去处理。“scikit-learn uses an optimised version of the CART algorithm; however, scikit-learn implementation does not support categorical variables for now.”

from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
x = np.array([0, 10, 180, 30, 55, 35, 25, 75, 80, 10]).reshape(-1, 1)
y = np.array([1, 1, 0, 1, 0, 0, 0, 1, 0, 0])

boundary = []  # 待return的分箱边界值列表

#x = x.fillna(-1).values  # 填充缺失值
#y = y.values

clf = DecisionTreeClassifier(criterion='entropy',  # “信息熵”最小化准则划分
                             max_leaf_nodes=6,  # 最大叶子节点数
                             min_samples_leaf=0.05)  # 叶子节点样本数量最小占比

clf.fit(x, y)  # 训练决策树
#DecisionTreeClassifier(criterion='entropy', max_leaf_nodes=6,
#                       min_samples_leaf=0.05)
plt.figure(figsize=(14,6))
tree.plot_tree(clf) #打印决策树的结构图
plt.show()

在这里插入图片描述

n_nodes = clf.tree_.node_count #决策树的节点数
n_nodes
#11
children_left = clf.tree_.children_left #node_count大小的数组,children_left[i]表示第i个节点的左子节点
children_right = clf.tree_.children_right #node_count大小的数组,children_right[i]表示第i个节点的右子节点
children_left
#array([ 1,  3, -1, -1,  5,  7, -1,  9, -1, -1, -1], dtype=int64)
children_right
#array([ 2,  4, -1, -1,  6,  8, -1, 10, -1, -1, -1], dtype=int64)
threshold = clf.tree_.threshold #node_count大小的数组,threshold[i]表示第i个节点划分数据集的阈值
threshold
#array([77.5,  5. , -2. , -2. , 65. , 32.5, -2. , 27.5, -2. , -2. , -2. ])
boundary1=[]
for i in range(n_nodes):
    if children_left[i] != children_right[i]:  # 非叶节点
        boundary1.append(threshold[i])

boundary1.sort()
boundary1
#[5.0, 27.5, 32.5, 65.0, 77.5]
min_x = x.min()
max_x = x.max() + 0.1  # +0.1是为了考虑后续groupby操作时,能包含特征最大值的样本
boundary = [min_x] + boundary + [max_x]
boundary
#[0, 5.0, 27.5, 32.5, 65.0, 77.5, 180.1]
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在python中,可以使用等频分箱方法来进行风控建模中的连续变量分箱。等频分箱是一种常见的自动分箱方法,它将数据按照相同数量的样本分配到每个箱子中。这种方法可以在保持数据分布的同时减小异常值的影响。 要在python中实现等频分箱,你可以使用pandas库中的cut()函数。cut()函数可将连续变量划分为多个等频的区间,然后可以将每个区间视为一个箱子。 下面是一个示例代码,展示了如何使用Python进行等频分箱: ```python import pandas as pd # 创建一个包含连续变量的DataFrame data = pd.DataFrame({'variable': [1, 2, 3, 4, 5,6, 7, 8, 9, 10}) # 使用cut函数进行等频分箱,将连续变量划分为3个箱子 data['bins'] = pd.cut(data['variable'], bins=3, labels=False) # 输出结果 print(data) ``` 运行上述代码,你将得到以下输出: ``` variable bins 0 1 0 1 2 0 2 3 1 3 4 1 4 5 2 5 6 2 6 7 2 7 8 2 8 9 2 9 10 2 ``` 在这个示例中,我们将连续变量划分为3个等频的箱子,通过cut()函数返回的结果可以看到每个变量对应的箱子标签。 请注意,这只是等频分箱的一种简单实现示例,实际应用中可能会根据具体情况进行调整和优化。另外,对于风控建模还有其他自动分箱方法,如等距分箱和基于决策树的分箱方法,你可以根据实际需求选择合适的方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [风控ML[10] | 风控建模中的自动分箱的方法有哪些](https://blog.csdn.net/Pysamlam/article/details/122787425)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值