【实用】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吗?肯定不是!先不说决策树比较深时难以实现,就说模型不断更换,不就要累死吗?万一写错了怎么办?又提桶跑路吗?

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

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


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

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

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

相关文章

MS1242,替代ADS1242,24bit 高精度、低功耗模数转换器

产品简述 MS1242/MS1243 是一款高精度、宽动态范围、 ∆-Σ 模数转 换芯片,其工作电压为 2.7V 至 5.25V ,可以达到 24bit 无失码转 换,有效精度可达 21bit 。 MS1242/MS1243 可以广泛使用在工 业控制、称重、液体 / 气体化学分析、血液分…

利用Rclone将阿里云对象存储迁移至雨云对象存储的教程,对象存储数据迁移教程

使用Rclone将阿里云对象存储(OSS)的文件全部迁移至雨云对象存储(ROS)的教程,其他的对象存储也可以参照本教程。 Rclone简介 Rclone 是一个用于和同步云平台同步文件和目录命令行工具。采用 Go 语言开发。 它允许在文件系统和云存储服务之间或在多个云存储服务之间…

如何公网访问内网的群晖NAS随时随地远程访问本地存储的学习资源

文章目录 前言本教程解决的问题是:按照本教程方法操作后,达到的效果是前排提醒: 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机:1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

伪原创API,一文快速了解伪原创API

伪原创API,听起来可能对许多人来说是一个陌生的术语。然而,在当今数字化时代,尤其是在内容创作和网络营销领域,伪原创API正逐渐崭露头角。在本文中,我将向您深入介绍伪原创API是什么,以及它如何在实际应用中…

Weblogic CVE-2023-21839(metasploit版)

Step1:用docker搭建环境 Step2:docker查看映射端口 Step3:访问特定端口,然后靶标应用。 Step4:用metasploit进行攻击: 首先,打开metasploit,然后查询需要攻击的板块&#xff0…

Python中的并发编程(3)线程池、锁

concurrent.futures 提供的线程池 concurrent.futures模块提供了线程池和进程池简化了多线程/进程操作。 线程池原理是用一个任务队列让多个线程从中获取任务执行,然后返回结果。 常见的用法是创建线程池,提交任务,等待完成并获取结果&…

内网穿透的应用-如何结合Cpolar内网穿透工具实现在IDEA中远程访问家里或者公司的数据库

文章目录 1. 本地连接测试2. Windows安装Cpolar3. 配置Mysql公网地址4. IDEA远程连接Mysql小结 5. 固定连接公网地址6. 固定地址连接测试 IDEA作为Java开发最主力的工具,在开发过程中需要经常用到数据库,如Mysql数据库,但是在IDEA中只能连接本…

SpringMVC项目出现404

目录 问题讲解: 解决方案: 1、处理器映射器和处理器适配器以及视图解析器没有配置好 2、Controller的包扫描没有加或者包扫描的配置是错误的 3、当然也有说jar包没有 4、请求地址是错误的 5、还有一种解决办法说web.xml配置DispatcherServlet的时…

堪比Postman!实用IDEA插件推荐

Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:Apipost Helper,写完代码就可以调试接口并一键生成接口文档!而且还…

【虹科干货】触发器和函数:让代码更接近数据

文章速览: 触发器和函数的基础知识编写语言:从Lua到JavaScript轻松维护应用程序代码数据库事件实时处理如何操作触发器和函数 一般来说,应用程序处理业务的逻辑,是将执行代码发送到数据库。因此每次执行函数时,代码都…

如何使用iPhone15在办公室远程观看家里群晖nas上的4k电影?

文章目录 1.使用环境要求:2.下载群晖Video Station:3.公网访问本地群晖Video Station中的电影:4.公网条件下使用电脑浏览器访问本地群晖video station5.公网条件下使用移动端(搭载安卓,ios,ipados等系统的设…

Server check fail, please check server xxx.xxx.xxx.xxx,port 9848 is available

记录一次服务调用中的错误 背景:我使用了nacos2.x的版本,同时在同一台服务器的三个docker容器中部署了nacos1、2、3,并将它们连接到了同一个docker网络 错误:Server check fail, please check server xxx.xxx.xxx.xxx,port 9848 …