前端未来的主流技术方向有哪些?腾讯、京东、同城旅行等大厂都是怎么布局的?戳此了解 了解详情
写点什么

如何用 Python 构建一个决策树

2021 年 7 月 30 日

如何用Python构建一个决策树

本文最初发布于 Medium 网站,经原作者授权由 InfoQ 中文站翻译并分享。


决策树是一个经久不衰的话题。本文要做的是将一系列决策树组合成一个单一的预测模型;也就是说,我们将创建集成方法(Ensemble Methods)的模型。


决策树是准确度最高的预测模型之一。想象一下同时使用多棵树能把预测能力提高到多高的水平!


一些集成方法算法的预测能力超过了当今机器学习领域的一流高级深度学习模型。此外,Kaggle 参赛者广泛使用集成方法来应对数据科学挑战。


集成方法以相对较低的复杂性提供了更高水平的准确度。决策树模型和决策树组构建、理解和解释起来都很容易。我们将在另一篇文章中谈论宏伟的随机森林,因为它除了作为机器学习的模型外,还广泛用于执行变量选择!我们可以为机器学习模型的预测变量(predictor)选择最佳的候选变量。

Jupyter 笔记本


请查看Jupyter笔记本,了解我们接下来要介绍的构建机器学习模型的概念,也可以参阅我在Medium中写的其他数据科学文章和教程。


我们在本文中要做的是用 Python 构建一个决策树。实践中会有两棵树:一棵树基于熵,另一棵树基于基尼系数。

安装包


第一步是安装 pydot 和 Graphviz 包来查看决策树。如果没有这些包,我们就只有模型了——我们想更进一步,分别考虑用熵和基尼系数计算值的决策树。


命令!表示它将在操作系统上运行。它是一种快捷方式,所以我们不必离开 Jupyter 并打开终端。


!pip install --upgrade pydotRequirement already satisfied: pip in c:\users\anell\appdata\local\programs\python\python38\lib\site-packages (21.1.3)
!pip install --upgrade graphvizRequirement already satisfied: graphviz in c:\users\anell\appdata\local\programs\python\python38\lib\site-packages (0.16)
复制代码


如果我们在 Windows 上安装 Graphviz 时遇到问题,可以在终端上运行!conda install python-Graphviz 命令。


#!pip install graphviz# You may need to run this command (CMD) for windows#!conda install python-graphviz# Documentation http://www.graphviz.org
复制代码


Graphviz 是一个图形可视化包。计算图是一种具有节点和边的结构;也就是说,实际的决策树是一个计算图。


导入很多包


我们需要 Pandas 来创建 Datarame 格式的结构。我们将使用 DecisionTreeClassifier,即在 Scikit Learn 的树包中实现的决策树算法。另外,我们需要 export_graphviz 函数将决策树导出为 Graphviz 格式,然后使用 Graphviz 来可视化这个导出。


如果我们想看到这棵树,到这里它还没准备好!我们需要创建模型,以图格式导出模型,并使用 Graphviz 才能看到它。


# Importing packagesimport pandas as pdfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.tree import export_graphvizimport pydotimport graphviz
复制代码

创建数据集


接下来我们创建一个数据集,它实际上是一个字典列表。


# Creating a datasetinstances = [{'Best Friend': False, 'Species': 'Dog'},{'Best Friend': True, 'Species': 'Dog'},{'Best Friend': True, 'Species': 'Cat'},{'Best Friend': True, 'Species': 'Cat'},{'Best Friend': False, 'Species': 'Cat'},{'Best Friend': True, 'Species': 'Cat'},{'Best Friend': True, 'Species': 'Cat'},{'Best Friend': False, 'Species': 'Dog'},{'Best Friend': True, 'Species': 'Cat'},{'Best Friend': False, 'Species': 'Dog'},{'Best Friend': False, 'Species': 'Dog'},{'Best Friend': False, 'Species': 'Cat'},{'Best Friend': True, 'Species': 'Cat'},{'Best Friend': True, 'Species': 'Dog'}]
复制代码

转换为数据帧


我们来转换这些数据,将其格式化为 DataFrame。


# Turning the Dictionary into DataFramedf = pd.DataFrame(instances)df
复制代码



这样我们就有了一个 DataFrame,用它可以判断某个物种是否适合成为人类最好的朋友。一会儿我们将通过决策树进行分类。

拆分数据


接下来我们划分训练数据和测试数据。本例中我们使用 List Comprehension,根据括号内的条件将数据转换为 0 或 1:


# Preparing training and test dataX_train = [[1] if a else [0] for a in df['Best Friend']]y_train = [1 if d == 'Dog' else 0 for d in df['Species']]
labels = ['Best Friend']
print(X_train)[[0], [1], [1], [1], [0], [1], [1], [0], [1], [0], [0], [0], [1], [1]]
print(y_train)[1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1]
复制代码


