机器学习 - 特征预处理 - 分箱

分箱(Binning)是一种数据预处理技术,将连续变量分割成离散的组别或区间,有助于减少数据的噪音,提高模型的稳定性。以下是五种常见的分箱方法及其详细介绍:

1. 卡方分箱(Chi-square Binning)

过程

  1. 初始化分箱:将每个不同的数值作为一个单独的箱。
  2. 计算卡方值:两两合并相邻的箱,计算每对合并后的卡方统计量。
  3. 合并箱:选择卡方值最小的两个箱进行合并。
  4. 重复步骤2和3,直到达到预定的箱数或卡方值超过阈值。

特点

  • 基于类别变量的频率进行分箱。
  • 可以处理非线性关系。
  • 适用于目标变量为分类变量的情况。

代码示例

import numpy as np
import pandas as pd
from scipy.stats import chi2_contingencydef chi_merge(data, target, max_intervals):data = data.copy()intervals = np.unique(data)while len(intervals) > max_intervals:chi_values = []for i in range(len(intervals) - 1):df_temp = pd.DataFrame({'x': data, 'y': target})df_temp = df_temp[(df_temp['x'] >= intervals[i]) & (df_temp['x'] < intervals[i + 2])]contingency_table = pd.crosstab(df_temp['x'], df_temp['y'])chi2 = chi2_contingency(contingency_table)[0]chi_values.append(chi2)min_index = np.argmin(chi_values)intervals = np.delete(intervals, min_index + 1)return intervals# 示例数据
data = np.array([1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8])
target = np.array([0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0])
intervals = chi_merge(data, target, 4)
print("卡方分箱结果:", intervals)

2. 决策树分箱(Decision Tree Binning)

过程

  1. 训练决策树模型:使用特征变量和目标变量训练决策树模型。
  2. 生成分箱规则:通过决策树的分裂节点生成分箱区间。
  3. 应用分箱规则:将特征变量按生成的规则进行分箱。

特点

  • 基于决策树模型进行分箱,适用于处理非线性和复杂关系。
  • 适用于目标变量为分类或回归变量的情况。
  • 结果受决策树模型参数影响较大。

代码示例

import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifierdef dt_binning(data, target, max_leaf_nodes):tree = DecisionTreeClassifier(max_leaf_nodes=max_leaf_nodes)tree.fit(data.reshape(-1, 1), target)thresholds = tree.tree_.threshold[tree.tree_.threshold != -2]thresholds = np.sort(thresholds)return thresholds# 示例数据
data = np.array([1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8])
target = np.array([0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0])
thresholds = dt_binning(data, target, max_leaf_nodes=4)
print("决策树分箱结果:", thresholds)

3. 等频分箱(Quantile Binning)

过程

  1. 排序:将数据按从小到大排序。
  2. 分割:根据分位数将数据划分为等频的区间。

特点

  • 每个箱包含相同数量的数据点。
  • 对数据分布不均的数据也能进行均衡分箱。
  • 易于实现。

代码示例

import numpy as np
import pandas as pddef quantile_binning(data, num_bins):quantiles = np.percentile(data, np.linspace(0, 100, num_bins + 1))return quantiles# 示例数据
data = np.array([1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8])
quantiles = quantile_binning(data, num_bins=4)
print("等频分箱结果:", quantiles)

4. 等距分箱(Equal-width Binning)

过程

  1. 计算区间宽度:根据数据的最小值和最大值,计算等宽区间的宽度。
  2. 分割:根据计算的宽度将数据划分为等宽的区间。

特点

  • 每个箱的宽度相同。
  • 对数据分布不均的数据可能导致某些箱数据较少。
  • 简单易实现。

代码示例

import numpy as npdef step_binning(data, num_bins):min_val, max_val = np.min(data), np.max(data)step = (max_val - min_val) / num_binsbins = np.arange(min_val, max_val, step)bins = np.append(bins, max_val)return bins# 示例数据
data = np.array([1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8])
bins = step_binning(data, num_bins=4)
print("等距分箱结果:", bins)

5. KMeans分箱(KMeans Binning)

