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 pd

def 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 pd

def 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 pd

def 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.mfbz.cn/a/765557.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CM-UNet: Hybrid CNN-Mamba UNet for Remote Sensing Image Semantic Segmentation

论文&#xff1a;CM-UNet: Hybrid &#xff1a;CNN-Mamba UNet for Remote Sensing Image Semantic Segmentation 代码&#xff1a;https://github.com/XiaoBuL/CM-UNet Abstrcat: 由于大规模图像尺寸和对象变化&#xff0c;当前基于 CNN 和 Transformer 的遥感图像语义分割方…

TongRDS2214手动部署版指引(by lqw+sy)

文章目录 前言准备工作单机版集群版哨兵版多个中心节点配置 前言 由于一些特殊原因&#xff08;例如服务器没有联网&#xff0c;没有办法直接更新和下载unzip指令&#xff0c;从而导致控制台版本安装节点之后&#xff0c;会报file not found的错误&#xff0c;或者使用不了rds…

【Flutter】列表流畅性优化

前言 在日常APP的开发中&#xff0c;列表是使用频率最高的&#xff0c;这里讲述在Flutter中优化列表的滑动速度与流畅度&#xff0c;以来提高用户的体验。 方案 1、使用ListView.builder代替ListView ListView.builder在创建列表的时候要比ListView更高效&#xff0c;因为L…

Pyramid 中混合认证策略

1. 问题背景 在一个使用 Pyramid 框架开发的应用程序中&#xff0c;需要同时处理 HTML 内容的显示和 JSON API 的请求。对于 HTML 内容&#xff0c;使用了 AuthTktAuthenticationPolicy 进行身份验证和 ACLAuthorizationPolicy 进行授权。当用户成功登录后&#xff0c;会在浏览…

sql拉链表

1、定义&#xff1a;维护历史状态以及最新数据的一种表 2、使用场景 1、有一些表的数据量很大&#xff0c;比如一张用户表&#xff0c;大约1亿条记录&#xff0c;50个字段&#xff0c;这种表 2.表中的部分字段会被update更新操作&#xff0c;如用户联系方式&#xff0c;产品的…

【哈尔滨二级等保测评需要测哪些指标】

为了保证系统的安全性、稳定性和遵从性&#xff0c;哈尔滨二级等保评估要求对评估指标进行全面的评估。下面就是对哈尔滨等保二级考核所需要的考核指标的具体说明&#xff0c;并按各个维度分点表达与总结&#xff1a; 一、物理安全要求 物理安全是信息系统的根本&#xff0c;…

kubeadm kubectl kubelet区别

kubeadm kubeadm 是一个方便易用的 Kubernetes 工具&#xff0c;能够部署生产级别的 Kubernetes 集群kubeadm 还具有了和 minikube 一样的易用性&#xff0c;只要很少的几条命令&#xff0c;如 init、join、upgrade、reset 就能够完成 Kubernetes 集群的管理维护工作&#xff…

简述设计模式-工厂模式

概述 工厂模式是为了提供创建对象的方式&#xff0c;无需制定要创建的具体类。 举个例子&#xff0c;假如我是甲方需要制造一辆车&#xff0c;我可以要油车&#xff0c;可以要电车&#xff0c;也可以油电混动车&#xff0c;如果没有工厂&#xff0c;我需要自己找到对应的制造…

免费可视化工具如何提升智慧物流管理效率

在现代智慧物流中&#xff0c;免费可视化工具正扮演着越来越重要的角色。这些工具通过数据的可视化展示&#xff0c;使物流管理更加高效、透明和智能化。免费可视化工具可以将复杂的物流数据转换为直观的图表和图形&#xff0c;帮助管理者实时监控和分析物流运作情况&#xff0…

贪心+后缀和,CF 1903C - Theofanis‘ Nightmare

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1903C - Theofanis Nightmare 二、解题报告 1、思路分析 我们任意一种分组其实都是若干个后缀和相加 比如我们分成了三组&#xff0c;第一组的数被加了一次&#xff0c;第二组的数被加了两次&#xff0c;第…

