【实用】sklearn决策树怎么导出规则

目录

一、什么是决策树模型

0.1 什么是决策树

02.决策树模型有哪些

二、在sklearn中怎么训练一棵决策树

三、什么是决策树的规则

0.1决策树的决策规则

02. 决策树的决策规则是怎么存储的

四、怎么导出决策树的规则

4.1 导出决策树文本规则

4.2 导出可视化决策树

4.3 导出决策树规则数据

五、如何将决策树规则布署到线上


前言

本文讲述在sklearn训练了决策树模型之后,如何提取决策树规则,包括决策树文本规则,决策树可视化规则和决策树规则数据等等,并进一步简述如何将决策树规则布署到线上的思路

  

本文部分图文借鉴自《老饼讲解-机器学习》


 

一、什么是决策树模型

0.1 什么是决策树

决策树模型是一种用于做分类或回归的模型,它以树形结构表示决策过程的模型。它通常由决策点、策略点(事件点)及结果构成,每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。决策树模型通常以最大收益期望值或最低期望成本作为决策准则,通过图解方式求解在不同条件下各类方案的效益值,然后通过比较,做出决策。决策树模型的优点包括直观、容易解释、对数据的结构和分布不需作任何假设、可以捕捉住变量间的相互作用。

02.决策树模型有哪些

决策树模型有CART和ID3、C4.5等等,它们的特别与关系如下:

  1. ID3算法:ID3算法的核心是在决策树各个节点上应用信息增益准则选择特征,递归地构建决策树。
  2. C4.5算法:C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进:用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足;在树构造过程中进行剪枝;能够处理离散型和连续型的属性;能够处理具有缺失属性值的训练实例。
  3. CART算法:CART假设决策树是二叉树,内部节点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为一系列的不相交的区域,并在这些区域上确定预测的概率分布,也就是输入给定的条件下输出的条件概率分布。

二、在sklearn中怎么训练一棵决策树

在sklearn中,可以使用DecisionTreeClassifier来构建一个决策树模型
下面是一个简单的Demo示例:

from sklearn.datasets import load_iris
from sklearn import tree
#----------------数据准备----------------------------
iris = load_iris()                          # 加载数据
#---------------模型训练----------------------------------
clf = tree.DecisionTreeClassifier(criterion="gini",
                 splitter="best",
                 max_depth=None,
                 min_samples_split=2,
                 min_samples_leaf=1,
                 min_weight_fraction_leaf=0.,
                 max_features=None,
                 random_state=None,
                 max_leaf_nodes=None,
                 min_impurity_decrease=0.,
                 min_impurity_split=None,
                 class_weight=None,
                 presort='deprecated',
                 ccp_alpha=0.0) # sk-learn的决策树模型
clf = clf.fit(iris.data, iris.target)       # 用数据训练树模型构建()
r = tree.export_text(clf, feature_names=iris['feature_names']) #训练好的决策树
#---------------模型预测结果------------------------
text_x = iris.data[[0,1,50,51,100,101], :]
pred_target_prob = clf.predict_proba(text_x)   # 预测类别概率
pred_target = clf.predict(text_x)              # 预测类别

三、什么是决策树的规则

0.1决策树的决策规则

决策树是依赖于树结构进行决策的,如下所示

决策树是一种树形结构,通过一系列的决策过程来对数据进行分类或决策。决策树的决策过程是从根节点开始的,根据某个特征属性的值来选择输出分支,直到到达叶子节点,将叶子节点的类别作为决策结果。每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。

总的来说,决策树就是从根节点逐个条件判断,直到遇到叶子节点,由叶子节点的类别来确定样本的类别。

02. 决策树的决策规则是怎么存储的

必须注意的是,sklearn中的决策树是CART决策树,而CART决策树它是一棵二叉树(ID3,C4.5不是二叉树),这种特殊的结构,使得决策树可以使用左右节点的形式来表示,如下,CART决策树表述模型时,使用的是左右节点的形式

 一个完整的决策树规则和树模型的对应关系如下:

详细可参考老饼的《决策树》系列文章

四、怎么导出决策树的规则

4.1 导出决策树文本规则

可以使用sklearn库中的export_text函数将决策树模型转换为文本规则。

以下是一个简单的示例代码:

from sklearn.tree import DecisionTreeClassifier, export_text  
from sklearn.datasets import load_iris  
  
# 加载数据  
iris = load_iris()  
X = iris.data  
y = iris.target  
  
# 训练决策树模型  
dtc = DecisionTreeClassifier()  
dtc.fit(X, y)  
  
# 导出文本规则  
r = export_text(dtc, feature_names=iris.feature_names)  
print(r)

运行后可以得到结果

4.2 导出可视化决策树

