• 一文带你了解”数据分箱“技术


    一文带你了解”数据分箱“技术

    引言:什么是分箱

    分箱就是把数据特定的规则进行分组,实现数据的离散化,增强数据稳定性,减少过拟合风险。逻辑回归中进行分箱是非常必要的,其他树模型可以不进行分箱。

    01.数据分箱

    数据分箱(Binning)作为数据预处理的一部分,也被称为离散分箱或数据分段。其实分箱的概念其实很好理解,它的本质上就是把数据进行分组

    我们以下面数据为例,左边是原始数据,右边是分箱后的数据:

    英雄昵称(原始数据)从属类型(分箱后)
    不知火舞法师
    后羿射手
    公孙离射手
    妲己法师
    庄周辅助
    张飞辅助
    马可波罗射手
    海月法师
    盾山辅助

    英雄字段中的数据被分到了以下的不同类型

    • 法师
    • 射手
    • 辅助
    数据分箱的好处
    • 相同数据进行遍历比较,避免了全部遍历比较
    • 大大减少了电脑IO次数,提高程序运行速度

    02.基于python实现数据分箱案例

    实现思路
    1. 先给定 last 为列表第一个数组(并存入temp列表中),将之后的数据从第二个开始与 last中的数据进行比较,如果相同存入 temp列表中。
    2. 如果数据不相同,则将 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    实现效果
    [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]]
    
    • 1
    • 2
    • 3
    • 4

    类型二:元组类型比对

    代码实现
    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取使用场次
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    实现效果
    #数据分箱前:
    [('法师','不知火舞', '20'),  ('辅助','张飞', '18'),('法师','妲己', '21'),
     ('辅助','钟馗', '18'),('辅助','盾山', '18'),('射手','后羿', '17',),
     ('射手','公孙离', '10',),('法师','海月', '21'),('射手','马可波罗', '10',)]
    
    #数据分箱后:
    [[('法师', '不知火舞', '20'), ('法师', '妲己', '21'), ('法师', '海月', '21')], 
    [('辅助', '张飞', '18'), ('辅助', '钟馗', '18'), ('辅助', '盾山', '18')],
    [('射手', '后羿', '17'), ('射手', '公孙离', '10'), ('射手', '马可波罗', '10')]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    基于elelemt-ui封装一个表单
    如何彻底禁止 macOS Monterey 自动更新,去除更新标记和通知
    Java实现3DES加密解密(DESede/ECB/PKCS5Padding使用)
    谁懂万方检索的高级检索嘛
    MAC M1芯片安装mounty读写移动硬盘中的文件
    SpringBoot Admin 详解
    Mac监控键盘输入并执行动作
    基于51单片机的智能路灯控制系统proteus仿真原理图PCB
    clickhouse 三种高可用方案
    【LeetCode刷题-滑动窗口】--1004.最大连续1的个数III
  • 原文地址:https://blog.csdn.net/H931053/article/details/133177460