数据分箱3——决策树分箱(有监督)

2023-11-20

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

sklearn的决策树文档:https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html

方法:

def decision_tree_binning(x_value: np.ndarray, y_value: np.ndarray, max_bin=10) -> list:
    '''利用决策树获得最优分箱的边界值列表'''
    from sklearn.tree import DecisionTreeClassifier

    clf = DecisionTreeClassifier(
        criterion='entropy',  # “信息熵”最小化准则划分
        max_leaf_nodes=max_bin,  # 最大叶子节点数
        min_samples_leaf=0.05)  # 叶子节点样本数量最小占比
    clf.fit(x_value.reshape(-1, 1), y_value)  # 训练决策树

    # 根据决策树进行分箱
    n_nodes = clf.tree_.node_count  # 决策树节点
    children_left = clf.tree_.children_left
    children_right = clf.tree_.children_right
    threshold = clf.tree_.threshold

    # 开始分箱
    boundary = []
    for i in range(n_nodes):
        if children_left[i] != children_right[i]:  # 获得决策树节点上的划分边界值
            boundary.append(threshold[i])

    boundary.sort()

    min_x = x_value.min()
    max_x = x_value.max()
    # max_x = x_value.max() + 0.1  # +0.1是为了考虑后续groupby操作时,能包含特征最大值的样本
    boundary = [min_x] + boundary + [max_x]
    return boundary

示例代码

import pandas as pd
import numpy as np
from sklearn.datasets import make_classification


def decision_tree_binning(x_value: np.ndarray, y_value: np.ndarray, max_bin=10) -> list:
    '''利用决策树获得最优分箱的边界值列表'''
    from sklearn.tree import DecisionTreeClassifier

    clf = DecisionTreeClassifier(
        criterion='entropy',  # “信息熵”最小化准则划分
        max_leaf_nodes=max_bin,  # 最大叶子节点数
        min_samples_leaf=0.05)  # 叶子节点样本数量最小占比
    clf.fit(x_value.reshape(-1, 1), y_value)  # 训练决策树

    # 绘图
    import matplotlib.pyplot as plt
    from sklearn.tree import plot_tree
    plt.figure(figsize=(14, 12))  # 指定图片大小
    plot_tree(clf)
    plt.show()

    # 根据决策树进行分箱
    n_nodes = clf.tree_.node_count  # 决策树节点
    children_left = clf.tree_.children_left
    children_right = clf.tree_.children_right
    threshold = clf.tree_.threshold

    # 开始分箱
    boundary = []
    for i in range(n_nodes):
        if children_left[i] != children_right[i]:  # 获得决策树节点上的划分边界值
            boundary.append(threshold[i])

    boundary.sort()

    min_x = x_value.min()
    max_x = x_value.max()
    # max_x = x_value.max() + 0.1  # +0.1是为了考虑后续groupby操作时,能包含特征最大值的样本
    boundary = [min_x] + boundary + [max_x]
    return boundary


if __name__ == '__main__':
    data_x, data_y = make_classification(n_samples=10000, n_classes=4, n_features=10, n_informative=8, random_state=0)
    bin_result = decision_tree_binning(data_x[:, 0], data_y, max_bin=6)
    bin_value = pd.cut(data_x[:, 0], bin_result).codes  # 分箱的结果

其中:bin_result的结果是:[-7.098299649843083, -2.204209089279175, -0.8099622428417206, 0.4798355847597122, 1.7192054390907288, 2.9111276865005493, 7.604884316749503]

可以得到决策树的结点图:

在这里插入图片描述

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

数据分箱3——决策树分箱(有监督) 的相关文章

  • Android Studio 中模拟器无法打开,提示Error launching emulator

    一 遇到的问题 运行模拟器时 提示 Error launching emulator 二 解决方法 打开SDK Manager 点击取消Android Emulator 然后重新运行 会提示下载一些文件 按着操作即可 如果没问题就不需要取消
  • 深入解析String intern()

    在 JAVA 语言中有8中基本类型和一种比较特殊的类型String 这些类型为了使他们在运行过程中速度更快 更节省内存 都提供了一种常量池的概念 常量池就类似一个JAVA系统级别提供的缓存 8种基本类型的常量池都是系统协调的 String类

