数据集预处理系列
第一篇 连续型数据的离散化 代码实操
文章目录
- 数据集预处理系列
- 前言
- 一、数据及离散化过程
- 1.数据
- 2. 离散化例子
- 3.使用的api接口
- 4.实现过程
- pd.qcut实现
- pd.cut实现
- 总结
前言
连续型数据有其好处,其能够精准地表示出某个项的具体内容。例如身高,能够具体表示出其为180cm,或者172cm,而离散化的数据是没办法的。但是我们有时候不需要如此精确,例如,我只需要知道身高是高一点,还是中等,还是低,这就是一个范围问题。
本文会用一个数据集例子,配合所用到的代码,说明如何把连续型数据离散化并可以作为输入进入模型。
一、数据及离散化过程
1.数据
这里从一个数据集中提取了某一列的前30个数据作为例子,上图是其内容。
2. 离散化例子
例如:
身高:165,174,160,180,159,163,192,184
离散化后:150 ~ 165,165 ~ 180,150 ~ 165,180 ~ 195,150 ~ 165,150 ~ 165,180 ~ 195,180 ~ 195
每一个数目都会变成一个范围!
3.使用的api接口
- pd.qcut
- pd.cut
pd.qcut能够让程序自动帮你把df中的数据划分成几个部分(即实现离散化),主要使用的有两个参数,
第一个为x,传入的是dataframe,第二个为q,指定的是要划分的个数
pd.cut能够指定划分的是区域,x传入的是dataframe,bins传入一个指定的划分区域,例如
[-1,100,200,300,400,500],指的是-1到100为一个划分(不包括-1)
4.实现过程
pd.qcut实现
pd_qcut = pd.qcut(src_bytes_data.rank(method='first'), q=5)
前9个的结果为:
0 (24.2, 30.0]
1 (12.6, 18.4]
2 (0.999, 6.8]
3 (18.4, 24.2]
4 (12.6, 18.4]
5 (0.999, 6.8]
6 (0.999, 6.8]
7 (0.999, 6.8]
8 (0.999, 6.8]
这里用了rank,是因为qcut在分段的时候,每个段的边界数值必须独一无二,如果有重复是会报错的,使用rank会进行排序,把数值替换成排序的序号,可以参考下面文章
rank的使用
pd.cut实现
q=[-1,100,200,300,400,500]
pd_cut = pd.cut(x=src_bytes_data, bins=q)
前9个的结果为:
0 (400, 500]
1 (100, 200]
2 (-1, 100]
3 (200, 300]
4 (100, 200]
5 (-1, 100]
6 (-1, 100]
7 (-1, 100]
8 (-1, 100]
如果想要看每个划分的个数,可以使用pd的value_counts对象
print(pd_cut.value_counts())
输出划分个数,结果如下:
(-1, 100] 15
(200, 300] 8
(100, 200] 3
(400, 500] 2
(300, 400] 2
最后,每一个数值都被一个范围代替了,我们可以使用独热编码进行编码,使之能够输入模型。
这里用了pd.get_dummies方法,具体结果如下:
data_(-1, 100] data_(100, 200] ... data_(300, 400] data_(400, 500]
0 0 0 ... 0 1
1 0 1 ... 0 0
2 1 0 ... 0 0
3 0 0 ... 0 0
4 0 1 ... 0 0
总结
以上就是我个人对连续型数据的离散化的初步理解,希望配合上其他文章,能让初学者更容易理解。如果觉得有用,请大家点赞支持!!!!。