1、离散化方法——等宽法
将数据的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定或者用户指定,与制作频率分布表类似。
pandas 提供了 cut 函数,可以进行连续型数据的等宽离散化,其基础语法格式如下。
pandas.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False)
使用等宽法离散化的缺陷为:等宽法离散化对数据分布具有较高要求,若数据分布不均匀,那么各个类的数目也会变得非常不均匀,有些区间包含许多数据,而另外一些区间的数据极少,这会严重损坏所建立的模型。
离散化代码实现:
1 # 2、将连续的小数数据---->区间数据(类别数据、离散数据) ---(离散化)
2 # 将连续的小数数据---拆分成不同的区间
3 # cut --拆分
4 # detail ---amounts单价数据 ---可以理解为连续的小数数据
5 # 将amounts进行拆分---离散化
6 # 加载detail数据
7 detail = pd.read_excel('./meal_order_detail.xlsx')
8 print('detail:\n', detail)
9 print('detail的列索引:\n', detail.columns)
10
11 # x : 需要离散化的数据
12 # bins : 分组的组数,分组节点
13 # include_lowest :默认为False ,如果让系统默认拆分,包含最小值
14 # 如果自定义划分分组节点---不包含最小值,需要将include_lowest =True
15 # res = pd.cut(x=detail.loc[:, 'amounts'],
16 # bins=5,
17 # include_lowest=True)
18 # # 原来具体的数值---->各个区间来代替原来的具体的值
19 # print('res:\n', res)
20 # print('*' * 100)
21 #
22 # # 可以同values_counts来查看分组之后,各个区间内的数量
23 # print(pd.value_counts(res))
24
25
26 # 自定义分组
27 # (1) 自己直接指定分组节点
28 # bins = [1, 40, 80, 120, 160, 180]
29 # res = pd.cut(x=detail.loc[:, 'amounts'],
30 # bins=bins,
31 # include_lowest=True)
32 # print('res:\n',res)
33 # print('*' * 100)
34 # # 可以同values_counts来查看分组之后,各个区间内的数量
35 # print(pd.value_counts(res))
36 # # (2) 等宽分组
37 # # a、确定分组组数
38 # group_num = 5
39 # # b、确定间距
40 # # 确定最大值
41 # max_amounts = detail.loc[:, 'amounts'].max()
42 # # 确定最小值
43 # min_amounts = detail.loc[:, 'amounts'].min()
44 # # 确定间距
45 # width = int(np.ceil((max_amounts - min_amounts) / group_num))
46 # # c、确定分组节点
47 # bins = np.arange(min_amounts, max_amounts + width, width)
48 #
49 # res = pd.cut(x=detail.loc[:, 'amounts'],
50 # bins=bins,
51 # include_lowest=True)
52 # print('res:\n', res)
53 # print('*' * 100)
54 # # 可以同values_counts来查看分组之后,各个区间内的数量
55 # print(pd.value_counts(res))
2、离散化方法——等频法
cut 函数虽然不能够直接实现等频离散化,但是可以通过定义将相同数量的记录放进每个区间。
等频法离散化的方法相比较于等宽法离散化而言,避免了类分布不均匀的问题,但同时却也有可能将数值非常接近的两个值分到不同的区间以满足每个区间中固定的数据个数。
以订单详情为例,将 amounts 特征离散到不同的区间。
离散化代码实现:
1 # (3) 等频分组
2 # 因为在分组的时候,使用等宽分组的时候,可能出现某个区间内无数据
3 # 使用等频分组--->在各个区间内的数量基本一致
4 # 分位数计算---quantile
5 # a、确定分组组数
6 group_num = 5
7 # b、确定bins
8 bins = detail.loc[:, 'amounts'].quantile(q=np.arange(0, 1 + 1 / group_num, 1 / group_num))
9
10 print('bins:\n', bins)
11
12 res = pd.cut(x=detail.loc[:, 'amounts'],
13 bins=bins,
14 include_lowest=True)
15 print('res:\n', res)
16 print('*' * 100)
17 # 可以同values_counts来查看分组之后,各个区间内的数量
18 print(pd.value_counts(res))
也可以使用 pandas.qcut 来进行等频分组。