Python特征工程 — 1.2 特征分箱

目录

1 什么是特征分箱

2 分箱的重要性及其优势

3 有监督分箱

3.1卡方分箱原理

3.2 决策树分箱

4 无监督分箱

4.1 等距分箱

4.2 等频分箱

4.3 分位数分箱


实验数据:链接:https://pan.baidu.com/s/1yT1ct_ZM5uFLgcYsaBxnHg?pwd=czum  提取码:czum 

实验数据介绍:参考文章1.2节(数据介绍链接)

1 什么是特征分箱

特征分箱(Feature Binning)是一种数据预处理技术,主要用于将连续特征(或密集离散特征)转换为离散特征,可以提高模型的性能。

目的:特征分箱的目的是将连续(或密集离散)变量的值范围划分为多个区间(或“箱子”),并将这些区间映射到离散的类别或标签上。

原因:连续(或密集离散)变量可能包含非线性关系或复杂的模式,这些模式对于某些机器学习算法来说可能难以捕捉。通过分箱,我们可以将这些复杂的连续变量(或密集离散)简化为更易于模型处理的离散变量。

例如,我们有一组关于人年龄的数据,如下图所示:

现在希望将他们的年龄分组到更少的间隔中,可以通过设置一些条件来实现:

2 分箱的重要性及其优势

一般在建立分类模型时,需要对连续变量离散化,特征离散化后,模型会更稳定,降低了模型过拟合的风险。分箱的有以下重要性及其优势:

  • 易于迭代:离散化特征的增加和减少都很容易,便于模型快速迭代优化。
  • 计算效率:稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
  • 鲁棒性强:离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个少见数据“年龄120岁”会给模型造成很大的干扰;
  • 特征交叉:离散化后可进行特征交叉,进一步增加非线性,提高模型的表达力。
  • 简化模型:降低过拟合风险,同时允许将缺失值视为独立类别,统一变量尺度。

3 有监督分箱

3.1卡方分箱原理

卡方分箱概念

卡方分箱(ChiMerge)是一种基于统计学原理的特征离散化方法,它依赖于卡方检验来评估相邻区间的类分布是否相似。如果两个相邻区间的类分布相似,则可以合并这些区间;如果不同,则应保持分开。卡方分箱的基本思想是在精确的离散化中,一个区间内的相对类频率应当完全一致。

卡方分布

为了更好地理解卡方分箱,我们先来看下卡方分布。卡方分布(Chi-square Distribution)是概率论与统计学中常用的一种概率分布,也是统计推断里应用最广泛的概率分布之一。卡方分布的定义基于标准正态分布,其数学定义如下:

若k个独立的随机变量Z1、Z2、……、Zk满足标准正态分布N(0,1),则这k个随机变量的平方和

服从自由度为k的卡方分布,记作:

卡方检验

卡方检验是以卡方分布为基础的一种假设检验方法。主要用于比较观察值和期望值之间是否存在差异。这种方法特别适用于分类数据,如性别、教育水平等。

其基本思想是根据样本数据推断总体的分布与期望分布是否有显著差异,或者推断两个分类变量是否相关或者独立。一般可以设原假设为:观察频数和期望频数没有差异,或者两个变量相互独立不相关,即该因素不会影响到目标变量。

实际应用中,我们先假设原假设成立,计算出卡方值,卡方值的计算公式为:

其中,A为实际频数,E为期望频数。

该假设计算出卡方值,它表示观察值与理论值之间的偏离程度。根据卡方分布及自由度可以确定在原假设成立的情况下获得当前统计量及更极端情况的概率P。

其中第一列对应自由度,红框中对应P值,不同自由度和P值对应的是卡方值。可以发现相同自由度下,卡方值越大,P值越小。反过来,如果P值越小,则卡方值越大,说明观察值与理论值偏离程度太大,应当拒绝原假设。

卡方分箱的基本思想在于,对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并,否则,它们应当保持分开。

卡方分箱步骤

(1) 初始分箱:将连续变量的值范围分成多个初始的区间(箱子)。可以基于等宽(每个箱子的值范围相同)或等频(每个箱子的样本数量大致相同)。

(2) 计算卡方统计量:使用以下公式计算卡方统计量,以评估箱子之间的独立性:

其中,A为实际频数,E为期望频数。

(3) 合并箱子:选择具有最小卡方统计量的箱子对进行合并。对于每一对相邻箱子,如果它们的卡方统计量小于某个阈值(基于p值),则认为这两个箱子在目标变量的分布上没有显著差异,可以合并。

(4) 迭代过程:重复步骤2到3,直到满足终止条件,如达到预定的箱子数量或无法进一步合并。

3.2 决策树分箱