过程

  1. 初始化KMeans模型:选择分箱数作为KMeans聚类的簇数。
  2. 训练模型:使用数据训练KMeans模型。
  3. 生成分箱规则:根据KMeans模型的簇心生成分箱区间。

特点

  • 基于聚类算法进行分箱,适用于数据集中存在明显簇结构的情况。
  • 对数据分布的要求较高,适用于聚类效果较好的场景。
  • 算法较为复杂,计算量大。

代码示例

import numpy as np
import pandas as pd
from sklearn.cluster import KMeansdef kmeans_binning(data, num_bins):kmeans = KMeans(n_clusters=num_bins)kmeans.fit(data.reshape(-1, 1))centers = np.sort(kmeans.cluster_centers_.flatten())bins = np.concatenate(([data.min()], centers, [data.max()]))return bins# 示例数据
data = np.array([1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8])
bins = kmeans_binning(data, num_bins=4)
print("KMeans分箱结果:", bins)

总结

分箱方法优点缺点特点适用场景
卡方分箱- 能处理非线性关系- 计算复杂度高,参数选择困难- 基于类别变量频率目标变量为分类变量的情况
决策树分箱- 适用于处理复杂和非线性关系- 结果受决策树参数影响大- 基于决策树模型目标变量为分类或回归变量的情况
等频分箱- 每个箱包含相同数量的数据点- 对数据分布不均的情况不适用- 数据均匀分布数据分布不均时平衡分箱
等距分箱- 简单易实现- 对数据分布不均的情况不适用- 每个箱的宽度相同数据分布均匀或需要均匀分割数据的情况
KMeans分箱- 适用于存在明显簇结构的数据- 计算复杂度高,适用场景有限- 基于聚类算法数据集中存在明显簇结构的情况

常见问题及解决方案

1. 数据分布不均

问题:数据分布不均匀,导致某些分箱内的数据量过少或过多。
解决方案:使用等频分箱(Quantile Binning)来确保每个箱中数据量相对均匀。

2. 箱数选择

问题:确定合适的分箱数量(箱数)可能会比较困难。
解决方案:可以通过交叉验证或根据业务需求来确定最佳的分箱数量。也可以根据经验规则,如Sturges’ rule或Scott’s rule。

3. 边界值处理

问题:边界值可能会导致某些数据点落在箱的边界上,不确定应该归入哪个箱。
解决方案:采用开闭区间策略,明确规定边界值属于哪个箱。例如,左开右闭区间(a, b]

4. 目标变量影响

问题:目标变量(分类或回归)的分布对分箱结果影响较大。
解决方案:对于分类问题,使用卡方分箱(Chi-square Binning)或决策树分箱(Decision Tree Binning);对于回归问题,选择等频分箱或等距分箱。

5. 处理异常值

问题:异常值可能会导致某些分箱的分布不均。
解决方案:在分箱之前进行异常值处理,可以通过截尾法(Winsorization)或删除异常值。

6. 类别变量分箱

问题:类别变量如何进行分箱。
解决方案:将类别变量转化为数值变量后进行分箱,或采用针对类别变量的卡方分箱(Chi-square Binning)。

7. 动态分箱

问题:数据集在不同时间段会发生变化,需要动态调整分箱策略。
解决方案:定期重新计算分箱边界,或使用基于滑动窗口的方法进行动态分箱。

8. 高维数据分箱

问题:高维数据进行分箱时计算复杂度高。
解决方案:采用降维技术,如PCA(主成分分析),然后对降维后的数据进行分箱。

9. 信息损失

问题:分箱可能导致信息损失,尤其是在精细度要求较高的情况下。
解决方案:尽量选择适当的分箱方法,并控制分箱数量,以平衡信息损失和模型复杂度。

10. 分箱边界选择的随机性

问题:分箱方法(如KMeans分箱)的结果可能具有随机性。
解决方案:设置随机种子以确保结果可重复,或者多次运行取平均结果。

代码示例:解决部分问题