随机推荐

  • Python3.8安装tensorflow

    我现在的版本是3 8 8 64 bit 编辑器是Visual Studio Code 之前试过好多次都失败了 都是因为Python的版本和tensorflow版本的各种问题 后来下过anaconda 用不习惯 还是回来捯饬Visual St
  • onenote导入html文件,office js - OneNote Add in: Getting HTML content - Stack Overflow

    In the example code is provided to get RichText It is able to get the plain text content of the page but I cannot seem t
  • css之id选择器和class类选择器

    一 css基础 css定义 可以设置网页中的样式 外观 美化 css中文名字 级联样式表 层叠样式表 样式表 二 css基础语法 1 style标签写在title标签后面 2 选择器 属性名1 属性值1 属性名2 属性值2 color 代表
  • leetcode第8场双周赛

    这次双周赛有意外 第二第三题按照提示返回int 会报错 要返回List 第一题 给你一个字符串 S 返回只含 单一字母 的子串个数 示例 1 输入 aaaba 输出 8 解释 只含单一字母的子串分别是 aaa aa a b aaa 出现 1
  • axios和Ajax

    Ajax 由客户端请求ajax引擎 再由ajax引擎请求服务器 服务器作出一系列响应之后返回给ajax引擎 由ajax引擎决定将这个结果写入到客户端的什么位置 实现页面无刷新更新数据 创建Ajax步骤 1 创建异步对象 2 设置回调函数 U
  • 在ubuntu18.04上搭建的海思Hi3516EV200的编译环境

    准备工作 下载交叉编译工具 百度网盘 https pan baidu com s 1AL3EztPUpWZOpxdbyEnI w 提取码 w2k7 ubuntu版本 uname v 55 18 04 1 Ubuntu SMP Mon Jun
  • matlab 计算点云中值

    目录 一 概述 1 算法概述 2 主要函数 二 代码示例 三 结果展示 四 参数解析 输入参数 输出参数 五 参考链接 本文由CSDN点云侠原创 原文链接 如果你不是在点云侠的博客中看到该文章 那么此处便是不要脸的爬虫 一 概述
  • Git的使用(gitbash命令创建版本库)

    1 git的安装 msysgit gitbash 2 创建repository 路径名不要含有中文 pwd 查看当前路径 cd mkdir gitLearn 创建目录 cd gitLearn 进入路径 git INIT 初始化 编程git可
  • 如何替换对象的key值

    发生的场景 现在用antd组件库 有些组件想渲染数据的话 我要根据他们官网给的字段名称对应起来才能渲染上去 这个是复选框选中 保存的时候 字段需要按照后台约定的传入code value 1 常规循环遍历 大招来了 哈哈哈 才疏学浅 我觉得是
  • Python学习----第十章--文件和异常及json

    1 读取文件 lstrip 删除左边空白符 rstrip 删除右边空白符 strip 删除两端空白符 window 读取文件可以用 但是在字符串中 是被当作转义字符来使用 经过转义之后可能就找不到路径的资源了 例如 t会转义为tab键 这里
  • Protobuf安装步骤

    今天看Brpc开源代码的时候 看到了里面提到了google开源的protobuf的数据序列化和反序列工具 所以特地下了源码 试着看下一个简单的使用过程 1 protobuf的介绍 google protobuf是一个灵活的 高效的用于序列化
  • 【python】调用Matplotlib库绘制扇形图(饼图)

    代码部分 扇形图 import matplotlib pyplot as plt import matplotlib as mpt mpt rcParams font family fangsong labels apple orange
  • GIT高级使用技巧

    GIT高级使用技巧 导出GIT日志到文件 按照 lt 哈希 gt lt 作者名 gt lt 作者邮箱地址 gt lt 作者日期 gt
  • 零基础新手小白学编程必会的100个代码

    前言 我记得刚开始接触编程的时候 觉得太难了 也很好奇 写代码的那些人也太厉害了吧 全是英文的 他们的英文水平一定很好吧 他们是怎么记住这么多代码格式的 而且错了一个标点符号 整个程序都会有影响 一个程序几千行 错一个标点符号都不行这也太难
  • leetcode-分割字符串的方案数

    给你一个二进制串 s 一个只包含 0 和 1 的字符串 我们可以将 s 分割成 3 个 非空 字符串 s1 s2 s3 s1 s2 s3 s 请你返回分割 s 的方案数 满足 s1 s2 和 s3 中字符 1 的数目相同 由于答案可能很大
  • 密码学理论10:密钥管理和公钥革命

    加密密钥分发 对称密码 依赖于秘密密钥的安全分发 需要存储和管理大量密钥 在开放 公共系统中遇到严重问题 部分解决方案 密钥分发中心 KDC 某些服务器 密钥分发中心 KDC 将密钥 提供 给用户 它与每个用户共享一个秘密密钥 长期密钥 并
  • 计算机系统攻击 ms17-010漏洞利用技术 永恒之蓝复现

    概述 MS17 010是指微软于2017年发布的一个安全公告编号为MS17 010的漏洞 也被称为 EternalBlue 该漏洞影响了微软的Windows操作系统 并且被发现可被利用来进行远程代码执行攻击 这个漏洞的危险性在于它允许攻击者
  • 基于Docker搭建FastDFS分布式文件系统

    1 镜像拉取 docker pull morunchang fastdfs 2 运行 docker run d name tracker net host morunchang fastdfs sh tracker sh 3 运行stora
  • Python下拉选框

    看了我密码器讲解的朋友们一定知道 里面有个叫下拉选框的知识 今天我就来讲讲下拉选框 from PyQt5 QtWidgets import QWidget QLabel QComboBox QApplication import sys c
  • 数据分箱3——决策树分箱(有监督)

    思路比较简单 将某一列数据作为训练集 将label作为结果 直接训练一个决策树 然后根据决策树的分裂节点的阈值作为分箱的依据 sklearn的决策树文档 https scikit learn org stable modules gener