决策树分箱通过评估不同的分割点来寻找最优的分箱边界,从而使得每个箱内的数据在目标变量上尽可能地同质。通过这种方式,决策树能够学习到数据中的复杂模式,并在分类或回归任务中提高模型的预测准确性。

在决策树分箱过程中,算法会遍历数据集中的所有特征,并尝试在每个特征上进行分割,以减少节点的不纯度。不纯度的度量可以基于信息熵或基尼不纯度等指标。算法递归地选择最优的分割点,直到满足停止条件,如达到预设的最大树深度或节点中的样本数量低于某个阈值。这种方法不仅提高了模型的泛化能力,还增强了模型的可解释性,因为分箱后的特征更容易被人类理解和解释。

4 无监督分箱

4.1 等距分箱

等距分箱(Equal-width binning)是一种简单的分箱技术,它将数据范围划分为若干个等宽的区间。等距分箱通常用于数据可视化和预处理,尤其是在数据分布比较均匀时。

import pandas as pddef equal_width_binning(df, column_name, num_bins, print_info=True):"""对指定的列进行等距分箱,并可选择打印分箱信息。参数:df : pd.DataFrame,输入的DataFrame。column_name : str,要分箱的列名。num_bins : int,箱的数量。print_info : bool, optional,是否打印分箱信息,默认为True。返回:pd.DataFrame包含原始数据和分箱结果的新DataFrame。"""# 检查列是否存在于DataFrame中if column_name not in df.columns:raise ValueError(f"Column '{column_name}' does not exist in the DataFrame.")# 检查箱的数量是否为正数if num_bins <= 0:raise ValueError("Number of bins must be a positive integer.")# 计算箱宽bin_width = (df[column_name].max() - df[column_name].min()) / num_bins# 创建箱边界bins = [df[column_name].min() + i * bin_width for i in range(num_bins + 1)]# 打印分箱信息if print_info:print(f"Column: {column_name}")print(f"Number of bins: {num_bins}")print(f"Bin width: {bin_width:.2f}")print("Bin edges:")print(bins)# 将数据分到箱中binned_column_name = f"{column_name}_binned"df[binned_column_name] = pd.cut(df[column_name], bins=bins, right=True)return df
# 示例用法
# 假设df是您的DataFrame,'feature_column'是您要分箱的特征列名
df_binned = equal_width_binning(data, 'Age', num_bins=5)
df_binned

 对数据的‘Age’进行等距分段,运行的结果如下:

4.2 等频分箱

等频分箱(Equal-frequency binning)是一种将数据分为具有相同或几乎相同数据点数量的箱的技术。这种方法确保每个箱内的数据点数量大致相等,而不是箱的大小(宽度或范围)相等。等频分箱对于数据的分布不均匀或有极端值时特别有用。

import pandas as pddef equal_frequency_binning(df, column_name, num_bins, print_info=True):"""对指定的列进行等频分箱,并可选择打印分箱信息。参数:df : pd.DataFrame,输入的DataFrame。column_name : str,要分箱的列名。num_bins : int,箱的数量。print_info : bool, optional,是否打印分箱信息,默认为True。 返回:pd.DataFrame,包含原始数据和分箱结果的新DataFrame。"""# 参数检查if column_name not in df.columns:raise ValueError(f"Column '{column_name}' does not exist in the DataFrame.")if num_bins <= 0:raise ValueError("Number of bins must be a positive integer.")# 对数据进行排序df_sorted = df.sort_values(by=column_name)# 计算每个箱的大致数据点数量bin_size = len(df) // num_bins# 确定箱边界bins = [df_sorted[column_name].min()]  # 包括最小值for i in range(1, num_bins):bin_bound = df_sorted.iloc[i * bin_size - 1][column_name]bins.append(bin_bound)  # 包括最大值bins.append(df_sorted[column_name].max())  # 包括最大值# 打印分箱信息if print_info:print(f"Column: {column_name}")print(f"Number of bins: {num_bins}")print("Bin edges:")for i, bin_edge in enumerate(bins[:-1]):print(f"Bin {i}: x <= {bin_edge}")print(f"Bin {num_bins - 1}: x > {bins[-2]}")print("Bin centers and counts:")for i in range(num_bins):center = df_sorted.iloc[(i * bin_size + (i + 1) * bin_size) // 2][column_name]count = len(df_sorted[(df_sorted[column_name] > bins[i]) & (df_sorted[column_name] <= bins[i + 1])])print(f"Bin {i} center: {center}, count: {count}")# 将数据分到箱中df[f'{column_name}_binned'] = pd.cut(df[column_name], bins=bins, right=True, labels=range(num_bins))return df
# 示例用法
# 假设df是您的DataFrame,'feature_column'是要分箱的特征列名
df_binned = equal_frequency_binning(data, 'Age', num_bins=5)
df_binned

 对数据的‘Age’进行等距分段,运行的结果如下,可也看到不同区间有大致相同的数量:

