min_sample 参数为最小叶子节点的样本阈值,如果小于该阈值则不进行切分,如前面所述设置为整体样本量的5%
返回的结果我这里只返回了最优分割点,如果需要返回其他的比如GINI值,可以自行添加。
def bining_data_split(sample_set, var, min_sample, split_list):
'''
划分数据找到最优分割点list
param sample_set: 待切分样本
param var: 分割变量名称
param min_sample: 待切分样本的最小样本量(限制条件)
param split_list: 最优分割点list
'''
split, position = choose_best_split(sample_set, var, min_sample)
if split != 0.0:
split_list.append(split)
# 根据分割点划分数据集,继续进行划分
sample_set_left = sample_set[sample_set[var] < split]
sample_set_right = sample_set[sample_set[var] > split]
# 如果左子树样本量超过2倍最小样本量,且分割点不是第一个分割点,则切分左子树
if len(sample_set_left) >= min_sample * 2 and position not in [0.0, 1.0]:
bining_data_split(sample_set_left, var, min_sample, split_list)
else:
None
# 如果右子树样本量超过2倍最小样本量,且分割点不是最后一个分割点,则切分右子树
if len(sample_set_right) >= min_sample * 2 and position not in [0.0, 1.0]:
bining_data_split(sample_set_right, var, min_sample, split_list)
else:
None
split_list 参数是用来保存返回的切分点,每次切分后返回的切分点存入该list
在这里判断切分点分割的左子树和右子树是否满足“内部节点再划分所需的最小样本数>=总样本量的10%”的条件,如果满足则进行递归调用。
def get_bestsplit_list(sample_set, var):
'''
根据分箱得到最优分割点list
param sample_set: 待切分样本
param var: 分割变量名称
'''
# 计算最小样本阈值(终止条件)
min_df = sample_set.shape[0] * 0.05
split_list = []
# 计算第一个和最后一个分割点
bining_data_split(sample_set, var, min_df, split_list)
return split_list
最后整合以下来个函数调用,返回一个分割点list。
可以使用sklearn库的决策树测试一下单变量分类对结果进行验证,在分类方法相同,剪枝条件一致的情况下结果是一致的。
以上这篇python实现连续变量最优分箱详解--CART算法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持IIS7站长之家。