导出可视化决策树可以使用plot_tree,示例如下:

from sklearn.datasets import load_iris
from sklearn import tree
import matplotlib.pyplot as plt

#----------------数据准备----------------------------
iris = load_iris()                          # 加载数据

#---------------模型训练----------------------------------
clf = tree.DecisionTreeClassifier()         # sk-learn的决策树模型
clf = clf.fit(iris.data, iris.target)       # 用数据训练树模型构建()
figure = plt.figure(figsize=(20, 20))
tree.plot_tree(clf)

运行后就可以得到可视化的决策树

4.3 导出决策树规则数据

sklearn中的决策树是CART决策树,主要有如下两类信息:
 👉1. 树结构信息                                                                  
 树结构信息以左右节点编号的形式来表示        
👉2.节点信息                                                                    
 树节点信息包括分割变量、分割修士、不纯度等等

在sklearn中,树结构信息和 节点信息的具体存储如下:
决策树结构信息 
左节点编号  :  clf.tree_.children_left    
右节点编号  :  clf.tree_.children_right  
节点信息   
分割的变量  :  clf.tree_.feature                 
分割的阈值 :  clf.tree_.threshold              
不纯度(gini) :  clf.tree_.impurity             
 样本个数   :  clf.tree_.n_node_samples   
 样本分布   :  clf.tree_.value 

提出决策树规则的示例代码如下:

# -*- coding: utf-8 -*-
from sklearn.datasets import load_iris
from sklearn import tree
import graphviz 
#----------------数据准备----------------------------
iris = load_iris()                          # 加载数据
#---------------模型训练---------------------------------
clf = tree.DecisionTreeClassifier(random_state=0,max_depth=3)        
clf = clf.fit(iris.data, iris.target)     
#---------------树结构可视化-----------------------------
dot_data = tree.export_graphviz(clf) 
graph = graphviz.Source(dot_data)  
graph                                    # 需要独立运行
#---------------提取模型结构数据--------------------------
children_left    = clf.tree_.children_left            # 左节点编号
children_right   = clf.tree_.children_right            # 右节点编号
feature        = clf.tree_.feature               # 分割的变量
threshold       = clf.tree_.threshold              # 分割阈值
impurity       = clf.tree_.impurity               # 不纯度(gini)
n_node_samples   = clf.tree_.n_node_samples            # 样本个数
value         = clf.tree_.value                 # 样本分布

#-------------打印------------------------------
print("children_left:",children_left)        
print("children_right:",children_right)
print("feature:",feature)
print("threshold:",threshold)
print("impurity:",impurity)
print("n_node_samples:",n_node_samples)
print("value:",value)

运行结果如下:

结果里就是决策树的信息了。

五、如何将决策树规则布署到线上

决策树规则布署到线上时,是写一堆if else吗?肯定不是!先不说决策树比较深时难以实现,就说模型不断更换,不就要累死吗?万一写错了怎么办?又提桶跑路吗?

所以更普遍的做法是通过决策树的规则数据,再加以通用性编程,使得数据与程序分离,在替换模型时,只需替换决策树的模型数据就可以。

具体参考老饼的文章,这里不再复述。


如果觉得本文有帮助,点个赞吧!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++入门【3-C++ 变量类型】

C 变量类型 变量其实只不过是程序可操作的存储区的名称。 在 C 中,有多种变量类型可用于存储不同种类的数据。 C 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量…

初学python的体会心得20字,初学python的体会心得2000

大家好,小编来为大家解答以下问题,学了python的心得体会200字,初学python的体会心得20字,现在让我们一起来看看吧! 本学期,我们学习了杨老师的《python语言程序设计》这门课程,其实早在大一期间…

【RTOS学习】模拟实现任务切换 | 寄存器和栈的变化

🐱作者:一只大喵咪1201 🐱专栏:《RTOS学习》 🔥格言:你只管努力,剩下的交给时间! 目录 🏀认识任务切换🏐切换的实质🏐栈中的内容🏐切…

数据可视化:解析跨行业普及之道

数据可视化作为一种强大的工具,在众多行业中得到了广泛的应用,其价值和优势不断被发掘和利用。今天就让我以这些年来可视化设计的经验,讨论一下数据可视化在各个行业中备受青睐的原因吧。 无论是商业、科学、医疗保健、金融还是教育领域&…

Vue2笔记

笔记 脚手架文件结构 ├── node_modules ├── public │ ├── favicon.ico: 页签图标 │ └── index.html: 主页面 ├── src │ ├── assets: 存放静态资源 │ │ └── logo.png │ │── component: 存放组件 │ │ └── HelloWorld.vue …

三天精通Selenium Web 自动化 - 如何找到元素

