决策树分箱-特征工程之数据离散化处理-基于python实现

2023-10-30

一、简介


离散化是通过创建一组跨越变量值范围的连续区间将连续变量转换为离散变量的过程。

1.1 离散化有助于处理异常值和高度偏斜的变量

离散化通过将这些值 与分布的剩余内点值一起放入较低或较高的区间来帮助处理异常值。因此,这些异常值观察不再与分布尾部的其余值不同,因为它们现在都在同一个区间/桶中。此外,通过创建适当的 bin 或区间,离散化可以帮助将偏斜变量的值分布在具有相同观察数量的一组 bin 中。

1.2 离散化方法

有几种方法可以将连续变量转换为离散变量。这个过程也称为binning,每个 bin 是每个间隔。离散化方法分为两类:有监督的和无监督的

无监督方法_不使用变量分布以外的任何信息_来创建将放置值的连续箱。

监督方法通常使用目标信息来创建箱或区间。

我们将在本文中仅讨论使用决策树的监督离散化方法

但在进入下一步之前,让我们加载一个我们将在其上执行离散化的数据集。

决策树的离散化

决策树的离散化包括使用决策树来识别确定 bin 或连续间隔的最佳分裂点:

步骤 1:首先,它使用我们想要离散化的变量来训练一个有限深度(2、3 或 4)的决策树来预测目标。

**第 2 步:**然后将原始变量值替换为树返回的概率。单个 bin 内的所有观测值的概率相同,因此用概率替换相当于将决策树决定的截止值内的观测值分组。

好处 :

  • 概率预测返回的决策树与目标单调相关。

  • 新的 bin 显示出减少的熵,这是每个桶/桶内的观察结果与它们自己的相似度,而不是其他桶/桶的观察结果。

  • 树会自动找到垃圾箱。

缺点:

  • 可能会导致过拟合

  • 更重要的是,可能需要对树参数进行一些调整以获得最佳分割(例如,深度、一个分区中的最小样本数、最大分区数和最小信息增益)。这可能很耗时。

让我们看看如何使用Titanic 数据集对决策树_进行离散化_。

1.导入有用的库

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.model_selection import train_test_split

2.加载数据集

