sklearn 数据预处理中的离散化(Discretization)

离散化是将连续型数值特征转换为离散区间(分箱/bins)的过程,常用于简化模型、增强鲁棒性、处理非线性关系或满足某些算法对离散输入的要求(如朴素贝叶斯、决策树等)。sklearn 提供了两种主要的离散化方法:等宽分箱(KBinsDiscretizer)等频分箱(使用 pd.qcut 等,但 sklearn 本身主要提供 KBinsDiscretizer)


核心思想

  • 离散化(Binning / Quantization):将连续变量的值域划分为若干个区间(称为“箱”或“bin”),然后用箱的索引或标签代替原始值。
  • 目的
    • 降低噪声影响。
    • 简化数据分布。
    • 转换非线性关系为线性可分形式。
    • 适配只能处理离散特征的模型。

常用函数或类

1.sklearn.preprocessing.KBinsDiscretizer(K-bins离散化)

这是 sklearn 中用于离散化的主要类。

参数说明

参数类型默认值说明
n_binsint 或 array-like, shape (n_features,)5每个特征的分箱数量。若为整数,则所有特征使用相同箱数;若为数组,则分别指定每个特征的箱数。
encode{‘onehot’, ‘onehot-dense’, ‘ordinal’}‘onehot’编码方式:
- 'ordinal': 返回每个样本所属箱的整数索引(0 到 n_bins-1)
- 'onehot': 返回稀疏矩阵形式的独热编码
- 'onehot-dense': 返回稠密矩阵形式的独热编码
strategy{‘uniform’, ‘quantile’, ‘kmeans’}‘quantile’分箱策略:
- 'uniform': 等宽分箱(每个箱宽度相同)
- 'quantile': 等频分箱(每个箱样本数大致相同)
- 'kmeans': 使用一维 K-Means 聚类确定箱边界

属性(训练后可用)

属性说明
bin_edges_list of arrays, 每个特征的分箱边界(包含左右端点)
n_bins_实际每个特征使用的箱数(可能因数据分布调整)

返回值

  • fit_transform(X)transform(X) 返回:
    • encode='ordinal'ndarray,形状 (n_samples, n_features),值为箱索引(从0开始)
    • encode='onehot'scipy.sparse.csr_matrix
    • encode='onehot-dense'ndarray,形状 (n_samples, n_features * n_bins)

简单示例代码

from sklearn.preprocessing import KBinsDiscretizer
import numpy as np# 生成示例数据
X = np.array([[1.2], [2.5], [3.7], [4.1], [5.8], [6.3], [7.9], [8.2], [9.6], [10.0]])print("原始数据:")
print(X.ravel())# 创建离散化器:3个箱,等宽策略,序数编码
discretizer = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')# 拟合并转换
X_discretized = discretizer.fit_transform(X)print("\n离散化后(ordinal编码):")
print(X_discretized.ravel().astype(int))# 查看分箱边界
print("\n分箱边界:")
for i, edges in enumerate(discretizer.bin_edges_):print(f"特征 {i}: {edges}")# 使用 onehot-dense 编码
discretizer_onehot = KBinsDiscretizer(n_bins=3, encode='onehot-dense', strategy='uniform')
X_onehot = discretizer_onehot.fit_transform(X)print("\n离散化后(onehot-dense编码):")
print(X_onehot)

输出示例:

原始数据:
[ 1.2  2.5  3.7  4.1  5.8  6.3  7.9  8.2  9.6 10. ]离散化后(ordinal编码):
[0 0 0 1 1 1 2 2 2 2]分箱边界:
特征 0: [ 1.2  4.   6.8 10. ]离散化后(onehot-dense编码):
[[1. 0. 0.][1. 0. 0.][1. 0. 0.][0. 1. 0.][0. 1. 0.][0. 1. 0.][0. 0. 1.][0. 0. 1.][0. 0. 1.][0. 0. 1.]]

