数据预处理-分箱(Binning)和 WOE编码

数据预处理-分箱(Binning)和 WOE编码

1. 分箱

1.1 理论

1.1.1 定义 分箱就是将连续的特征离散化,以某种方式将特征值映射到几个箱(bin)中。

1.1.2 为什么要进行分箱?

  • 引入非线性变换,增强模型性能。因为原始值和目标值之间可能并不存在线性关系,所以直接使用模型预测起不到很好的效果。
  • 增强模型可解释性。通过分箱可以得到一个分段函数,模型可解释性更强。
  • 对异常值不敏感,增强模型鲁棒性,防止过拟合。异常值终也会被分到一个箱里面,不会影响其他箱内正常特征值,分箱的在一定程度上也可以防止过拟合。
  • 重要的是分箱之后我们还可以对不同的箱做进一步的统计和特征组合。比如WOE编码。

1.1.3 常用分箱方法:

  • 卡方分箱(最稳定,最常用)

卡方值计算公式:

在这里插入图片描述

其中:

m: 箱的数量;

k: 类别数量;

Aij: 第i个箱第j类中样本数量(频数);

Eij: 如果箱的划分和类别独立同分布,第i个箱第j类中样本数量的期望值(频数);设箱的划分和类别独立同分布,则样本同时在第i个箱第j类中的概率为:pij = pi * pj,同时在第i个箱第j类中的有样本数量期望值为:pij * N 。

卡方值计算的例子,设m=2, k=2,

表1 实际频数

类别1类别2行和
箱1A11A12R1
箱2A21A22R2
列和C1C2