解锁IDEA中Git/SVN Issue Navigation功能:80%程序员都不懂的秘密武器~

文章目录 前言什么是 Git Issue Navigation&#xff1f;配置 Git Issue Navigation1. 打开设置2. 导航到 Issue Navigation 设置3. 添加新的 Issue Navigation 规则具体示例配置 使用 Git Issue Navigation在提交信息中使用 Issue ID实际导航到连接 优点1. 快速定位问题2. 提高…

消防认证-防火卷帘

一、消防认证 消防认证是指消防产品符合国家相关技术要求和标准&#xff0c;且通过了国家认证认可监督管理委员会审批&#xff0c;获得消防认证资质的认证机构颁发的证书&#xff0c;消防产品具有完好的防火功能&#xff0c;是住房和城乡建设领域验收的重要指标。 二、认证依据…

【UE 网络】专用服务器和多个客户端加入游戏会话的过程,以及GameMode、PlayerController、Pawn的创建流程

目录 0 引言1 多人游戏会话1.1 Why&#xff1f;为什么要有这个1.2 How&#xff1f;怎么使用&#xff1f; 2 加入游戏会话的流程总结 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x1f4a5; 标题&#xff1a;【UE 网络】在网络…

西南交通大学【算法分析与设计实验1】

实验1.4 有向图拓扑排序 实验目的 &#xff08;1&#xff09;掌握算法的自然语言描述法&#xff0c;流程图绘制方法以及伪代码描述方法。 &#xff08;2&#xff09;理解算法的执行过程。 &#xff08;3&#xff09;掌握算法的编程实现方法、调试方法及测试方法。 实验任务…

AcWing 1256:扩展二叉树

【题目来源】https://www.acwing.com/problem/content/1258/【题目描述】 由于先序、中序和后序序列中的任一个都不能唯一确定一棵二叉树&#xff0c;所以对二叉树做如下处理&#xff0c;将二叉树的空结点用 补齐&#xff0c;如图所示。 我们把这样处理后的二叉树称为原二叉树…

智谱AI: ChatGLM API的使用

一、获取API 1、打开网址&#xff1a;智谱AI开放平台 注册账号登录 2、登录&#xff0c;查看API key (注册后赠送100万token&#xff0c;实名认证后多赠送400万, 有效期一个) 二、安装及调用 安装质谱SDK pip install zhipuai调用方式 流式调用 from zhipuai import ZhipuA…

Vulkan学习——渲染3D模型

摘要&#xff1a;本文简要描述了Vulkan渲染一个3D模型需要做的事情&#xff0c;不会对太细节的内容进行深究。   关键字&#xff1a;Vulkan,Render,3D 源码 1 简介 1.1 Vulkan简介 Vulkan是一个低开销、跨平台的二维、三维图形与计算的应用程序接口&#xff08;API&#x…

鸿蒙开发Ability Kit(程序访问控制):【使用粘贴控件】

使用粘贴控件 粘贴控件是一种特殊的系统安全控件&#xff0c;它允许应用在用户的授权下无提示地读取剪贴板数据。 在应用集成粘贴控件后&#xff0c;用户点击该控件&#xff0c;应用读取剪贴板数据时不会弹窗提示。可以用于任何应用需要读取剪贴板的场景&#xff0c;避免弹窗…

基于MATLAB对线阵天线进行泰勒加权

相控阵天线——基于MATLAB对线阵进行泰勒加权 目录 前言 一、泰勒综合 二、单元间距的改变对泰勒阵列方向图的影响 三、单元数的改变对泰勒阵列激励分布的影响 四、副瓣电平SLL对泰勒阵列激励幅度的影响 五、副瓣电平SLL对泰勒阵列方向图的影响 六、泰勒阵列和切比雪夫阵…

Qt Creator13配置Android开发环境

QT Creator13是目前&#xff08;2024年&#xff09;最新版本&#xff0c;配置Android开发环境有一些不一样&#xff0c;走了一些弯路&#xff0c;记录如下。 1、安装JDK和SDK 下载安装JDK和SDK&#xff0c;建议安装在无空格和中文字符的目录下。 具体安装步骤不再赘述&#…