注意事项

  • 数据分布影响:strategy=‘uniform’ 对异常值敏感;‘quantile’ 更鲁棒。
  • 边界处理:边界值默认归入右侧箱(左闭右开),但最大值归入最后一个箱。
  • 新数据转换:使用训练好的 discretizer.transform(X_new),超出训练范围的值会被分配到最近的箱(首箱或末箱)。
  • 特征维度:支持多维特征,每个特征独立分箱。

应用场景

  • 与朴素贝叶斯结合(要求离散特征)
  • 减少过拟合(尤其在小数据集)
  • 特征工程中构造分段线性模型
  • 数据可视化分组统计

离散化是特征工程中强大而实用的技术,合理使用可显著提升模型性能与解释性。

2.sklearn.preprocessing.Binarizer(Binarization 特征二值化)

🎯 核心思想

Binarizer 的核心思想是将数值型特征根据指定阈值(threshold)转换为二进制形式(0 或 1)

  • 大于阈值 → 1
  • 小于等于阈值 → 0

这是一种无监督、无状态的离散化方法,不依赖数据分布,仅根据预设阈值进行硬划分。常用于:

  • 文本处理中将词频/TF-IDF 转换为“是否出现”
  • 图像像素二值化(黑白化)
  • 简化连续特征为布尔特征

⚙️ 参数详解

参数名类型默认值说明
thresholdfloat0.0二值化阈值。当特征值 > threshold 时输出 1,否则输出 0。
copyboolTrue是否复制输入数据。若设为 False,则尝试原地修改(仅当输入为 NumPy 数组且 dtype 兼容时有效)。

💡 注意:Binarizer无状态转换器(stateless transformer) —— 它不从数据中学习任何参数,.fit() 方法仅用于接口兼容,不执行任何计算。


🧰 主要方法

方法说明
fit(X[, y])什么都不做,直接返回 self。用于兼容 sklearn 的 fit/transform 接口。
transform(X)对输入 X 执行二值化操作,返回二值化后的数组或稀疏矩阵。
fit_transform(X)等价于 .fit(X).transform(X),直接返回二值化结果。

