思路比较简单:将某一列数据作为训练集,将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 DecisionTreeClassifierclf = 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_leftchildren_right = clf.tree_.children_rightthreshold = 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_classificationdef decision_tree_binning(x_value: np.ndarray, y_value: np.ndarray, max_bin=10) -> list:'''利用决策树获得最优分箱的边界值列表'''from sklearn.tree import DecisionTreeClassifierclf = 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 pltfrom sklearn.tree import plot_treeplt.figure(figsize=(14, 12))  # 指定图片大小plot_tree(clf)plt.show()# 根据决策树进行分箱n_nodes = clf.tree_.node_count  # 决策树节点children_left = clf.tree_.children_leftchildren_right = clf.tree_.children_rightthreshold = 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 boundaryif __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]

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

数据分箱3——决策树分箱(有监督)相关推荐

  1. 特征工程之特征分箱(决策树分箱、卡方分箱、bestks以及评价标准WOE和IV)

    特征工程之特征分箱:决策树分箱.卡方分箱.bestks以及评价标准 1.WOE和IV 2.无监督分箱 2.1等频分箱 2.2等距分箱 3.有监督分箱 3.1决策树分箱 3.2best-ks分箱 3.3 ...

  2. python决策树分箱_快速分箱方法

    python 分箱的一种方法 2018.08.02 R语言中有smbining可以进行最优分箱,python中分箱如果既要考虑箱体个数,分箱后信息量大小,也要考虑单调性等其他因素. 这里给出一种简单的 ...

  3. 等距离分箱matlab代码,数据挖掘实验(二)数据预处理【等深分箱与等宽分箱】...

    本文代码均已在 MATLAB R2019b 测试通过,如有错误,欢迎指正. 一.分箱平滑的原理 (1)分箱方法 在分箱前,一定要先排序数据,再将它们分到等深(等宽)的箱中. 常见的有两种分箱方法:等深 ...

  4. 数据分箱——KS分箱/卡放分箱

    目录 1.前言 2.定义 3.分箱的用处 4.分箱方法 4.1 KS分箱 变量的KS值 Best-KS分箱 4.2卡方分箱 1.前言 评分卡建模在金融行业应用得比较广泛,比如对客户的信贷诚信度进行评分 ...

  5. python woe分箱_python自动分箱,计算woe,iv的实例代码

    笔者之前用R开发评分卡时,需要进行分箱计算woe及iv值,采用的R包是smbinning,它可以自动进行分箱.近期换用python开发, 也想实现自动分箱功能,找到了一个woe包,地址https:// ...

  6. 风控场景下的常用特征分箱介绍:BestKs分箱、卡方分箱、聚类分箱等

    介绍分箱方法之前,首先要了解为什么分箱? 分箱的好处: 1.分箱后的特征对异常数据有更强的鲁棒性.比如年龄中有一个异常值为300,分箱之后就可能划到>80这一箱中,而如果直接入模的话会对模型造成 ...

  7. python 等深分箱 等宽分箱结合二分箱的数据分析

    python 等深分箱 等宽分箱结合二分箱的数据分析 等深分箱等宽分箱概述 Python里可以通过pcut(等深分箱即每箱的样本量基本一致)和cut(等宽分箱即样本量之间有相同的宽度)对样本进行分箱. ...

  8. python分箱代码_python分箱_python 分箱_python等宽分箱 - 云+社区 - 腾讯云

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我有一个数据框列与数字值: df.head()46. 544.2100.042. ...

  9. R语言ggplot2可视化:可视化箱图、在箱图中添加抖动数据点(Dot + Box Plot)、自定义抖动数据点的大小、颜色、数据点分布在箱图中间、添加主标题、副标题、题注信息

    R语言ggplot2可视化:可视化箱图.在箱图中添加抖动数据点(Dot + Box Plot).自定义抖动数据点的大小.颜色.数据点分布在箱图中间.添加主标题.副标题.题注信息 目录

最新文章

  1. 应该始终以PreparedStatement代替Statement
  2. 大数据量下的sort
  3. linux 搜索文件名中非,Linux服务器中非 root 用户安装(多版本) CUDA 和 cuDNN
  4. JWT令牌的秘密轮换
  5. 计算机网络路由器方面的论文,简析计算机网络问题中路由器故障的论文
  6. echart 饼图每一块间隙_日本人用豆奶做威化饼,奶香十足、不甜腻,好吃!
  7. 如何查看mysql数据库的端口
  8. 【风电功率预测】基于matlab BP神经网络风电功率预测【含Matlab源码 399期】
  9. 计算机组成与体系结构——指令的基本概念——2020.11.19
  10. 声纹识别技术的现状、局限与趋势
  11. 一键在线生成朋友圈转发点赞截图教程
  12. C# MES系统结构梳理
  13. SSH、SSL、TSL
  14. Win7怎么开启或关闭dep数据执行保护
  15. 一次简单的PC游戏汉化
  16. k3595参数_常用三极管参数指标
  17. TimesTen IX锁及用途介绍[TimesTen运维]
  18. 图像特征描述子——Susan
  19. 窗口DEA及matlab应用,文后有网盘链接
  20. android面试资料

热门文章

  1. accept 返回0_使用Vue3.0新特性造轮子 WidgetUI3.0 (Upload上传文件组件)
  2. QR code 二维码基础入门教程(三)
  3. C# DataTable 用法
  4. c++中字符输入函数getline、cin.getline区分
  5. Fragment容器Activity
  6. 可执行镜像——开发环境的Docker化之路
  7. infinite-scroll学习(二)
  8. Java盲点:双重检查锁定及单例模式
  9. python内核死亡的原因_Python xgboost:内核死亡
  10. python return用法_遗传算法(Python) #4 DEAP框架入门