4.3 分位数分箱

分位数分箱(Quantile Binning)是一种基于数据分布的分箱技术,它利用数据的分位数来确定分箱边界。这种方法可以确保每个箱内的数据点具有相似的累积概率,从而使得每个箱在统计上是相似的。分位数分箱对于处理具有偏态分布的数据特别有用。

import pandas as pddef quantile_binning(df, column_name, num_bins, print_info=True):"""对指定的列进行分位数分箱,并可选择打印分位数信息。参数:df : pd.DataFrame,输入的DataFrame。column_name : str,要分箱的列名。num_bins : int,箱的数量。print_info : bool, optional,是否打印分位数信息,默认为True。返回:pd.DataFrame,包含原始数据和分箱结果的新DataFrame。"""# 参数检查if column_name not in df.columns:raise ValueError(f"Column '{column_name}' does not exist in the DataFrame.")if num_bins <= 1:raise ValueError("Number of bins must be greater than 1.")# 计算分位数quantiles = df[column_name].quantile([(i + 1) / num_bins for i in range(num_bins - 1)])# 确定箱边界bins = [df[column_name].min()] + quantiles.tolist() + [df[column_name].max()]# 打印分位数信息if print_info:print(f"Column: {column_name}")print(f"Number of bins: {num_bins}")print("Quantile cuts:")for i, quantile in enumerate(quantiles, start=1):print(f"Quantile {i}/{num_bins}: {quantile}")# 将数据分到箱中df[f'{column_name}_binned'] = pd.cut(df[column_name], bins=bins, right=True, labels=range(num_bins))return df
# 示例用法
# 假设df是您的DataFrame,'feature_column'是您要分箱的特征列名
df_binned = quantile_binning(data, 'Age', num_bins=5)

 对数据的‘Age’进行等距分段,运行的结果如下,可也看到不同分位数下的分段点:

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

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

相关文章

大数据可视化实验(八):大数据可视化综合实训

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1&#xff09;Python纵向柱状图实训... 1 2&#xff09;Python水平柱状图实训... 3 3&#xff09;Python多数据并列柱状图实训.. 3 4&#xff09;Python折线图实训... 4 5&#xff09;Python直方图实训...…

Echarts-仪表盘

