在通俗意义上:是在不改变数据相对大小的前提下,将数据进行相应缩小
小编先以简单、常见的例子来解释一下
例:[520,13,14]-- 离散化后的映射结果为 [3,1,2]
在机器学习中:
针对每一个数字离散化是不常见的。
因此我们希望,在面对庞大的数组中 --
能够针对相应特征(或属性)范围内进行离散化,实现每个值的特征简单化。
例:
在班级内调查每一个同学的成绩是否及格时:可以将60分作为划定及格和不及格的界限。
将60分以下离散化为0,将60分及以上离散化为1。
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
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
--------------------------------------感谢大家的观看---------------------------------------------------