表2 期望频数(Eij

类别1类别2
箱1E11 = pi * pj * N =(R1 /N) * (C1 / N) * N = R1 * C1 / NE12 = R1 * C2 / N
箱2E21 = R2 * C1 / NE22 = R2 * C2 / N

表1和表2中的数据带入卡方值计算公式,即可求出箱1和箱2合并的卡方值。卡方值越小,说明真实值与期望值越接近,箱的划分和类别越接近独立同分布(类的划分和箱的划分没有关系),那么两个箱具有相同的标签分布,可以合并。

卡方检验步骤:

(1)初始化:根据连续变量值大小进行排序,构建最初的离散化,即把每一个单独的值视为一个箱体。这样做的目的是从每个单独的个体开始逐渐合并。

(2)合并:遍历相邻两项合并的卡方值,将卡方值最小的两组合并,不断重复直到满足分箱数目的限制。决策树分箱

  • 聚类分箱

    使用k-means进行聚类分箱,算法比较简单,不再详细说:先初始化k个类中心,每一次迭代将样本划分到最近的类中,然后修正类中心,直到类中心不再发生变化,停止迭代。

  • 等频分箱

    每一个箱中的样本数相同,实现很简单,先排序,按顺序放到对应的箱中即可。

  • 等距分箱

    箱的大小相同,例如年龄分箱:0-5岁,5-10岁,10-15岁,…

  • 决策树分箱

    将某一列数据作为训练集,将label作为结果,直接训练一个决策树,然后根据决策树的分裂节点的阈值作为分箱的依据。

1.1.4 实验

  • 这个实验使用toad库(https://toad.readthedocs.io/en/stable/tutorial_chinese.html)来做分箱。
  • 数据集使用(https://archive.ics.uci.edu/dataset/350/default+of+credit+card+clients),数据集介绍:

UCI数据集包含30,000名客户及其在台湾一家银行的信用卡交易数据。除了客户的静态特征外,该数据集还包含某年4月至9月的信用卡账单支付历史,以及客户信用卡的余额限制。目标是客户是否会在接下来的一个月,即该年10月拖欠信用卡付款。可以想象,在这个数据上训练出来的模型在实践中可以用来确定客户是否有资格获得其他产品,如汽车贷款等。该数据集包含23个输入变量(input variable)和一个响应变量(response variable)。该数据集来源于UCI machine learning repository,为某银行的信用卡客户信息数据,共有30000个样本,包括过去六个月的账单还款情况。

ID:信用卡客户ID号

LIMIT_BAL:以新台币计算的信贷金额(包括个人和家庭/补充信贷)/ 信用卡限额,会被替换成一个合成的更具典型性的特征。

SEX: 性别 (1代表男性,2代表女性)

EDUCATION:受 教育程度(1=研究生, 2=大学, 3=高中, 4=其他 5=未知, 6=未知)

MARRIAGE:婚姻状况(1=已婚,2=单身,3=其他)

AGE:年龄

X1:信用额度,包括其个人和家庭补充信用

X2:性别(1=male;2=female)

X3:教育(1=研究生,2=大学,3=高中,4=其他)

X4:婚姻状况(1=已婚,2=单身,3=其他)

X5:年龄,age

X6-X11:过去六个月的还款情况。其中,-1,代表按时还款;1,代表延时一个月还款;2,代表延时两个月还款…依次类推,XN=n,代表延时n个月还款,

X12-X17:过去六个月的账单数额情况。

X18-X23:过去六个月的还款数额情况。

Y:目标属性,客户下个月还款违约情况(1=逾期,0=未逾期)

# 导入数据集
import os
import eda
import pandas as pd
import numpy as np
import toaddata_dir = "./"
df = pd.read_csv(os.path.join(data_dir, "default_of_credit_card_clients.csv"))
df["SEX"] = df["SEX"].map({1: "男", 2: "女"})
df["EDUCATION"] = df["EDUCATION"].map({1: "研究生", 2: "大学", 3: "高中", 4: "其他",  5: "未知", 6: "未知"})
df["MARRIAGE"] = df["MARRIAGE"].map({1: "已婚", 2: "单身", 3: "其他"})
df.head()

在这里插入图片描述

# 分箱,并查看分箱结果
X = df.drop(["ID", "default payment next month"], axis=1)
y = df["default payment next month"]combiner = toad.transform.Combiner()
combiner.fit(X, y, method='chi', n_bins=6, min_samples=0.05, exclude=[])

在这里插入图片描述

在这里插入图片描述

# 查看分箱后的数据数据分布,使用了卡方分箱和决策树分箱
from toad.plot import bin_plot
for method in ['chi', 'dt']:c = combiner.fit(X[["AGE"]], y, method=method, n_bins=6, min_samples=0.05)bin_plot(c.transform(df, labels=True), x='AGE', target="default payment next month")                 

在这里插入图片描述
在这里插入图片描述

在图中,蓝色bar代表了样本量占比,红线代表了正样本占比(e.g. 坏账率),也就是target的汇总。

2.WOE编码

WOE(Weight of Evidence),证据权重,它是一种对原始自变量有标准化功能的编码形式。WOE编码的定义为:
在这里插入图片描述

其中,pyi是当前分组中响应客户占样本中所有响应客户的比例,pni是当前分组中未响应客户占样本中所有未响应客户的比例,而WOE表示的实际上是二者之间的差异。WOE也可以理解为,当前组中响应的客户和未响应客户的比值与所有样本中这个比值的差异。这个差异是通过对这两个比值取对数来表示的。WOE越大,差异越大,这个分组里的样本响应的可能性就越大;WOE越小,差异越小,这个分组里的样本响应的可能性也就越小。

用调整好的Combiner(分箱器)进行WOE转化

t = toad.transform.WOETransformer()
tt = 'default payment next month'
woe = t.fit_transform(c.transform(df[["AGE", tt]]), df[tt], exclude=[tt])
woe.head()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/109798.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2023集创赛】加速科技杯作品:高光响应的二硫化铼光电探测器

本文为2023年第七届全国大学生集成电路创新创业大赛(“集创赛”)加速科技杯西北赛区二等奖作品分享,参加极术社区的【有奖征集】分享你的2023集创赛作品,秀出作品风采,分享2023集创赛作品扩大影响力,更有丰…

【Flowable】任务监听器(五)

前言 之前有需要使用到Flowable,鉴于网上的资料不是很多也不是很全也是捣鼓了半天,因此争取能在这里简单分享一下经验,帮助有需要的朋友,也非常欢迎大家指出不足的地方。 一、监听器 在Flowable中,我们可以使用监听…

C++(day4)

思维导图 封装Mystring #include <iostream> #include<cstring>using namespace std;class Mystring{ public://无参构造函数Mystring():size(10){strnew char[size];strcpy(str,"");cout<<"无参构造函数"<<endl;}//有参构造函数…

中小企业建设数字化工厂,选择集成还是重构

随着科技的飞速发展和市场竞争的日益激烈&#xff0c;数字化工厂管理系统已成为中小企业未来发展的必经之路。然而&#xff0c;对于许多中小企业来说&#xff0c;建设数字化工厂并非易事。在建设数字化工厂的过程中&#xff0c;企业需要面对许多问题&#xff0c;其中最关键的问…

Zynq UltraScale+ XCZU3EG 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优越性4、详细设计方案设计原理框图IMX214 摄像头及其配置D-PHY 模块CSI-2-RX 模块Bayer转RGB模块伽马矫正模块VDMA图像缓存Video Scaler 图像缓存DP 输出 5、vivado工程详解PL端FPGA硬件设计…

【栈与队列面试题】有效的括号(动图演示)

leetcode20.括号匹配问题 前言&#xff1a; &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上栈与队列的面试OJ题目 目录 leetcode20.括号匹配问题 1.问题描…

jmeter接口测试及详细步骤以及项目实战教程

在接口测试项目实战中&#xff0c;JMeter是一款非常强大和流行的自动化测试工具&#xff0c;它可以测试各种类型的应用程序&#xff0c;并通过采样和报告来识别性能瓶颈和API的问题。本文将为你提供一个基于实际项目的JMeter接口测试项目实战教程&#xff0c;指导你如何使用JMe…

性能测试之性能监控和性能优化

目录 一.概述二.jconsole和jvisualvm三.jconsole四.visualvm1.输入命令提示 jvisualvm不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件2.打开jvisualvm里面不包含GC监控 五.性能优化1.优化中间件&#xff08;中间件越多&#xff0c;系统性能越差&#xff09;2.优…

【AIGC专题】Stable Diffusion 从入门到企业级实战0601

一、前言 本章是《Stable Diffusion 从入门到企业级实战》系列的第六部分Prompt专题篇《Stable Diffusion Prompt 专题》第01节 《Stable Diffusion Prompt 通用画风操作实战》。本部分内容&#xff0c;位于整个Stable Diffusion生态体系的位置如下图黄色部分所示&#xff1a;…

重新认识交叉编译

1. 我以前对交叉编译的认知 引用正点原子的话来讲就是: 说得对&#xff0c;但是不全面&#xff0c;直到最近项目中遇到了一个例子我才重新认识什么是交叉编译。 2. build/host/target的概念 参考: Cross-Compilation (automake) 参考: Specifying Target Triplets (Autocon…

leetcode:70. 爬楼梯

一、题目 函数原型&#xff1a;int climbStairs(int n) 二、思路 此题运用递归思想。当只有1个台阶&#xff0c;那么只有1种方法爬到楼顶——跨一个台阶&#xff1b;当有2个台阶时&#xff0c;有2种方法爬到楼顶——跨一个台阶跨两次或直接跨两个台阶。当有3个台阶或更多台阶时…

每日刷题-6

目录 一、选择题 二、算法题 1.Fibonacci数列 2.合法括号序列判断 一、选择题 1、 解析&#xff1a;内联函数是一种可以提高函数执行效率的方法&#xff0c;它的原理是编译时在函数调用点直接展开函数体的代码&#xff0c;从而避免了函数调用的开销。 但是&#xff0c;内联函…