1.案例一 1.1代码 option {"series": [{"type": "gauge", "startAngle": 180, "endAngle": 0, "min": 0, "max": 100, "radius": "100%","center": ["50%"…

linux下安装kkFileView4

kkFileView为文件文档在线预览解决方案&#xff0c;该项目使用流行的spring boot搭建&#xff0c;易上手和部署&#xff0c;基本支持主流办公文档的在线预览&#xff0c;如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 安装kkFileView前需要安装LibreOffic…

复制 pdf 的表格到 markdown 版本的Typora 或者 word 中

在 pdf 中选中复制表格内容&#xff0c;直接粘贴到 typora 中失败&#xff0c;可以使用 txt文件和 excel 做过渡。 准备一个空的 txt 文件&#xff0c;将 pdf 中表格的数据复制粘贴到txt文件中&#xff0c;文本内容会以空格分开&#xff0c;如下图的形式&#xff1a; 打开 exc…

深入学习 Kafka(2)- Partition 和 Topic

1. Partition的作用 Topic是逻辑的概念&#xff0c;Partition是物理的概念&#xff1a; Partition 对一个 Topic 的消息进行物理上的分离&#xff0c;让消息可以分布在不同的实体机器上&#xff0c;可以提升系统吞吐量和并行处理能力。每个Partition可以有多个副本&#xff08…

Windows 获取打印机及端口号方法 (C#)

1. 打开注册表编辑器 regedit 2.选择如下配置 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Device 其中 “Ne01:” 为端口号 3. 代码 C# using System; using Microsoft.Win32;class Program {static void Main(){string registryPath "SOF…

【C语言】分支(选择)和循环语句

目录 简述选择语句简述if语句单if结构语法格式 if-else结构语法结构 语法结构 循环结构break和continuewhile循环语法结构 for循环语法结构 do while循环语法结构 简述 在c语言中分支和循环语句是极其重要的&#xff0c;就像生活中你难免要做一些判断和循环往复做一些事。 选…

静态IP代理:保障网络稳定的核心技术

静态IP代理作为一种重要的网络工具&#xff0c;因其稳定性和持久性&#xff0c;受到越来越多用户的青睐。本文将深入探讨静态IP代理的定义和优势。 静态IP代理是什么&#xff1f; 静态IP代理是指在代理服务器中分配一个固定的IP地址&#xff0c;用户在使用过程中始终使用同一个…

【CSS in Depth 2 精译】2.2 em 和 rem + 2.2.1 使用 em 定义字号

当前内容所在位置 第一章 层叠、优先级与继承第二章 相对单位 2.1 相对单位的威力 2.1.1 响应式设计的兴起 2.2 em 与 rem ✔️ 2.2.1 使用 em 定义字号 ✔️2.2.2 使用 rem 设置字号 2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 2.…

linux和mysql基础指令

Linux中nano和vim读可以打开记事文件。 ifdown ens33 ifup ens33 关闭&#xff0c;开启网络 rm -r lesson1 gcc -o code1 code1.c 编译c语言代码 ./code1 执行c语言代码 rm -r dir 删除文件夹 mysql> show databases-> ^C mysql> show databases; -------…

面对全球新能源汽车合作发展创维汽车如何实现共赢

由全球新能源汽车合作组织(筹)主办、中国电动汽车百人会承办的首届全球新能源汽车合作发展论坛(GNEV2024)于6月27日&#xff0c;6月28日在新加坡金沙会议展览中心召开。创维汽车国际营销公司总经理齐奎源受邀参会并作出分享。 本届大会以推动全球新能源汽车产业协同发展与合作…

RK3568平台(USB篇)USB HID设备

一.USB HID设备简介 USB HID设备主要用于和计算机进行交互通信&#xff0c;典型的USB HID类设备包括USB键盘、USB鼠标、USB游戏手柄等等&#xff0c;这些都是日常生活中常见的设备。以USB接口的鼠标为例&#xff0c;打开计算机的“设备管理器”&#xff0c;可以在“鼠标和其他…

设计高并发秒杀系统:保障稳定性与数据一致性

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. 系统架构设计 1. 系统架构图 二、 系统流程 三…

简单实现Anaconda/Miniforge虚拟环境的克隆和迁移

简单实现Anaconda/Miniforge虚拟环境的克隆和迁移 一、问题描述一、方式一&#xff1a;使用命令克隆二、方式二&#xff1a;直接复制粘贴 欢迎学习交流&#xff01; 邮箱&#xff1a; z…1…6.com 网站&#xff1a; https://zephyrhours.github.io/ 一、问题描述 使用Anaconda…

昇思25天学习打卡营第7天|Pix2Pix实现图像转换

文章目录 昇思MindSpore应用实践基于MindSpore的Pix2Pix图像转换1、Pix2Pix 概述2、U-Net架构定义UNet Skip Connection Block 2、生成器部分3、基于PatchGAN的判别器4、Pix2Pix的生成器和判别器初始化5、模型训练6、模型推理 Reference 昇思MindSpore应用实践 本系列文章主要…

无忧易售升级:产品视频翻译支持,拓宽全球市场边界

在电商内容营销迈入视频时代的今天&#xff0c;无忧易售ERP推出针对OZON、Wish、TikTok、Wildberries&#xff08;野莓&#xff09;四大平台的产品视频翻译功能&#xff0c;彻底打破语言壁垒&#xff0c;让全球卖家的商品故事&#xff0c;以更生动、更直观的方式&#xff0c;触…

Linux指定文件权限的两种方式-符号与八进制数方式示例

一、指定文件权限可用的两种方式&#xff1a; 对于八进制数指定的方式&#xff0c;文件权限字符代表的有效位设为‘1’&#xff0c;即“rw-”、“rw-”、“r--”&#xff0c;以二进制表示为“110”、“110”、“100”&#xff0c;再转换为八进制6、6、4&#xff0c;所以777代表…

如何寻找一个领域的顶级会议,并且判断这个会议的影响力?

如何寻找一个领域的顶级会议&#xff0c;并且判断这个会议的影响力&#xff1f; 会议之眼 快讯 很多同学都在问&#xff1a;学术会议不是期刊&#xff0c;即使被SCI检索&#xff0c;也无法查询影响因子。那么如何知道各个领域的顶级会议&#xff0c;并对各个会议有初步了解呢…

Redis主从复制、哨兵以及Cluster集群

目录 1.Redis高可用 2.Redis主从复制 2.1 主从复制的作用 2.2 主从复制流程 2.3 搭建Redis 主从复制 ​3.Redis哨兵模式 3.1 哨兵模式概述 3.2 哨兵模式的作用 3.3 故障转移机制 ​3.4 主节点的选举 3.5 搭建Redis哨兵模式 4. Redis 群集模式 4.1 Redis集群的数据分…

VS2022+Qt+OpenCV Debug模式下,循环中格式转换引起的内存异常问题 debug_heap.cpp

文章目录 前言一、问题二、报错1.提示图片2.提示堆栈3.反汇编位置 三、解决办法总结 前言 最近在使用VS2022&#xff0c;C&#xff0c;OpenCV&#xff0c;Qt开发时&#xff0c;遇到了一个疑难杂症-在循环中执行字符串格式转换会触发内存异常&#xff0c;经过痛苦的排查过程&am…