卡方分箱(Chi Merge 算法)

本文介绍了卡方分箱的原理,包括卡方分布的定义和卡方检验的基本思想,以及如何通过卡方值衡量实际值与理论值的偏离程度。此外,文章还提到了卡方分箱算法在数据处理中的应用,并展示了如何使用Chi Merge算法进行分箱操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

卡方分箱原理及实现(Chi Merge 算法)

一. 卡方分布

卡方分布的定义:

若k个独立的随机变量Z1,Z2,…,Zk满足标准正态分布N(0, 1), 则这k个随机变量的平方和:
X=∑i=1kZi2 X = \sum_{i=1}^{k}Z_{i}^2 X=i=1kZi2

分箱原理是一种常用的特征离散化法,可以将连续型特征转化为离散型特征,以便于机器学习算法的处理。其基本思想是将连续型特征划分为若干个区间,使得每个区间内的样本数量尽可能相等,同时区间之间的差异尽可能大。 具体实现过程如下: 1. 将连续型特征按照大小排序,然后将其分为k个等频区间,每个区间内的样本数量相等。 2. 对于每个区间,计算其实际值与期望值之间的差异,使用检验来衡量这种差异的显著性。 3. 如果某个区间的值小于预设的阈值,则将其与相邻的区间合并,直到所有区间的值都大于等于阈值为止。 4. 最终得到的k个区间就是特征的离散化结果。 下面是用Python实现分箱的示例代码: ```python import pandas as pd import numpy as np from scipy.stats import chi2_contingency def chi_merge(df, col, target, max_groups, confidence): """ 分箱函数 :param df: 数据集 :param col: 需要分箱的特征列名 :param target: 目标列名 :param max_groups: 最大分组数 :param confidence: 检验的置信度 :return: 分箱结果 """ # 将数据按照特征列排序 df = df.sort_values(col) # 将目标列转化为二元变量 df['target'] = np.where(df[target] == 1, 1, 0) # 计算每个分组的样本数量 total = df['target'].sum() count = df.groupby(col)['target'].agg(['sum', 'count']) count.columns = ['target', 'total'] count['non_target'] = count['total'] - count['target'] # 初始化分组 groups = [[i] for i in count.index] # 合并分组直到达到最大分组数或者所有分组的值都小于阈值 while len(groups) > max_groups: # 计算相邻分组的chi_values = [] for i in range(len(groups) - 1): group1 = groups[i] group2 = groups[i + 1] obs = np.array([[count.loc[group1, 'target'].sum(), count.loc[group1, 'non_target'].sum()], [count.loc[group2, 'target'].sum(), count.loc[group2, 'non_target'].sum()]]) chi2, p, dof, ex = chi2_contingency(obs) chi_values.append(chi2) # 找到值最小的分组 min_chi = np.min(chi_values) min_index = chi_values.index(min_chi) # 合并分组 groups[min_index] = groups[min_index] + groups[min_index + 1] groups.pop(min_index + 1) # 检查合并后的分组的值是否小于阈值 if min_chi < chi2.isf(1 - confidence, 1): break # 将分组转化为分箱结果 result = {} for i, group in enumerate(groups): for val in group: result[val] = i return result ``` 注意:这段代码中的检验使用了scipy库中的chi2_contingency函数,需要先安装该库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值