使用Numpy将特征离散化

Posted 算法韭菜.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Numpy将特征离散化相关的知识,希望对你有一定的参考价值。

一、前言:什么是离散化

在通俗意义上:是在不改变数据相对大小的前提下,将数据进行相应缩小

二、目的:

小编先以简单、常见的例子来解释一下😃

例:[520,13,14]-- 离散化后的映射结果为 [3,1,2]

在机器学习中:

针对每一个数字离散化是不常见的。

因此我们希望,在面对庞大的数组中 -- 
能够针对相应特征(或属性)范围内进行离散化,实现每个值的特征简单化。

例:

在班级内调查每一个同学的成绩是否及格时:可以将60分作为划定及格和不及格的界限。

将60分以下离散化为0,将60分及以上离散化为1。

三、代码部分

1.你可以使用for循环语句

python_score = [64,58,59,75,95,46,49,52,23,76,84,65,27,79,100]
number = 1
for x in python_score:
    if x >=60:
        print(f"学号number同学成绩及格 -- 1")
    else:
        print(f"学号number同学成绩不及格 -- 0")
    number += 1

>>> 运行结果

学号1同学成绩及格 -- 1
学号2同学成绩不及格 -- 0
学号3同学成绩不及格 -- 0
学号4同学成绩及格 -- 1
学号5同学成绩及格 -- 1
学号6同学成绩不及格 -- 0
学号7同学成绩不及格 -- 0
学号8同学成绩不及格 -- 0
学号9同学成绩不及格 -- 0
学号10同学成绩及格 -- 1
学号11同学成绩及格 -- 1
学号12同学成绩及格 -- 1
学号13同学成绩不及格 -- 0
学号14同学成绩及格 -- 1
学号15同学成绩及格 -- 1

2.使用numpy将特征离散化

import numpy as np

# 创建特征
python_score = np.array([64,58,59,75,95,46,49,52,23,76,84,65,27,79,100])

# 使用numpy中函数digitize将特征离散化
result = np.digitize(python_score,bins=[60])
print(result)

>>> 运行结果

[1 0 0 1 1 0 0 0 0 1 1 1 0 1 1]

参数解释:

python_score

对象

bins

bins参数是一个数组,表示的是边界。

如我上述的值给定为60,那么它将以60的边界作为取离散值标准

<60离散值为0,>=60离散值为1

问题来了:如果我还想分类班内成绩80分及以上呢?😯

可以这样修改(主要修改bins参数)

import numpy as np

# 创建特征
python_score = np.array([64,58,59,75,95,46,49,52,23,76,84,65,27,79,100])

# 使用numpy中函数digitize将特征离散化
result = np.digitize(python_score,bins=[60,80])
print(result)

>>> 运行结果

[1 0 0 1 2 0 0 0 0 1 2 1 0 1 2]

注意:bins参数遵守的规则是"左闭右开"👈👈👈(看完下面这个例子有个保姆级可视化表格哦😋)

举一个非特殊化例子

import numpy as np

# 创建特征
python_score = np.array([20,60,80,100])

# 使用numpy中函数digitize将特征离散化
result = np.digitize(python_score,bins=[60,80])
print(result)

>>> 运行结果

[0 1 2 2]

取值范围

离散值

x < 60

0

60<= x <80

1

80 <= x

2

如果想实现“左开右闭”可以使用参数right = True

import numpy as np

# 创建特征
python_score = np.array([20,60,80,100])

# 使用numpy中函数digitize将特征离散化
result = np.digitize(python_score,bins=[60,80],right=True)
print(result)

>>> 运行结果

[0 0 1 2]

取值范围(right = True)

离散值

x <= 60

0

60< x <= 80

1

80 < x

2

四、资料拓展

使用scikit-learn的Binarizer创建二值化器

import numpy as np
from sklearn.preprocessing import Binarizer

# 创建特征
python_score = np.array([[20],
                         [60],
                         [80],
                         [100]])
# 创建二值化器
binarizer = Binarizer(60)

# 转换特征
binarizer = binarizer.fit_transform(python_score)

print(binarizer)

>>> 运行结果

[[0]
 [0]
 [1]
 [1]]

五、资料参考

《python机器学习手册 -- 从数据预处理到深度学习》 -- Chris Albon


--------------------------------------感谢大家的观看---------------------------------------------------

以上是关于使用Numpy将特征离散化的主要内容,如果未能解决你的问题,请参考以下文章

连续数值特征离散化

如何使用 numpy 在频率范围内产生噪声?

在numpy的范围内生成随机日期

05_机器学习开发流程

使用 numpy.where() 在给定范围内的两个数组中搜索元素

将numpy数组存储在mysql中