首页 > 其他分享 >lightgbm分桶原则

lightgbm分桶原则

时间:2022-11-18 17:46:52浏览次数:43  
标签:bin cnt lightgbm 分桶 原则 distinct max values mean

一、针对连续值的分桶

def GreedyFindBin(distinct_values, counts,num_distinct_values, max_bin, total_cnt, min_data_in_bin=3):
#INPUT:
#   distinct_values 保存特征取值的数组,特征取值单调递增
#   counts 特征的取值对应的样本数目
#   num_distinct_values 特征取值的数量
#   max_bin 分桶的最大数量
#   total_cnt 样本数量
#   min_data_in_bin 桶包含的最小样本数

# bin_upper_bound就是记录桶分界的数组
    bin_upper_bound=list();
    assert(max_bin>0)
    
    # 特征取值数比max_bin数量少,直接取distinct_values的中点放置
    if num_distinct_values <= max_bin:
        cur_cnt_inbin = 0
        for i in range(num_distinct_values-1):
            cur_cnt_inbin += counts[i]
            #若一个特征的取值比min_data_in_bin小,则累积下一个取值,直到比min_data_in_bin大,进入循环。
            if cur_cnt_inbin >= min_data_in_bin:
                #取当前值和下一个值的均值作为该桶的分界点bin_upper_bound
                bin_upper_bound.append((distinct_values[i] + distinct_values[i + 1]) / 2.0)
                cur_cnt_inbin = 0
        # 对于最后一个桶的上界则为无穷大
        cur_cnt_inbin += counts[num_distinct_values - 1];
        bin_upper_bound.append(float('Inf'))
        # 特征取值数比max_bin来得大,说明几个特征值要共用一个bin
    else:
        if min_data_in_bin>0:
            max_bin=min(max_bin,total_cnt//min_data_in_bin)
            max_bin=max(max_bin,1)
        #mean size for one bin
        mean_bin_size=total_cnt/max_bin
        rest_bin_cnt = max_bin
        rest_sample_cnt = total_cnt
        #定义is_big_count_value数组:初始设定特征每一个不同的值的数量都小(false)
        is_big_count_value=[False]*num_distinct_values
        #如果一个特征值的数目比mean_bin_size大,那么这些特征需要单独一个bin
        for i in range(num_distinct_values):
        #如果一个特征值的数目比mean_bin_size大,则设定这个特征值对应的is_big_count_value为真。。
            if counts[i] >= mean_bin_size:
                is_big_count_value[i] = True
                rest_bin_cnt-=1
                rest_sample_cnt -= counts[i]
        #剩下的特征取值的样本数平均每个剩下的bin:mean size for one bin
        mean_bin_size = rest_sample_cnt/rest_bin_cnt
        upper_bounds=[float('Inf')]*max_bin
        lower_bounds=[float('Inf')]*max_bin
        
        bin_cnt = 0
        lower_bounds[bin_cnt] = distinct_values[0]        
        cur_cnt_inbin = 0
        #重新遍历所有的特征值(包括数目大和数目小的)
        for i in range(num_distinct_values-1):
            #如果当前的特征值数目是小的
            if not is_big_count_value[i]:
                rest_sample_cnt -= counts[i]        
            cur_cnt_inbin += counts[i]
            
            # 若cur_cnt_inbin太少,则累积下一个取值,直到满足条件,进入循环。
            # need a new bin 条件:
              #1.当前特征值是大数据量的 2.当前桶内累计的数量已经大于 mean_bin_size 3.下一个特征值是大数据量的值且当前桶内数据量已经超过mean_bin_size的一半
            if is_big_count_value[i] or cur_cnt_inbin >= mean_bin_size or is_big_count_value[i + 1] and cur_cnt_inbin >= max(1.0, mean_bin_size * 0.5):
                upper_bounds[bin_cnt] = distinct_values[i] # 第i个bin的最大就是 distinct_values[i]了
                bin_cnt+=1
                lower_bounds[bin_cnt] = distinct_values[i + 1] # 下一个bin的最小就是distinct_values[i + 1],注意先++bin了
                if bin_cnt >= max_bin - 1:
                    break
                cur_cnt_inbin = 0
                if not is_big_count_value[i]:
                    rest_bin_cnt-=1
                    mean_bin_size = rest_sample_cnt / rest_bin_cnt
        bin_cnt+=1
        # update bin upper bound 与特征取值数比max_bin数量少的操作类似,取当前值和下一个值的均值作为该桶的分界点
        for i in range(bin_cnt-1):
            bin_upper_bound.append((upper_bounds[i] + lower_bounds[i + 1]) / 2.0)
        bin_upper_bound.append(float('Inf'))
    return bin_upper_bound

二、针对类别型特征的分桶

参考文献:

https://zhuanlan.zhihu.com/p/85053333

https://blog.csdn.net/yftadyz/article/details/108466687

标签:bin,cnt,lightgbm,分桶,原则,distinct,max,values,mean
From: https://www.cnblogs.com/gczr/p/16904024.html

相关文章

  • 配置管理的三类配置库原则
     1三库管理原则项目配置管理的库分为开发库、受控库、产品库。这三个库是相互独立的物理库,其中受控库在逻辑上分为配置库和基线库。1.1开发库存放代码、脚本等开发过......
  • 面向对象的五大基本原则
    单一职责原则单一职责原则的核心思想是:一个类最好只做一件事,只有一个引起它变化的原因。单一职责原则可以看作高内聚,低耦合在面向对象原则上的引申,将职责定义为引起变化的......
  • 第二章 Kubernetes架构原则和对象设计
    Kubernetes架构 根据如上架构对各组件进行讲解etcdetcd是CoreOS基于Raft开发的分布式key-value存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布......
  • 792. 匹配子序列的单词数 ----- find()暴力、队列分桶查询、二分法哈希
    给定字符串s 和字符串数组 words,返回  words[i] 中是s的子序列的单词个数 。字符串的子序列是从原始字符串中生成的新字符串,可以从中删去一些字符(可以是none)......
  • MySQL 索引最左前缀原则失效?
    测试索引最左前缀原则,发现缺失带头索引后,索引还是生效的。一、测试创建测试表CREATETABLE`user`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'主键',......
  • 13条设计原则
                                         ......
  • 第一章、计算机的三大原则
    热身问答硬件(Hardware)和软件(Software)的区别是什么?硬件是支撑计算机跑起来的实体设备,而软件是负责提供给用户良好体验的非实体程序。硬件是看得见摸得着的设备,如......
  • 【架构】架构设计的三原则
    前面系统地聊了架构设计的主要目的,是为了解决软件系统复杂度带来的问题,并分析了复杂度的来源。这篇文章着重讲讲架构设计的三个原则,以及架构设计原则的案例。成为架构师是......
  • 微服务服务拆分原则 与 RestTemplate远程调用
    (目录)服务拆分和远程调用任何分布式架构都离不开服务的拆分,微服务也是一样。服务拆分原则这里总结了微服务拆分时的几个原则:不同微服务,不要重复开发相同业务微......
  • 模块化设计原则
    1.高内聚低耦合原则:确保每个模块只完成系统要求的独立子功能;模块与模块间的联系最少且接口简单;2.降低模块间耦合度:越底层的模块,应该越稳定,越抽象,越具有高复用度;减少依赖,避免模块......