我们将输入数据和输出值转换为 0 或 1 的表示——机器学习算法处理数字是最擅长的。


这样,我们将值转换成了 X 输入值和目标 y 目标值,因为我们在一个循环结构中构造了变量 X。接下来,我们遍历 Best Friend 列的每个元素来表示输入变量,并将其放入变量 a 和变量 d 中。


我们使用代码将值转换为文本,并转换为数字表示以呈现给机器学习模型。


构建机器学习模型并非易事。它涉及不同领域的一系列知识,以及构成这一切基础的数学和统计学背景。此外,它还需要计算机编程知识和对我们正在研究的语言包、业务问题的知识、数据的预处理的理解。


也就是说,构建机器学习模型的过程涉及多个领域。到目前为止,我们已经准备好了数据,虽然我们还没有准备好测试数据来制作熵和基尼系数的模型。


我们不会在这里评估模型,所以不需要测试数据。因此,我们获取所有数据并将它们作为 X 和 y 的训练数据。


必须记住,如果我们评估模型,就需要测试数据。由于我们这里不会进行评估,因此我们只会使用训练数据,也就是整个数据集。

构建树模型


在这个阶段,我们已经构建了模型,其中第一阶段定义了 model_v1 对象,然后使用 model_v1.fit()训练模型。


model_v1 = DecisionTreeClassifier(max_depth = None,max_features = None,criterion = 'entropy',min_samples_leaf = 1,min_samples_split = 2)
复制代码


Python 是面向对象的编程。DecisionTreeClassifier 函数实际上是一个类,它创建该类的一个实例——一个对象。当我们调用 DecisionTreeClassifier 类时,它将依赖几个参数来定义要在 sklearn 文档中查询的​​算法行为。


我们在这里使用熵作为标准。至于我们未能指定的参数,算法都认为是默认的。



那么这个对象就会有方法和属性,fit()是应用于 model_v1 对象进行模型训练的方法:


# Presenting the data to the Classifiermodel_v1.fit(X_train, y_train)DecisionTreeClassifier(criterion='entropy')
复制代码


创建变量


在这里,我们定义了一个名为 tree_model_v1 的变量,它位于我们现在所在的目录中。


# Setting the file name with the decision treefile = '/Doc/MachineLearning/Python/DecisionTree/tree_model_v1.dot'
复制代码


定义文件变量后,我们将调用从 model_v1 计算图中提取的 export_graphviz,即决策树。我们打开整个文件,并记录计算图的所有元素:


# Generating the decision tree graphexport_graphviz(model_v1, out_file = file, feature_names = labels)with open(file) as f:dot_graph = f.read()graphviz.Source(dot_graph)
复制代码


将点文件转换为 png


在上面,我们有了计算图格式的树。如果你想以 png 格式写入此树:


!dot -Tpng tree_model_v1.dot -o tree_model_v1.png
复制代码

演绎


层次结构的顶部是 Best Friend。在本例中我们只有一个变量。请注意,该算法计算的熵为 0.985,并且仍会计算其他集群的熵。


[8,6]的第一组和 14 个样本通过熵呈现出最高的信息增益。基于此,我们有了一个位于熵计算层次结构顶部的节点。


该算法遍历了所有数据示例,进行了熵计算,并找到了最佳组合——具有最高熵的属性到达顶部并创建了我们的决策树级别。

第二版模型


另一种方法是使用另一个标准代替基于熵的决策树创建相同的模型,我们将使用基尼系数。


要只使用基尼系数构建相同的树,就是要更改标准,删除标准参数:


model_v2 = DecisionTreeClassifier(max_depth = None,max_features = None,min_samples_leaf = 1,min_samples_split = 2)
复制代码


当我们移除标准参数时,算法会考虑应用基尼系数。我们有一个有趣的参数叫做 max_depth。在其中我们可以定义树的最大深度。在我们的例子里它没有意义,因为我们只有一个变量;但如果我们有几十个输入变量,max_depth 会很有用。


当我们有很多输入变量时,树的深度会很大,这会带来过拟合的问题。因此我们在构建模型时要定义树的深度。


由于我们有很多参数,找到构建算法的最佳参数组合是一项复杂的任务!在以自动化方式测试多个参数组合时,我们可以使用需要大量计算资源的交叉验证。


我们还有 min_samples_leaf 表示决策树的最低级别:叶节点所需的最小样本数,就是说它会考虑用多少次观察来构建决策树的最低节点。


最后,参数 min_samples_split 是拆分一个内部节点所需的最小样本数。在决策树中,我们有作为顶部的根节点、作为树基部的顶部节点,和中间节点。这样我们就可以简单地调整这些参数来定义如何构建所有节点。

训练基尼版本

# Presenting the data to the Classifiermodel_v2.fit(X_train, y_train)
复制代码


我们再次生成文件参数:


# Setting the file name with the decision treefile ='/User/Documents/MachineLearning/DecisionTree_tree_model_v1.dot''
复制代码


我们提取了模型的计算图:



本文中我们用同样的方式创建了两颗树。我们分别使用了熵和基尼系数来计算。两棵树的区别在于用于定义节点组织的标准。它们没有高下之分,都可以很有趣,具体则取决于上下文、数据和业务问题。


我们建议创建同一模型的多个版本并评估最佳性能。


!dot -Tpng tree_model_v2.dot -o tree_model_v2.png
复制代码


最后,我们保存了决策树的出口。我希望这篇文章对你有所帮助。感谢你的阅读。


原文链接:


https://levelup.gitconnected.com/how-to-build-a-decision-tree-model-in-python-75f6f3af159d

2021 年 7 月 30 日 15:066
用户头像
刘燕 InfoQ记者

发布了 644 篇内容, 共 200.8 次阅读, 收获喜欢 1231 次。

关注

评论

发布
暂无评论
发现更多内容

纯干货!腾讯云大神亲码“redis深度笔记”,不讲一句废话,学完直接完善简历

神奇小汤圆

Java redis 程序员 架构 面试

一文通关苦涩难懂的Java泛型

程序猿阿星

泛型 java基础 Java泛型

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

周老师

Java 编程 程序员 架构 面试

iOS 面试策略之经验之谈-面向协议的编程

iOSer

ios swift 面试 面向协议protocol编程 面向协议编程

阿里P9架构师力荐:Java面试必刷的17套一线大厂真题(含答案)

Java架构追梦

Java 阿里巴巴 架构 腾讯 面试

40K+Star!Mall电商实战项目开源,附源码、教程合集

周老师

Java 编程 程序员 架构 面试

打造生态“朋友圈”,英特尔以生态之道培育AI创新“大气候”

新闻科技资讯

Led户外广告大屏助力直播热度升级

󠀛Ferry

5月日更

​现货量化交易系统搭建,量化马丁倍投策略交易系统开发

WX13823153201

2021饮食品牌户外投放猛增?年入20亿!卫龙辣条:刷屏级户外地标广告

󠀛Ferry

5月日更

hive的DDL语法基本操作

大数据技术指南

hive 5月日更

Django 之路由篇

若尘

django Python编程 路由 5月日更

二本5年Java经验,7面阿里侥幸上岸,入职就是38*16K,还原现场经历

神奇小汤圆

Java 程序员 架构 面试

助力秋招第二弹:Java并发编程知识梳理

北游学Java

Java 面试 秋招

工业绿色发展可视化管理——高炉炼铁厂可视化系统

一只数据鲸鱼

数据可视化 工业物联网 智慧工厂 三维可视化 高炉炼铁

堪称最完整的Java知识笔记(基础+进阶+架构+算法+网络)

Crud的程序员

Java 程序员 架构

京东内部的这份SpringBoot京东商城项目手册,竟遭黑客强行开源?

马小晴

编程 Spring Boot Java 25 周年

提高建模效率:自动化机器学习之贝叶斯优化综述

索信达控股

机器学习 自动化 金融科技 贝叶斯公式 产品建模

涨薪20k!华为内部分享的Java RMI笔记爆火Github,原理实践双飞

java专业爱好者

Java RIM

意外发现GitHub 星标35k+ 435页网络协议深度笔记,出自华为架构

周老师

Java 编程 程序员 架构 面试

将模型转为NNIE框架支持的wk模型第一步:tensorflow->caffe

华为云开发者社区

tensorflow caffe NNIE框架 wk模型 mxnet

“零信任产业标准工作组”再度升级,持续促进国内零信任产业的协同发展

Geek_459987

农产品区块链溯源平台建设解决方案,健全食品安全体系

源中瑞-龙先生

区块链 溯源 食品安全

强劲性能释放释放:联想消费新品笔记本震撼发布

新闻科技资讯

(零基础教学系列)手把手教你分析APT:蔓灵花下载器样本分析

代码熬夜敲

人工智能 数据库 网络安全 信息安全 渗透测试

iOS 面试策略之经验之谈-架构的选择

iOSer

ios 架构

iOS 面试策略之经验之谈- App的测试和上架

iOSer

ios 面试 app上架 app测试

iOS面试大全从面试的准备和流程到算法和数据结构以及计算机基础知识

iOSer

ios 面试 面向协议protocol编程 iOS 知识体系

在Alibaba广受喜爱的“Java突击宝典”简直太牛了

周老师

Java 编程 程序员 架构 面试

不同数据库模式下DATE类型的行为解析

华为云开发者社区

MySQL oracle GaussDB(DWS) TD DATE类型

ipfs有什么用?ipfs有什么价值?

投资矿机v:IPFS1234

ipfs有什么用 ipfs有什么价值

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

如何用Python构建一个决策树-InfoQ