连续值特征分桶区间设置

本文探讨了数值特征分桶的方法,包括依据实际意义和数学分析两种方式。介绍了Odds、WOE和IV值作为评价分桶效果的指标,并详细阐述了等宽、等频、K-means和卡方统计等数学分析方法。分桶处理能够增强模型区分度,但也需要注意负面影响。


我们实际遇到的数据经常会是连续取值的数据,比如一些表示计数或者量级的属性。

  1. 有些模型比如常用的梯度提升树系列(GBDT,XGB,LGB)可以不做任何处理的直接输入;
  2. 也有些模型(lr,nn)把数值属性去除量纲归一化后就可以作为输入;
  3. 但是一般为了方便处理或者提取出更有用的信息我们会做分桶或者说分箱处理。

设置几个阈值把总的取值区间划分为几个小区间(按照属性取值从小到大或者从大到小的顺序进行,不可跳跃。),每个样本的取值就会落在其中一个区间,如果阈值设置的好的话相当于人工再这个属性增加了一点区分度,更利于分类器性能,当然设置的不好的话也有对应的负面影响。

依靠实际意义

分桶区间的设置可以参考字段的实际意义,比如说字段是年龄的话显然可以大致分为儿童,青年,老年之类;某个测量指标可以分为弱,标准,强之类。这样的话不仅相当于引入问题背景的先验知识,得到的模型的解释性也更强(依赖于某属性低,或者高)。
但是更多的时候我们无法这样做,首先数据背景里面对于这个属性的划分可能比较粗放,不是理论上最好的划分;其次我们拿到的数据可能经过脱敏或者一些预处理,不知道该属性代表的实际意义是什么或者量纲发生了我们不知道的变动,无法直接上手用先验知识划分。这个时候我们就科学的问题就科学的来处理,再纯数学的角度做一些划分。

评价指标

在利用数学分析分桶之前,先介绍一下用来衡量我们分桶好坏(数学意义,可能不是模型中最优)的数学指标。

Odds

odds其实就是几率,假设事件发生的概率为 P P P,那么 o d d s = P 1 − P odds = \frac{P}{1-P} o

在 Hive 中,**区(Partition)**和**(Bucketing)**是两种用于优化大数据查询性能的重要机制。它们各自解决的问题不同,适用的场景也有所区别。 ### 区(Partition) 区是一种将数据按照某个列(通常是时间或类别等离散值)划到不同目录下的方式。每个区对应一个子目录,数据根据区键(如 `rank`、`year`、`country` 等)存储在对应的子目录中。 - **优点**: - 提高查询效率:当查询限定在某些特定区时,Hive 可以跳过无关的数据目录,减少 I/O 操作。 - 数据管理方便:可以按区进行数据归档、清理或备份操作。 - **缺点**: - 如果区键选择不当,可能导致区数量过多或布不均,影响性能。 - 不适合连续值作为区键(如用户 ID),因为会导致大量小文件。 例如,对于一张记录用户评级的表 `persionrank`,可以通过 `rank` 字段进行区: ```sql CREATE TABLE persionrank ( id INT, name STRING, score FLOAT ) PARTITIONED BY (rank STRING); ``` 插入数据时,需要指定具体的区值: ```sql INSERT INTO TABLE persionrank PARTITION (rank='A') SELECT id, name, score FROM temp_table WHERE score >= 90; ``` ### (Bucketing) 是将数据按照某个列(通常是数值型字段)使用哈希函数取模的方式配到多个中。每个是一个文件或一组文件,数据均匀布在各个中。 - **优点**: - 均匀布数据:通过哈希算法保证数据在各个之间布均匀,避免数据倾斜。 - 提高并行处理能力:多个可以并行处理,提升查询效率。 - 支持高效采样:便于进行随机抽样析。 - **缺点**: - 字段的选择需谨慎,必须是经常用于连接或过滤的字段。 - 后数据的物理存储结构不可更改,的数量在建表时固定。 例如,创建一个表,按 `id` 字段为 4 个: ```sql CREATE TABLE persionrank_bucketed ( id INT, name STRING, score FLOAT, rank STRING ) CLUSTERED BY (id) INTO 4 BUCKETS; ``` 在插入数据前,需要开启强制模式: ```sql SET hive.enforce.bucketing = true; INSERT INTO TABLE persionrank_bucketed SELECT * FROM persionrank; ``` 编号的计算公式为: ``` Bucket number = hash_function(bucketing_column) mod num_buckets ``` ### 总结对比 | 特性 | 区(Partition) | (Bucketing) | |--------------|--------------------------------------|-------------------------------------------| | **作用** | 按逻辑类组织数据 | 按哈希布均匀划数据 | | **实现方式** | 使用 `PARTITIONED BY` | 使用 `CLUSTERED BY ... INTO n BUCKETS` | | **适用场景** | 时间、地区等离散值 | 用户 ID、订单号等连续值 | | **查询优化** | 减少扫描数据量 | 提高并行度和采样效率 | | **数据布** | 可能导致数据倾斜 | 均匀布 | | **灵活性** | 区可动态添加 | 数固定,不可更改 | ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值