【scikit-learn基础】--『预处理』之 离散化

数据的预处理 是数据分析,或者机器学习训练前的重要步骤。

通过数据预处理,可以

  • 提高数据质量,处理数据的缺失值、异常值和重复值等问题,增加数据的准确性和可靠性
  • 整合不同数据,数据的来源和结构可能多种多样,分析和训练前要整合成一个数据集
  • 提高数据性能,对数据的值进行变换,规约等(比如无量纲化),让算法更加高效

本篇介绍的离散化 处理,是一种数据预处理技术,用于将连续的、连续的数值型数据转换为离散的、分类的标签。

这种处理方式主要应用于一些需要转化为分类问题的数据集,如机器学习和数据挖掘中的输入变量。

1. 原理

离散化的原理主要是通过将连续的数值属性转化为离散的数值属性来实现数据的转化。

这个过程通常会采用分箱 (Binning)的方法。

在分箱中,原始数据的值被分配到一些离散的、预定义的类别中,这些类别通常被称为"箱子"或"桶",

箱子的数量和大小可以根据数据的分布和实际需求进行调整。

我们平时常用的离散化处理有两种:

1.1. 二值化处理

二值化 就是根据阈值将一系列连续的数据分为两种类别。
二值化处理的实际应用场景很多,比如垃圾邮件的判定,信用卡欺诈的判定,还有各种的医疗检测结果(阴性阳性)。

使用scikit-learn中的Binarizer对数据进行二值化处理:

python 复制代码
from sklearn import preprocessing as pp
import numpy as np

data = np.random.randint(0, 100, size=(3, 3))
b = pp.Binarizer(threshold=80)
result = b.fit_transform(data)

print("原始数据: {}".format(data))
print("二值化后数据: {}".format(result))

# 运行结果
原始数据: 
[[12 28 84]
 [ 2 18 81]
 [74 92 74]]

二值化后数据: 
[[0 0 1]
 [0 0 1]
 [0 1 0]]

Binarizer的参数threshold就是分类的阈值。

上面的例子中,threshold=80,则大于80 的值为1小于等于80 的值为0

1.2. K-bins处理

K-bins离散化处理则可以控制数据分成多个类别。

它在实际中的应用比如电商领域,根据用户的购买行为将用户分为不同的消费类别;在统计学习成绩时,按照成绩分为不同的等级(优/良/中/差)等等。

这些场景下,不能简单的进行二值化,需要离散化为多个分类。

对于K-bins离散化,可以使用scikit-learn中的KBinsDiscretizer

python 复制代码
data = np.random.randint(0, 100, 10).reshape(-1, 1)
b = pp.KBinsDiscretizer(n_bins=3, encode="ordinal")
result = b.fit_transform(data)

print("原始数据: {}".format(data))
print("K-bins离散化后数据: {}".format(result))

# 运行结果
原始数据: [[12]
 [82]
 [19]
 [32]
 [81]
 [84]
 [92]
 [25]
 [61]
 [31]]
K-bins离散化后数据: [[0.]
 [2.]
 [0.]
 [1.]
 [2.]
 [2.]
 [2.]
 [0.]
 [1.]
 [1.]]

KBinsDiscretizer的参数n_bins表示分为几类,上面的示例中设置分为了3类

另一个参数encode表示离散化后的数据编码,上面的示例中"ordinal"表示用顺序的整数来编码。

可以设置encodeonehot,使得离散化的数据变为独热编码。

2. 作用

数据离散化的主要作用有:

  1. 降低计算量和复杂度:连续的数值数据转化为离散的类别数据后,简化了数据,从而降低计算量和复杂度,特别是在处理大规模数据集时效果更为显著。
  2. 解决异常值和缺失值问题:将连续的数值数据中的异常值和缺失值进行合理的处理,从而避免对后续的影响。
  3. 提高模型的解释性:连续的数值数据转化为离散的类别数据后,使模型结果更加直观和易于解释。
  4. 克服数据中的缺陷:将连续的数值数据转化为离散的类别数据,能够有效地克服数据中隐藏的缺陷,使模型结果更加稳定。
  5. 提高算法效率和精度:将连续的数值数据进行分段,并采用优化方法进行离散化处理,从而可以提高算法的效率和精度。

当然,离散化 处理简化了数据,可能会导致原始数据中的一些细节信息的丢失。

其次,离散化处理可能会引入一些主观性和不稳定性,因为分类的数量和大小通常是基于经验和实际需求进行调整的,不同的决策可能会导致不同的结果。

3. 总结

总之,关注离散化处理给我们带来的种种好处之时,在实际应用中也需要注意其局限性,如可能会造成数据的丢失和失真等问题。

因此,在具体的实践中,需要根据实际情况和需求进行合理的选择和应用。

相关推荐
李妍.12 分钟前
02Numpy基础(上)
开发语言·python
TheBestRucy14 分钟前
Python 九阳神功之贰:面向对象(下)
开发语言·python
2601_9659584638 分钟前
口腔黏膜脱皮超2周未愈建议及时就医
人工智能·python
微小冷2 小时前
在不同空间中展示数据(欧式、球面、庞加莱圆盘)
python·双曲空间·微分几何·geomstats·庞加莱圆盘·球面
weixin_431600442 小时前
Agent Workflow 学习向:Code 节点,比模板更强的变量加工
后端·python·学习·ai·
讲温控就好了2 小时前
从医疗影像到能源存储——芯片冷却温控技术的跨行业赋能
人工智能·python·能源
DeepVisionary3 小时前
从 Qwen3.8-27B 把原生多模态、原生 FP8、桌面级 Agent 三件事一次集齐,看开源大模型的“工业化拐点“
python·自动化
固定资产管理系统软件4 小时前
商务局RFID固定资产管理系统的应用价值与落地要点解析
大数据·python
TheBestRucy4 小时前
Python 九阳神功:从零筑基到线程飞升
服务器·开发语言·网络·人工智能·python
lancyu5 小时前
关于多轮对话机器人的上下文Token优化和解决方案
人工智能·python·深度学习·机器学习·chatgpt·机器人·prompt