📦 返回值

  • 类型:与输入 X 类型一致(NumPy 数组或 scipy 稀疏矩阵)
  • 形状:与输入 X 形状相同 (n_samples, n_features)
  • 元素值0.01.0(dtype 通常为 float64,除非输入是整型且 copy=False
  • 稀疏性:若输入是稀疏矩阵,输出也保持稀疏格式(节省内存)

🧪 简单示例代码

from sklearn.preprocessing import Binarizer
import numpy as np# 示例数据:3个样本,4个特征
X = np.array([[2.1, -1.5, 0.0, 3.3],[0.5, 4.0, -2.2, 1.1],[-0.3, 0.8, 1.7, -0.9]
])print("原始数据 X:")
print(X)
print("数据类型:", X.dtype)# 创建 Binarizer 实例,阈值设为 1.0
binarizer = Binarizer(threshold=1.0)# 执行二值化
X_binary = binarizer.fit_transform(X)print("\n二值化后(threshold=1.0):")
print(X_binary)
print("数据类型:", X_binary.dtype)

输出示例:

原始数据 X:
[[ 2.1 -1.5  0.   3.3][ 0.5  4.  -2.2  1.1][-0.3  0.8  1.7 -0.9]]
数据类型: float64二值化后(threshold=1.0:
[[1. 0. 0. 1.][0. 1. 0. 1.][0. 0. 1. 0.]]
数据类型: float64

📚 实际应用场景:文本二值化

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import Binarizercorpus = ["apple banana apple","banana cherry","apple cherry banana"
]# 生成词频矩阵
vectorizer = CountVectorizer()
X_counts = vectorizer.fit_transform(corpus)
print("词频矩阵:")
print(X_counts.toarray())# 二值化:只关心词是否出现(>0 即为1)
binarizer = Binarizer(threshold=0)
X_binary = binarizer.fit_transform(X_counts)
print("\n二值化矩阵(是否出现):")
print(X_binary.toarray())

✅ 输出:

词频矩阵:
[[2 1 0][0 1 1][1 1 1]]二值化矩阵(是否出现):
[[1 1 0][0 1 1][1 1 1]]

⚠️ 注意事项

  • 阈值选择很重要:例如图像常用 127(0~255),文本常用 0。
  • 支持稀疏矩阵:对大型稀疏数据(如文本)非常高效。
  • Pipeline 友好:可无缝集成到 sklearn Pipeline 中。
  • 无状态性:可在训练集和测试集上直接使用,无需“学习”。

✅ 总结

Binarizer 是一个轻量、高效、无状态的特征二值化工具,适用于需要将连续值简化为布尔值的场景。其核心是阈值判断,使用简单,性能优异,是 sklearn 预处理工具箱中的实用组件。

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

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

相关文章

PTA算法简析

ArkAnalyzer源码初步分析I:https://blog.csdn.net/2302_80118884/article/details/151627341?spm1001.2014.3001.5501 首先,我们必须明确 PTA 的核心工作:它不再关心变量的“声明类型”,而是为程序中的每一个变量和每一个对象字段…

Vue 3 中监听多个数据变化的几种方法

1. 使用 watch监听多个 ref/reactive 数据import { ref, watch } from vueexport default {setup() {const count ref(0)const name ref()const user reactive({ age: 20 })// 监听多个数据源watch([count, name, () > user.age], // 数组形式传入多个数据源([newCount, …

第 2 篇:Java 入门实战(JDK8 版)—— 编写第一个 Java 程序,理解基础运行逻辑

用 IntelliJ IDEA 写第一个 Java 8 程序:Hello World 实操指南 作为 Java 初学者,“Hello World” 是你接触这门语言的第一个里程碑。本文会聚焦 Java 8(经典 LTS 版本,企业级开发常用) 和 IntelliJ IDEA(当…

【GPT入门】第67课 多模态模型实践: 本地部署文生视频模型和图片推理模型

【GPT入门】第67课 多模态模型实践: 本地部署文生视频模型和图片推理模型1. 文生视频模型CogVideoX-5b 本地部署1.1 模型介绍1.2 环境安装1.3 模型下载1.4 测试2.ollama部署图片推理模型 llama3.2-vision2.1 模型介绍2.2 安装ollama2.3 下载模型2.4 测试模型2.5 测试…

C++初阶(6)类和对象(下)

1. 再谈构造函数(构造函数的2个深入使用技巧) 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 虽然上述构造函数调用之后,对象中已经有了一个初始值,…

容器文件描述符热迁移在云服务器高可用架构的实施标准

在云计算环境中,容器文件描述符热迁移技术正成为保障业务连续性的关键解决方案。本文将深入解析该技术在云服务器高可用架构中的实施标准,涵盖技术原理、实现路径、性能优化等核心维度,为构建稳定可靠的容器化基础设施提供系统化指导。 容器文…

毫米波雷达液位计如何远程监控水位?

引言毫米波雷达液位计作为一种高精度、非接触式的水位监测设备,正逐渐成为智慧水务、环境监测等领域的关键工具。其通过先进的调频连续波(FMCW)技术,实现5mm的测量精度,并支持多种远程通信方式,使用户能够实…

关于 C++ 编程语言常见问题及技术要点的说明

关于 C 编程语言常见问题及技术要点的说明C 作为一门兼具高效性与灵活性的静态编译型编程语言,自 1985 年正式发布以来,始终在系统开发、游戏引擎、嵌入式设备、高性能计算等领域占据核心地位。随着 C 标准(如 C11、C17、C20)的持…

【Qt QSS样式设置】

Qt中的QSS样式设置流程 Qt Style Sheets (QSS) 是Qt框架中用于自定义控件外观的样式表语言,其语法类似于CSS。以下是QSS的设置流程和示例。 QSS设置流程 1. 创建QSS样式表文件或字符串 首先,需要创建QSS样式表,可以是一个单独的.qss文件&…

使用 Apollo TransformWrapper 生成相机到各坐标系的变换矩阵

使用 Apollo TransformWrapper 生成相机到各坐标系的变换矩阵一、背景二、原理1、什么是变换矩阵?2、为什么需要变换矩阵?3、Apollo 中的坐标系4、Apollo TransformWrapper三、操作步骤1. 设置车辆参数2. 启动静态变换发布3. 查看变换信息4. 播放记录数据…

硬件(十)IMX6ULL 中断与时钟配置

一、OCP 原则(开闭原则)对代码扩展是开放的,允许通过新增代码来扩展功能;对代码的修改是关闭的,尽量避免直接修改已有稳定运行的代码,以此保障代码的稳定性与可维护性。二、中断处理(一&#xf…

打工人日报#20250913

打工人日报#20250913 周六,回杭州了,这边居然下雨。 阅读 《小米创业思考》 第七章 技术为本 其中的技术介绍算是比较详细的,架构也很清晰,有一种对自己家产品如数家珍的感觉,对于架构也是经常思考的感觉感恩 和namwei…

【面试题】RAG核心痛点

1. 文档切分粒度不好把控,既担心噪声太多又担心语义信息丢失 这是一个经典难题。切分粒度过大,单个chunk包含过多无关信息(噪声),会干扰LLM理解核心内容;切分过小,则可能割裂句子或段落的完整语…

网络安全与iptables防火墙配置

iptables基本概念iptables是Linux系统中强大的防火墙工具,它工作在用户空间,通过命令行界面与内核空间的netfilter框架交互,实现数据包过滤、网络地址转换(NAT)等功能。Web服务器防火墙配置实例以下是针对Web服务器的iptables配置步骤&#x…

qt中给QListWidget添加上下文菜单(快捷菜单)

步骤 添加customContextMenuRequested信号的槽函数,添加后,在QListWidget上单击右键,无法响应,还必须执行下面操作;设置QListWidget上下文菜单策略为Qt::CustomContextMenu 如下:

一款好看的jQuery前端框架-HisUI

HisUI:一款基于EasyUI的前端组件类库,让web开发更迅速、简单。 HisUI官网文档

【Docker】P3 入门指南:运维与开发双重视角

目录Docker入门:运维与开发运维视角Docker 架构概述Docker 镜像镜像概念理解查看和管理镜像拉取镜像镜像标识容器管理启动容器容器内操作容器的后台运行多容器管理重新进入运行中的容器容器生命周期管理开发视角容器化思维示例:基于 Nginx 镜像构建简单 …

第六届大数据、人工智能与物联网工程国际会议(ICBAIE 2025)

重要信息 时间:2025年10月17-19日 地点:中国上海 官网:www.icbaie.net 征稿主题 1. 大数据与云计算 2. 人工智能技术与应用 3. 机器人科学与工程 4. 物联网与传感器技术 5. 其他 大数据、人工智能与物联网 引言 在数字化转型的时代…

Docker存储卷(Volume)核心概念、类型与操作指南

文章目录一、存储卷概念二、存储卷分类2.1 管理卷2.2 绑定数据卷2.3 临时数据卷三、MySQL灾难恢复四、存储卷的局限性一、存储卷概念 什么是存储卷?   Docker 存储卷 是 Docker 容器中用于持久化存储数据的独立文件系统区域。它独立于容器的联合文件系统&#xf…

Electron 原生模块集成:使用 N-API

引言:原生模块集成在 Electron 开发中的 N-API 核心作用与必要性 在 Electron 框架的扩展开发中,原生模块集成是提升应用性能和功能边界的关键技术,特别是使用 N-API(Node-API)编写和集成 C 原生模块,更是 …