1 分箱简介

数据分箱(也称为离散分箱或分段)是一种数据预处理技术,用于减少次要观察误差的影响,是一种将多个连续值分组为较少数量的“分箱”的方法。

例如,例如我们有一组关于人年龄的数据,如下图所示:

初始数据

现在我们希望将他们的年龄分组到更少的间隔中,可以通过设置一些条件来实现:

分箱后的数据

分箱的数据不一定必须是数字,它们可以是任何类型的值,如“狗”,“猫”,“仓鼠”等。 分箱也用于图像处理,通过将相邻像素组合成单个像素,它可用于减少数据量。

分箱

2 分箱的重要性及其优势

一般在建立分类模型时,需要对连续变量离散化,特征离散化后,模型会更稳定,降低了模型过拟合的风险。比如在建立申请评分卡模型时用logsitic作为基模型就需要对连续变量进行离散化,离散化通常采用分箱法。分箱的有以下重要性及其优势:

离散特征的增加和减少都很容易,易于模型的快速迭代;

稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;

离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。4. 如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;

逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单6. 独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;

离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;

特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;

特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

可以将缺失作为独立的一类带入模型。

将所有变量变换到相似的尺度上。

3 分箱方法

有监督分箱

卡方分箱

自底向上的(即基于合并的)数据离散化方法。它依赖于卡方检验:具有最小卡方值的相邻区间合并在一起,直到满足确定的停止准则。

基本思想:

对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开。而低卡方值表明它们具有相似的类分布。

这里需要注意初始化时需要对实例进行排序,在排序的基础上进行合并。

卡方阈值的确定:

根据显著性水平和自由度得到卡方值自由度比类别数量小1。例如:有3类,自由度为2,则90%置信度(10%显著性水平)下,卡方的值为4.6。

阈值的意义:

类别和属性独立时,有90%的可能性,计算得到的卡方值会小于4.6。 大于阈值4.6的卡方值就说明属性和类不是相互独立的,不能合并。如果阈值选的大,区间合并就会进行很多次,离散后的区间数量少、区间大。

注:

1、ChiMerge算法推荐使用0.90、0.95、0.99置信度,最大区间数取10到15之间.

2、也可以不考虑卡方阈值,此时可以考虑最小区间数或者最大区间数。指定区间数量的上限和下限,最多几个区间,最少几个区间。

3、对于类别型变量,需要分箱时需要按照某种方式进行排序。

最小熵法分箱

无监督分箱

等距分箱

从最小值到最大值之间,均分为 N 等份, 这样, 如果 A,B 为最小最大值, 则每个区间的长度为 W=(B−A)/N , 则区间边界值为A+W,A+2W,….A+(N−1)W 。这里只考虑边界,每个等份里面的实例数量可能不等。

def create_bins(lower_bound, width, quantity):

"""

创建等距分箱

"""

bins = []

for low in range(lower_bound,

lower_bound + quantity * width + 1, width):

bins.append((low, low + width))

return bins

bins = create_bins(lower_bound=50,

width=4,

quantity=10)

print(bins)

输出:

[(50, 54), (54, 58), (58, 62), (62, 66), (66, 70), (70, 74), (74, 78), (78, 82), (82, 86), (86, 90), (90, 94)]

给出一组数据,然后查找它们所属的分箱

def find_bin(value, bins):

"""

查找分箱

"""

for i in range(0, len(bins)):

if bins[i][0] <= value < bins[i][1]:

return i

return -1

from collections import Counter

weights_of_persons = [73.4, 69.3, 64.9, 75.6, 74.9, 80.3,

78.6, 84.1, 88.9, 90.3, 83.4, 69.3,

52.4, 58.3, 67.4, 74.0, 89.3, 63.4]

binned_weights = []

for value in weights_of_persons:

bin_index = find_bin(value, bins)

print(value, bin_index, bins[bin_index])

binned_weights.append(bin_index)

frequencies = Counter(binned_weights)

print(frequencies)

输出:

73.4 5 (70, 74)

69.3 4 (66, 70)

64.9 3 (62, 66)

75.6 6 (74, 78)

74.9 6 (74, 78)

80.3 7 (78, 82)

78.6 7 (78, 82)

84.1 8 (82, 86)

88.9 9 (86, 90)

90.3 10 (90, 94)

83.4 8 (82, 86)

69.3 4 (66, 70)

52.4 0 (50, 54)

58.3 2 (58, 62)

67.4 4 (66, 70)

74.0 6 (74, 78)

89.3 9 (86, 90)

63.4 3 (62, 66)

Counter({4: 3, 6: 3, 3: 2, 7: 2, 8: 2, 9: 2, 5: 1, 10: 1, 0: 1, 2: 1})

等频分箱

区间的边界值要经过选择,使得每个区间包含大致相等的实例数量。比如说 N=10 ,每个区间应该包含大约10%的实例。

以上两种算法的弊端:比如,等宽区间划分,划分为5区间,最高工资为50000,则所有工资低于10000的人都被划分到同一区间。等频区间可能正好相反,所有工资高于50000的人都会被划分到50000这一区间中。这两种算法都忽略了实例所属的类型,落在正确区间里的偶然性很大。

4 pandas实现数据分箱

首先创建一个长度为20的,范围在30-100之间的学生分数的数组

import numpy as np

import pandas as pd

from pandas import Series, DataFrame

score_list = np.random.randint(30, 100, size=20)

print(score_list)