data = pd.read_csv('titanic.csv',usecols =['Age','Fare',' 
Survived ']) data.head()

图片

3.将数据分成训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(data[['Age', 'Fare', 'Survived']],data.Survived, test_size = 0.3)

因此,假设我们在数据集中没有缺失值(或者即使我们在数据集中有可用的缺失数据,我们也已经对它们进行了估算)。我离开这部分是因为我的主要目标是展示离散化是如何工作的。

所以,现在让我们可视化我们的数据,以便我们从中获得一些见解并了解变量

4. 让我们使用**_age_**to predict****构建一个分类树**_Survived_**,以便对变量进行离散化**_age_**

tree_model = DecisionTreeClassifier(max_depth=2)tree_model.fit(X_train.Age.to_frame(), X_train.Survived)X_train['Age_tree']=tree_model.predict_proba(X_train.Age.to_frame())[:,1] X_train.head(10)

图片

现在我们有了一个使用age变量来预测Survived变量的分类模型。

新创建的变量Age_tree包含数据点属于对应类的概率

5. 检查变量中存在的唯一值的数量**_Age_tree_**

X_train.Age_tree.unique()

图片

为什么只有四个概率对?

在上面的输入四中,我们提到_max_depth = 2._了深度为 2 的树,进行了 2 次拆分,因此生成了 4 个桶,这就是为什么我们在上面的输出中看到 4 个不同的概率。

6. 检查离散化变量**_Age_tree_**与目标****之间的关系**_Survived_**

fig = plt.figure()
fig = X_train.groupby(['Age_tree'])['Survived'].mean().plot()
fig.set_title('Monotonic relationship between discretised Age and target')
fig.set_ylabel('Survived')

图片

在这里,我们可以看到离散变量和Age_tree目标变量之间的单调关系Survived。该图表明这Age_tree似乎是目标变量的一个很好的预测器Survived

7. 在离散化变量的分布下检查每个概率桶/箱的乘客数量。

X_train.groupby(['Age_tree'])['Survived'].count().plot.bar()

图片

让我们通过捕获每个概率桶的最小和最大年龄来检查树生成的年龄限制桶,以了解桶的截止点。

8.检查树生成的年龄限制桶

pd.concat( [X_train.groupby(['Age_tree'])['Age'].min(),
            X_train.groupby(['Age_tree'])['Age'].max()], axis=1)

图片

因此,决策树生成的水桶:0–1112–1516–63
46–80,用的生存概率0.510.810.370.10分别。

9. 可视化树。

with open("tree_model.txt", "w") as f: 
    f = export_graphviz(tree_model, out_file=f)from IPython.display import Image 
from IPython.core.display import HTML 
PATH = "tree_visualisation.png" 
Image(filename = PATH, width=1000, height=1000)

图片

树可视化

从图中可以看出,我们获得了 4 个 bin max_depth=2

正如我之前提到的,我们可以优化许多参数以使用决策树获得最佳的 bin 分割。下面我将优化树深度进行演示。但请记住,您还可以优化决策树的其余参数。访问sklearn 网站以查看可以优化哪些其他参数。

10.选择树的最佳深度

我将构建不同深度的树,并计算为变量确定的_roc-auc_和每棵树的目标,然后我将选择生成最佳_roc-auc_的深度

score_ls = []     # here I will store the roc auc
score_std_ls = [] # here I will store the standard deviation of the roc_auc
for tree_depth in [1,2,3,4]:
    tree_model = DecisionTreeClassifier(max_depth=tree_depth)
    
    scores = cross_val_score(tree_model, X_train.Age.to_frame(),       
    y_train, cv=3, scoring='roc_auc')   
    
    score_ls.append(np.mean(scores))
    
    score_std_ls.append(np.std(scores))
    
temp = pd.concat([pd.Series([1,2,3,4]), pd.Series(score_ls), pd.Series(score_std_ls)], axis=1)
temp.columns = ['depth', 'roc_auc_mean', 'roc_auc_std']
print(temp)

图片

在这里,我们可以很容易地观察到我们使用深度 1 或 2获得了最佳_roc-auc_。我将选择_深度 2_继续。

11.使用树变换**_Age_**变量

tree_model = DecisionTreeClassifier(max_depth=2)
tree_model.fit(X_train.Age.to_frame(), X_train.Survived)
X_train['Age_tree'] = tree_model.predict_proba(X_train.Age.to_frame())[:,1]
X_test['Age_tree'] = tree_model.predict_proba(X_test.Age.to_frame())[:,1]

‍**12. 检查训练集中变换后的**_age_**变量**

X_train.head()

图片

13. 检查训练集中每个 bin 的唯一值

X_train.Age_tree.unique()

图片

14. 检查测试集中转换后的**_age_**变量

X_test.head()

图片

15. 检查训练集中每个 bin 的唯一值

X_test.Age_tree.unique()

图片

现在,我们已经成功地将Age变量离散为四个离散值,这可能有助于我们的模型做出更好的预测。

如果我们想离散化剩余的变量,如 ,我们也可以执行相同的过程Fare

决策树分箱就会大家介绍到这里,欢迎各位同学报名<python金融风控评分卡模型和数据分析微专业课>,学习更多相关知识
https://edu.csdn.net/combo/detail/1927
在这里插入图片描述
版权声明:文章来自公众号(python风控模型),未经许可,不得抄袭。遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

决策树分箱-特征工程之数据离散化处理-基于python实现 的相关文章

随机推荐

  • The ‘import.meta‘ meta-property is only allowed when the ‘--module‘ option is ‘esnext‘ or ‘system‘

    问题描述 使用vite的import meta const allImage import meta glob assets images console log allImage 报提示 需要配置 module option为exnext
  • 根据fabric官方文档,自己整理hello world的过程中出现的bug

    在对fabric的官方文档下的 fabric samples中的test network项目中的network sh的分析 进行到创建通道时候又出现了之前出现的bug Error got unexpected status BAD REQU
  • mysql查询练习(二)

    11 查询每门课的平均成绩 查询3 105课程的平均分 mysql gt select avg degree from score where cno 3 105 avg degree 81 7500 1 row in set 0 00 s
  • 零拷贝( Zero-copy )

    一 背景 零拷贝 描述了计算机操作 其中CPU 不执行将数据从 一个存储区 复制到 另一个存储区 的任务 通过网络传输文件时 通常用于节省CPU周期和内存带宽 在传统的 Linux 操作系统的标准 I O 接口是基于数据拷贝操作的 即 I
  • C++基本语句(一)

    学习C 的第二天 一 C 的基本语句 1 1声明语句和变量 P21 P22 声明语句和变量 各自的作用是什么 为什么变量必须要声明 以及下面这段代码提供了哪两项信息 定义一个整型变量 int carrots 定义一个整型变量 int car
  • 尤里的复仇Ⅰ 小芳!

    尤里的复仇 小芳 作者 admin 时间 2021 06 15 分类 封神台 第一章 为了女神小芳 找到get参数id 使用 1 1 or 1 1 1 or 1 2 测试 发现存在sql注入 最终payload为 id 1 and 1 2
  • XMind中的 “甘特图”视图

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 甘特图 视图 当所有任务信息添加完成后 点击 任务信息 视图底部的 显示甘特图 按钮 XMind将弹出 甘特图 视图 所有任务信息将不同属性的线条展现 如果此时切换画布或者
  • math模块

    math 模块是Python中的标准模块 并且始终可用 要在此模块下使用数学函数 您必须使用导入模块import math 它提供对基础C库函数的访问 导入数学函数库 import math 查看 math 查看包中的内容 print di
  • C99与C89主要区别

    http www cnblogs com xiaoyoucai p 6146784 html
  • P4162 [SCOI2009]最长距离

    题目链接 这道题数据范围比较小 所以方法还是比较暴力的 思路 先按每个格子的状态 让所有格子与他周围的格子连一条权值为它连向那个格子的值 0或1 然后我们n方枚举所有格子跑最短路 最短路即为从起点到终点的最小障碍数 然后我们枚举所有最短路
  • Spring的两种定时器

    1 spring学习系列 定时器一TimerTask spring定时器一般有两种 TimerTask Quartz 本节只讲TimerTask 需要的包 aopalliance 1 0 jar commons logging 1 1 1
  • 使用html2Canvas跟jspdf将一部分页面生成PDF

    刚好碰到这么一个需求 前端需要将后端返回的json对象数据生成表单样式的pdf文件 首次接触所以简单记录一下 经过反复查找大致流程为 现在页面画一个表单 gt 拿到数据将数据放表单中 gt 给表单最外层加个ref利用html2Canvas生
  • Linux:NTP服务离线安装及配置

    0 常用命令 rpm qa grep ntp 查询已安装的ntp版本信息等 service ntpd status 查询ntp服务状态 service ntpd start 启动 service ntpd stop 停止 service n
  • hack the box - tier0

    Tier0 Meow Recommended Academy Modules INTRO TO ACADEMY STARTING POINT Tier 0 Machines Tags Enumeration Telnet External
  • 嵌入式linux解决方法

    一 问题描述 u boot version 2016 03 ubuntu version 18 04 ubuntu中环境配置正确 通过其他客户端能够挂载上 但是使用uboot得nfs下载命令会报错 gt nfs 80800000 192 1
  • CSS中表格以及表单的属性以及运用

    一 表格 按照一定的顺序摆放数据 表格是由一些单元格组成 1属性 border边框 cellspacing 单元格与单元格之间的距离 cell padding 单元格 边框和内容之间的距离 align 表格水平的位置 tr行 align 调
  • 并发编程NO.2

    并发编程 共享模型之管程 4 1共享资源问题 临界区 一个程序运行多个线程本身是没问题的 问题出在多个线程访问共享资源 多个线程读共享资源没有问题 但是多线程对共享资源进行读写操作 就会有问题 一段代码内如果存在对共享资源的多线程读写操作
  • leetcode 2. 两数相加

    2023 9 14 这道题还是有点难度 需要维护一个进位值 构造一个虚拟头节点dummy 用于结果的返回 还要构造一个当前节点cur 用于遍历修改新链表 整体思路就是长度短的链表需要补0 然后两链表从头开始遍历相加 要考虑进位 需要注意的点
  • [PHP] CURL获取cookie,模拟登录获取数据

    需求 通过CURL先登录 然后获取登录后的cookie 在请求数据接口的时候带上这个cookie即可 直接贴代码 1
  • 决策树分箱-特征工程之数据离散化处理-基于python实现

    一 简介 离散化是通过创建一组跨越变量值范围的连续区间将连续变量转换为离散变量的过程 1 1 离散化有助于处理异常值和高度偏斜的变量 离散化通过将这些值 与分布的剩余内点值一起放入较低或较高的区间来帮助处理异常值 因此 这些异常值观察不再与