一文带你了解”数据分箱“技术
引言:什么是分箱?
分箱就是把数据按特定的规则进行分组,实现数据的离散化,增强数据稳定性,减少过拟合风险。逻辑回归中进行分箱是非常必要的,其他树模型可以不进行分箱。
01.数据分箱
数据分箱(Binning)作为数据预处理的一部分,也被称为离散分箱或数据分段。其实分箱的概念其实很好理解,它的本质上就是把数据进行分组。
我们以下面数据为例,左边是原始数据,右边是分箱后的数据:
英雄昵称(原始数据) | 从属类型(分箱后) |
---|---|
不知火舞 | 法师 |
后羿 | 射手 |
公孙离 | 射手 |
妲己 | 法师 |
庄周 | 辅助 |
张飞 | 辅助 |
马可波罗 | 射手 |
海月 | 法师 |
盾山 | 辅助 |
英雄字段中的数据被分到了以下的不同类型:
- 法师
- 射手
- 辅助
数据分箱的好处
- 对相同数据进行遍历比较,避免了全部遍历比较
- 大大减少了电脑IO次数,提高程序运行速度
02.基于python实现数据分箱案例
实现思路
- 先给定 last 为列表第一个数组(并存入temp列表中),将之后的数据从第二个开始与 last中的数据进行比较,如果相同存入 temp列表中。
- 如果数据不相同,则将 last 切换为 不同的那个数(并存入temp),并将 temp列表放入一个空列表中。
类型一:基本数据类型比对(数字)
代码实现
box = [1,1,1,2,2,2,3,3,4,4,5,5,5,5,5]
last = box[0]
temp = [box[0]]
box_list = [temp]
for a in box[1::]:
if a == last:
temp.append(a)
else:
last = a
temp = [a]
box_list.append(temp)
print(box_list) # [[1, 1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5, 5, 5]]
# 实现按每一个分箱列表遍历数据(而不用全部遍历)
for boxs in box_list:
for i in boxs:
print(i)
实现效果
[1,1,1,2,2,2,3,3,4,4,5,5,5,5,5]
# 输出结果为
[[1, 1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5, 5, 5]]
类型二:元组类型比对
代码实现
box = [('法师','不知火舞', '20'), ('辅助','张飞', '18'),('法师','妲己', '21'),
('辅助','钟馗', '18'),('辅助','盾山', '18'),('射手','后羿', '17',),
('射手','公孙离', '10',),('法师','海月', '21'),('射手','马可波罗', '10',)]
last = box[0][0]
temp = [box[0]]
box_list = [temp]
for a in box[1::]:
if a[0] == last:
temp.append(a)
else:
last = a[0]
temp = [a]
box_list.append(temp)
print(box_list)
# 实现按每一个分箱列表遍历数据(而不用全部遍历)
for boxs in box_list:
for i in boxs:
print(i[0]) # 0取的英雄属性,1取英雄ID,3取使用场次
实现效果
#数据分箱前:
[('法师','不知火舞', '20'), ('辅助','张飞', '18'),('法师','妲己', '21'),
('辅助','钟馗', '18'),('辅助','盾山', '18'),('射手','后羿', '17',),
('射手','公孙离', '10',),('法师','海月', '21'),('射手','马可波罗', '10',)]
#数据分箱后:
[[('法师', '不知火舞', '20'), ('法师', '妲己', '21'), ('法师', '海月', '21')],
[('辅助', '张飞', '18'), ('辅助', '钟馗', '18'), ('辅助', '盾山', '18')],
[('射手', '后羿', '17'), ('射手', '公孙离', '10'), ('射手', '马可波罗', '10')]]