[52 54 36 82 91 62 78 75 65 96 97 62 62 49 94 37 61 30 88 32]

然后我们再设置分箱:

bins=[0,59,70,80,100]

这就表示数据有0-59,59-70,70-80,80-100这几个等级。

下面把分箱和分数利用cut方法结合到一起。

score_cat = pd.cut(score_list, bins)

print(pd.value_counts(score_cat))

(0, 59] 8

(80, 100] 7

(59, 70] 3

(70, 80] 2

5 参考资料

python卡方分箱_机器学习(十六)特征工程之数据分箱相关推荐

  1. 机器学习笔记六——特征工程之数据预处理

    特征工程之数据预处理 1. 处理缺失值 2. 处理异常值 2.1 异常值检测 2.2异常值处理 3.离散特征的连续化处理 4.连续特征的离散化处理 5. 处理类别不平衡问题 6. 图片数据扩充 数据预 ...

  2. 特征工程之数据分箱、Nominal特征编码、Ordinal分类特征编码、特征交叉组合、特征差分

    特征工程之数据分箱.Nominal特征编码.Ordinal分类特征编码.特征交叉组合.特征差分 目录

  3. python卡方拟合优度检验_如何使用Python中的科学库执行卡方拟合优度检验?

    假设我有一些我凭经验得到的数据: from scipy import stats size = 10000 x = 10 * stats.expon.rvs(size=size) + 0.2 * np ...

  4. 百面机器学习 -- No.2 特征工程 -- 训练数据不足的情况下会带来什么问题,如何缓解?

    训练数据不足的情况下会带来什么问题,如何缓解? 数据不足会带来什么问题 如何解决 ? 数据不足会带来什么问题 机器学习任务的问题,可以简单的理解成寻找最佳的拟合函数和最佳的泛化函数,拟合函数是用来学习 ...

  5. 《Python编程:从入门到实践》第十六章:下载数据

    下载数据 我们将访问并可视化以两种常见格式存储的数据:CSV和JSON.我们将使用Python模块csv来处理以CSV(逗号分隔的值)格式存储的天气数据,找出两个不同地区在一段时间内的最高温度和最低温 ...

  6. python二手车价格预测_二手车价格预测--特征工程task3

    3.1 特征工程目标 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已. 本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用. 3.2 内容介绍 常见的特征工程 ...

  7. 第十六届中国大数据技术大会五大分论坛顺利举办!

    1月8日下午,由苏州市人民政府指导.中国计算机学会主办.苏州市吴江区人民政府支持,CCF大数据专家委员会.苏州市吴江区工信局.吴江区东太湖度假区管委会.苏州市吴江区科技局.苏州大学未来科学与工程学院及 ...

  8. 机器学习实战之特征工程

    机器学习实战与特征工程 1.机器学习概述 1.1 什么是机器学习 1.2 为什么要机器学习 1.3 机器学习应用场景 1.4 学习框架和资料的介绍 2.特征工程 2.1 特征工程介绍 2.1.1 数据 ...

  9. 拥抱数字时代 | 第十六届中国大数据技术大会成功举办

    2月26日,由中国计算机学会(CCF)主办,苏州市吴江区人民政府支持,CCF大数据专家委员会.苏州市吴江区工信局.吴江区东太湖度假区管理办公室.苏州市吴江区科技局.苏州大学未来科学与工程学院.Data ...

最新文章

  1. python中read table_Python Pandas pandas.read_sql_table函数方法的使用
  2. Nodejs如何调用Dll模块
  3. servlet获取相对路径 绝对路径
  4. PAT (Advanced Level) 1070. Mooncake (25)
  5. mysql timeout的单位_mysql的timeout-阿里云开发者社区
  6. springboot-RequestMappingHandlerMapping
  7. The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local Machine 完美解决
  8. 【Oracle】常用SQL
  9. 陆金所金融核心场景数据库的去 O 之路
  10. android 6.0 大神f2,酷派大神F2刷机包 64位1080p 全高清版 MIUI8安卓6.0 插桩适配ROM 锁屏画报 极致体验...
  11. 数据权属权益的法律讨论
  12. bootstrap class path not set in conjunction with -source 1.6
  13. 小米商城项目——首页跳转到登录页面或注册页面的制作分析
  14. Linux是什么?是谁开发的?
  15. sentry mysql_Apache Sentry安装及简单使用
  16. 【2023杰理科技提前批笔试题】~ 题目及参考答案
  17. 三菱系统刀库乱刀处理_数控加工中心刀库乱刀原因以及处理方法
  18. java-php-python-ssm“花花世界”网站计算机毕业设计
  19. Zephyr UART
  20. 测试软件cpu占用率 可以用,CPU占用率检测工具

热门文章

  1. 如何把获取的JSON数据插入到MySQL中
  2. 一个程序员的江湖传奇
  3. 程序猿要爱惜自己的身体
  4. 计算机类对口高职考试内容,对口高职计算机专业考试试题.doc
  5. 计算机网络 RIP,OSPF,BGP,MPLS协议
  6. java mockserver搭建_自动化测试基础设施(一)——为功能测试构建通用mock server系统...
  7. 项目实训记录(1-2周)
  8. DA FMC子卡设计资料yuanlit:FMCJ456-基于JESD204B的2路3GspsAD 2路3Gsps DA FMC子卡
  9. 二分搜索(C语言代码)及解释
  10. jxTMS使用示例--兴趣点