import numpy as np
import pandas as pd
from sklearn.preprocessing import KBinsDiscretizer
from scipy.stats import chi2_contingency# 等频分箱示例
def quantile_binning(data, num_bins):quantiles = np.percentile(data, np.linspace(0, 100, num_bins + 1))return quantiles# 处理异常值示例
def remove_outliers(data, lower_percentile=0.05, upper_percentile=0.95):lower_bound = np.percentile(data, lower_percentile * 100)upper_bound = np.percentile(data, upper_percentile * 100)return data[(data >= lower_bound) & (data <= upper_bound)]# 动态分箱示例
def dynamic_binning(data, target, num_bins, window_size):bins_list = []for i in range(0, len(data) - window_size + 1, window_size):window_data = data[i:i + window_size]window_target = target[i:i + window_size]bins = quantile_binning(window_data, num_bins)bins_list.append(bins)return bins_list# 示例数据
data = np.array([1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 100])  # 包含异常值
target = np.array([0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1])# 移除异常值
clean_data = remove_outliers(data)# 等频分箱
quantiles = quantile_binning(clean_data, num_bins=4)
print("等频分箱结果:", quantiles)# 动态分箱
bins_list = dynamic_binning(data, target, num_bins=4, window_size=5)
print("动态分箱结果:", bins_list)

更多问题咨询

Cos机器人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/16123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法 经典例题】判断链表是否带环

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;数据结构与算法刷题系列&#xff08;C语言&#xff09; 期待您的关注 目录

渗透测试框架之CobaltStrike,Metasploit域名上线隐藏IP

概述 为什么要隐藏IP 在拿下了目标机之后&#xff0c;目标机在内网里面&#xff0c;使用msf或者CS时&#xff0c;用自己的VPS做服务器的话&#xff0c;导致很容易被溯源。 域名上线原理 当我们访问域名时会经过域名解析 域名解析就是域名到IP地址的转换过程&#xff0c;那么…

头歌传送指令第1关:传送指令 mov

编程要求 根据下方的所给的汇编代码&#xff0c;在右侧编辑器的代码文件的 Begin - End 区域内补充 C 语言代码。 mov %esp,%ebpand $0xfffffff0,%espsub $0x20,%espmovl $0xa,0x18(%esp)mov 0x18(%esp),%eaxmov %eax,0x1c(%esp)mov 0x1c(%esp),%eaxmov %eax,0x8(%esp)mov 0x18…

dubbo复习:(9)配置中心的大坑,并不能像spring cloud那样直接从配置中心读取自定义的配置

配置中心只是为 Dubbo 配置提供管理使用的&#xff08;比如配置服务超时时间等)。不要尝试通过Value类似的方式从dubbo 配置中心(比如nacos、zookeeper、Apollo)来获取数据 https://github.com/apache/dubbo/issues/11200可以在application.yml中主要写注册中心的配置&#xf…

【深度学习基础】NumPy数组库的使用

目录 写在开头 一、数组的类型与维度 数组的类型 数组的维度 二、数组的创建 递增数组 同值数组 随机数数组 三、数组的索引 访问/修改单个元素 花式索引 数组的切片 四、数组的变形 数组的转置 数组的翻转 数组的形状改变 数组的拼接 五、数组的运算 数…

Linux系统启动原理

Linux系统启动原理及故障排除 Centos6系统启动过程 修改系统启动级别 vim /etc/inittabCentos7启动流程 加载BIOS信息&#xff0c;进行硬件检测 根据BIOS设定读取设备中的MBR&#xff0c;加载Boot loader 加载内核&#xff0c;内核初始化以后以模块的形式动态加载硬件 并且加…

FFmpeg的流程

文章目录 前序代码结构FFmpeg.cffmpeg_opt.c 小结 前序 之前看过FFmpeg的各种命令&#xff0c;然后不是很理解。相信很多人都不是很理解&#xff0c;毕竟&#xff0c;单纯的去记住那些命令行本身就需要很大的内存&#xff0c;我们的大脑内存又有限&#xff0c;所以&#xff0c…

java “错误:编码GBK 的不可映射字符”

环境&#xff1a;JDK-17 本机编码&#xff1a;utf-8 代码编码&#xff1a;GBK 错误&#xff1a;java “错误&#xff1a;编码GBK 的不可映射字符” 解决1&#xff1a;记事本打开java源文件&#xff0c;另存为选择ANSI编码 解决2&#xff1a;复制代码再将编码格式改为utf-8,…