1. 什么是元素? 元素:HTML 元素 2. 定位方式解析 Selenium WebDriver 提供一个先进的技术来定位 web 页面元素。Selenium 功能丰富的API 提供了多个定位策略如:Name、ID、CSS 选择器、XPath 等等,如下图所示: 一般会用ID来定位…

Jmeter 测试 MQ 接口怎么做?跟我学秒变大神!

MQ(message queue)消息队列,是基础数据结构 先进先出 的一种典型数据结构。一般用来解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。 MQ 主要产品包括:Rabb…

华清作业day45

头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime> #include <QTimer> #include <QTimerEvent> #include <QTextToSpeech> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass…

Unity_ET框架项目-斗地主_启动运行流程

unity_ET框架项目-斗地主_启动运行流程 项目源码地址&#xff1a; Viagi/LandlordsCore: ET斗地主Demohttps://github.com/Viagi/LandlordsCore下载项目到本地。 启动运行步骤&#xff1a; 下载目录如下&#xff1a; 1. VS&#xff08;我用是2022版VisualStudio&#xff09…

2023年第十届GIAC全球互联网架构大会-核心PPT资料下载

一、峰会简介 谈到一个应用&#xff0c;我们首先考虑的是运行这个应用所需要的系统资源。其次&#xff0c;是关于应用自身的架构模式。最后&#xff0c;还需要从软件工程的不同角度来考虑应用的设计、开发、部署、运维等。架构设计对应用有着深远的影响&#xff0c;它的好坏决…

Facebook广告投放常见错误

在进行Facebook广告投放时&#xff0c;很容易犯一些常见的错误。这些错误可能导致广告投资的浪费&#xff0c;影响广告效果并降低回报。本文小编讲一些常见的Facebook广告投放错误&#xff0c;以及如何避免它们。 1、不明确目标受众 广告的成功与否很大程度上取决于你选择的目…

Vue 双向绑定:让数据与视图互动的魔法!(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

一天搞定jmeter入门到入职全套教程之Jmeter分布式测试

随着并发量的增大&#xff0c;一台机器就不能满足需求了&#xff0c;所以我们采用分布式&#xff08;Master-Slaver&#xff09;的方案去执行高并发的测试 注意事项&#xff1a; Master机器一般我们不执测试&#xff0c;所以可以拿一台配置差些的机器&#xff0c;主要用来采集…

Apollo配置发布原理解析

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

C++ //习题2.5 请写出下列表达式的值。

C程序设计 &#xff08;第三版&#xff09; 谭浩强 习题2.5 习题2.5 请写出下列表达式的值。 (1) 3.5 * 3 2 * 7 - ‘a’ (2) 26 / 3 34 % 3 2.5 (3) 45 / 2 (int)3.14159 / 2 (4) a b (c a 6) 设a的初值为3 (5) a 3 * 5, a b 3 * 2 (6) (int)(a 6.5) % 2 …

波奇学Linux:Linux进程状态,进程优先级

编写一个程序模拟进程 查看进程状态 修改代码后发现进程状态为由S变成R R为运行态&#xff0c;S为阻塞态 第一次为S是因为调用了外设&#xff08;printf调用屏幕外设&#xff09;&#xff0c;实际上应该为R&#xff0c;S状态轮换&#xff0c;但是R太快了&#xff0c;所以每次…

使用docker编排容器

使用Dockerfile构建一个自定义的nginx 首先用docker拉一个nginx镜像 docker pull nginx拉取完成后&#xff0c;编辑一个Dockerfile文件 vim Dockerfile命令如下所示,FROM 后面跟的你的基础镜像&#xff0c;而run则是表示你构建镜像时需要执行的指令&#xff0c;下面的指令意…

python pip 相关缓存清理(windows+linux)

pip会大量缓存&#xff0c;如果全部堆在系统盘&#xff0c;会造成别的无法使用 windows和linux通用 一、linux linux是在命令行操作 1.查看缓存位置 pip cache dir我这里默认是在/root/.cache/pip 2.查看大小 du -sh /root/.cache/pip结果如下&#xff1a; 3.清理&#…

matlab 最小二乘拟合空间直线(方法三)

目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示四、相关链接博客长期更新,GPT与爬虫自重,你也未必能爬到最新版本。 一、算法原理 1、算法过程 空间直线的点向式方程为:

Node.js 事件循环简单介绍

1.简介 Node.js 事件循环是 Node.js 运行时环境中的一个核心机制&#xff0c;用于管理异步操作和回调函数的执行顺序。它基于事件驱动模型&#xff0c;通过事件循环来处理和派发事件&#xff0c;以及执行相应的回调函数。 Node.js 是单进程单线程应用程序&#xff0c;但是因为…