内网环境基础

什么是内网渗透? 在得到webshell后下一步渗透就是内网渗透 内网渗透就是拿到企业或者公司的内网权限&#xff0c;然后从内网得到最有价值的战果。 内网渗透和外网渗透有啥区别? 内网渗透&#xff1a;比如公司内部局域网 或者酒店内部局域网等。从内部寻找安全问题 外网渗…

错题本之<数据结构>

已知指针 p 指向单向不循环链表中的某一个节点&#xff0c;且不知道头结点。 问&#xff1a;如何删除 p 指向的节点&#xff1f; 答&#xff1a; 如果 p 指向的不是最后一个节点 定义一个指针 q 保存 p->next; 然后将 q 的数据域和指针域都覆盖到 p 指向的节点中 最后释放 …

java欢迪迈手机商城设计与实现源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的欢迪迈手机商城设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 欢迪迈手机商城…

[emailprotected](10)HOC高阶组件和横切关注点

目录 1&#xff0c;什么是HOC2&#xff0c;什么是横切关注点2.1&#xff0c;简单理解2.2&#xff0c;常见解决方式 3&#xff0c;HOC 举例3.1&#xff0c;全局功能3.2&#xff0c;小范围使用 4&#xff0c;HOC 使用注意点4.1&#xff0c;不要在 render 中使用4.2&#xff0c;不…

spring状态机实战

一、什么是状态机 状态机是有限状态自动机的简称&#xff0c;是现实事物运行规则抽象而成的一个数学模型&#xff0c;是一种概念性机器&#xff0c;它能采取某种操作来响应一个外部事件。这种操作不仅能取决于接收到的事件&#xff0c;还能取决于各个事件的相对发生顺序。状态…

不同网段的通信过程

这里的AA和HH指的是mac地址&#xff0c;上面画的是路由器 底下的这个pc1&#xff0c;或者其他的连接在这里的pc&#xff0c;他们的默认网关就是路由器的这个192.168.1.1/24这个接口 来看看通信的过程 1、先判断&#xff08;和之前一样&#xff09; 2、去查默认网关&#xf…

基于SpringBoot和Hutool工具包实现的验证码案例

目录 验证码案例 1. 需求 2. 准备工作 3. 约定前后端交互接口 需求分析 接口定义 4. Hutool 工具介绍 5. 实现验证码 后端代码 前端代码 6. 运行测试 验证码案例 随着安全性的要求越来越高&#xff0c;目前项目中很多都会使用验证码&#xff0c;只要涉及到登录&…

MySQL Mysqldump备份时的错误提示

MySQL Mysqldump备份时的错误提示 执行mysqldump备份数据库时&#xff0c;命令如下&#xff1a; mysqldump -h8.137.112.148 -udbusername -pdbpassword dbname > /opt/backup_mysql/bkdata/$(date "%Y%m%d%H%M%S")出现以下错误&#xff1a; mysqldump: Could…

Liunx系统中修改文件的创建时间以及访问时间

在Linux系统中&#xff0c;可以使用touch命令来修改文件的时间戳。以下是一些常用的touch命令选项&#xff1a; &#xff08;其实在MacOS中也适用&#xff09; 修改访问时间&#xff08;Access Time&#xff09;和修改时间&#xff08;Modification Time&#xff09;&#xf…

Celery的Web监控工具Flower

1 简介Flower Flower官网 Flower是一个WEB端的监控工具&#xff0c;可以监控Celery的消费者。但是WEB端的监控对于监控系统来说&#xff0c;有个屁用&#xff0c;有用的是监控告警。还好Flower不是全部是垃圾&#xff0c;它提供的Prometheus的监控端点。然而。。。。。如何保证…

CorelCAD v2022.5 解锁版 安装教程(2D制图 3D设计和打印的简化软件)

前言 CorelCAD&#xff0c;加拿大Corel公司开发的一款适用于2D制图、3D设计和打印的简化版CAD软件。它是款专业的2D制图和3D设计软件&#xff0c;拥有行业标准文件兼容性&#xff0c;支持 .DWG、.STL、.PDF、 .CDR*等文件格式&#xff0c;轻松实现协作和项目共享&#xff0c;利…