还在为如何抉择而感到纠结吗?快采用决策树(Decision Tree)算法帮你做出决定吧。决策树是一类非常强大的机器学习模型,具有高度可解释的同时,在许多任务中也有很高的精度。决策树在机器学习模型领域的特殊之处在于其信息表示的很清楚,而不像一些机器学习方法是个黑匣子,这是因为决策树通过训练学到的“知识”直接形成层次结构,该结构以这样的方式保存和显示学到的知识,即使是非专业人士也可以容易地弄明白。

现实生活中的决策树

在现实生活中,我们常常用过类似于决策树的方式来决定自己的生活。例如,决定周末安排什么样的活动。采取怎样的活动可能取决于一些因素,比如是否愿意和朋友一起出去或独自度过周末、周末的天气如何等。假设就这两个因素影响你做出决定的话,如果天气晴朗,并且你的朋友可以一起参与,那么你可能想踢足球。如果是下雨天,可能会一起去看电影。如果朋友有事无法参加,那么无论天气如何,可能会去看会书、玩会电子游戏。

这就是现实中的一个明显的决策树例子,上述已经构建了一个树来模拟一组顺序的、层次化的决策,最终得到一个结果。这里,为了保持树的小巧,还选择了相当“高级”的决策。例如,如果为天气设置了许多可能的选项,例如晴天(25度)、下雨(25度)、晴天(26度)、下雨(26度)、晴天(27度)...... 等等,这样会使得树尺寸会很大,这种精确的温度对于最后做出的决策没有太相关的关系,因为只是想知道是外界是否下雨,根据下雨的情况决定是否外出,而温度的高低对其影响很小。当然,极寒极热天气还是在家比较舒服。
       机器学习中的决策树的概念和上面的思想是相同的,需要构建一个具有一组分层决策的树,最终给出决策结果,即分类或回归预测。尽可能使得决策树尺寸较小,同时要实现高分类/回归准确性。

机器学习中的决策树

决策树模型的构建一般分为两个步骤:归纳(induction)和修剪(pruning)。归纳是实际构建树的步骤,即根据我们的数据设置所有的分层决策边界。但由于训练决策树的性质,树模型可能容易出现严重的过拟合现象。这个时候就需要采用修剪处理,修剪就是从决策树中删除不必要的分支结构的过程,有效地降低了对抗过拟合的复杂性,并使其更容易解释。

归纳|Induction

从高层次来看,决策树归纳需要经过4个主要步骤:

  • 训练数据集应具有一些特征变量、分类或回归输出;
  • 确定数据集中的“最佳特征”以分割数据;
  • 将数据拆分为包含此最佳特征的可能值的子集,这种分裂基本上定义了树上的节点,即每个节点是基于数据中的某个特征的分裂点;
  • 使用从步骤3创建的数据子集递归地生成新的树节点,保持分裂直到达到一个优化点,在该点已经通过某种度量优化了最大精度,同时最小化了分裂/节点的数量。

第1步很简单,只需好好分析数据集。对于步骤2,通常使用贪婪算法来选择要使用的特征和特定分割,以最小化代价函数。构建决策树时执行的拆分相当于划分特征空间。我们将迭代地尝试不同的分割点,最后选择成本最低的分割点。也可以只在数据集中的值范围内进行拆分,这将使得我们免于浪费计算来测试那些表现差的分裂点。
       对于回归树,可以使用简单的平方误差作为模型的代价函数:

其中,Y是期望输出,Y-hat是预测值,对数据集中的所有样本求和以获得总误差。对于分类,使用的是基尼指数函数(Gini Index Function):

其中pk是特定预测节点中第k类的训练实例样本的比例。理想情况下, 节点的错误值应为零,这意味着每个拆分输出的类正是我们想要的,一旦到达那个特定的决策节点,无论处于决策边界的这一边还是另一边,其输出也确定好了。
       在数据集中具有单个分类的概念被称为信息增益。以下是举例:

如果选择了某种划分,其中每个输出根据输入数据混合类别,这种情况实际上根本没有获得任何信息; 另一方面,如果采取的分割对于每个输出的类的正确率都很高,那么已经获得 了在具体特征变量上以特定方式分割的信息。
       之后是对树模型进行分裂,直到树有数千个分支,但这不是一个好主意!这样得到的决策树将是巨大的、缓慢的,并且会过拟合训练数据集。因此,需要设置一些预定义的停止标准来停止树的构造。
       最常见的停止方法是对分配给每个叶节点的训练样本的数量使用最小数量。如果计数小于某个最小值,则不接受拆分,并将该节点作为最终叶节点。如果所有的叶子节点都成为最终节点,则训练停止。较小的最小数量将提供更精细的分割和信息,但也容易过拟合训练数据。因此,最小数量的取值通常基于数据集设置,具体取决于每个类中预计有多少个示例样本。

修剪|Pruning

由于训练决策树的性质,可能容易会出现严重的过拟合现象。为每个节点设置最小实例数的正确值可能具有挑战性。大多数情况下,可能只是希望做出合适的决定,而无需最优的决定。因此,无需使得最小值非常小获得非常复杂的树,且有很多分裂是多余的,并没有提高模型的准确性。
       树修剪是一种利用修剪树中不必要的分裂的技术。从上层开始,修剪将树的一部分从严格的决策边界压缩为更平滑、更通用的树,从而有效地降低树的复杂性。决策树的复杂性定义为树中的分裂数。
       一种简单而高效的修剪方法是遍历树中的每个节点,并评估将其移除后其代价函数上的效果。如果移除后,代价函数变化不大,那就修剪掉该节点。

实例实践

使用Scikit Lear中内置的函数来实现分类和回归的决策树是非常容易的。首先加载数据集并初始化决策树以进行分类。

from sklearn.datasets import load_iris
from sklearn import tree# Load in our dataset
iris_data = load_iris()# Initialize our decision tree object
classification_tree = tree.DecisionTreeClassifier()# Train our decision tree (tree induction + pruning)
classification_tree = classification_tree.fit(iris_data.data, iris_data.target)

Scikit.还允许使用graphviz库可视化构建的树,它附带了一些选项,这些选项将有助于可视化决策节点,并将模型学到的内容进行分割,下面根据特征名称对节点进行着色,并显示每个节点的类和特征信息:

import graphviz
dot_data = tree.export_graphviz(classification_tree, out_file=None, feature_names=iris.feature_names,  class_names=iris.target_names,  filled=True, rounded=True,  special_characters=True)
graph = graphviz.Source(dot_data)
graph.render("iris") 

也可以在Scikit Learn中为决策树模型设置几个参数。以下是一些有趣的尝试以获得更好的结果:

  • max_depth:树的最大深度,类似于深度神经网络中的最大层数。较浅会使得模型更快但不准确;更深的模型可能会使得准确性更高,但过拟合的风险也增大,且运行很慢;
  • min_samples_split: 拆分节点所需的最小样本数, 将其设置为合适的值将有助于减轻过拟合;
  • max_features:查找最佳拆分时要考虑的特征数,更高可能意味着更好的结果,但训练也需要更长的时间;
  • min_impurity_split:树生长早期停止的阈值,如果节点的杂质高于阈值,则该节点将分裂,可用于权衡对抗过拟合(高值、小树)与高精度(低值、大树);
  • presort:是否预先分配数据以加快拟合中最佳分割的发现。如果事先对每个特征的数据进行排序,训练算法将更容易找到合适的分裂值;

实际中应用决策树的技巧

以下是决策树的优缺点总结,可以帮助读者确定它是否适合各自的问题,以及有关如何有效应用它们的一些提示:

优点| Pros

  • 易于理解和解释:在每个节点都能够确切地看到模型做出了什么决定。在实践中,能够完全理解准确度和误差来自何处,模型可以很好地处理哪种类型的数据,以及输出如何受到特征值的影响。Scikit learn的可视化工具是可视化和理解决策树的绝佳选择;
  • 需要准备很少的数据:许多机器学习模型可能需要大量的数据预处理,例如归一化,并且可能需要复杂的正则化方案。另一方面,在调整了一些参数后,决策树可以很好地做到开箱即用;
  • 使用树进行推理的计算成本与训练树的数据集呈对数关系,这是一个巨大的优势,意味着输入更多的数据不一定会对推理速度产生巨大的影响;

缺点|Cons

  • 由于训练的性质,过拟合在决策树中很常见。通常建议执行某种类型的降维,例如PCA, 以便树不必学习如此多的特征上的拆分;
  • 出于与过拟合情况类似的原因,决策树也容易变得偏向于在数据集中占多数的类别,对不平衡数据进行某种类平衡(例如类权重、采样或专门的损失函数)操作是一个不错的主意。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

机器学习与数据科学决策树指南相关推荐

  1. 机器学习决策树_机器学习与数据科学决策树指南

    还在为如何抉择而感到纠结吗?快采用决策树(Decision Tree)算法帮你做出决定吧.决策树是一类非常强大的机器学习模型,具有高度可解释的同时,在许多任务中也有很高的精度.决策树在机器学习模型领域 ...

  2. 机器学习、数据科学、人工智能、深度学习和统计学之间的区别!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:Vincent Granville,来源:机器之心 在这篇文章中, ...

  3. 哪些电脑最适合做机器学习、数据科学和深度学习呢?这里有份调研报告

    选自Medium 机器之心编译 作者:Towards AI Team 编辑:陈萍.杜伟 一份来自 Towards AI 的关于机器学习.数据科学和深度学习的最佳笔记本电脑.在预算范围内,入手最适合的笔 ...

  4. 收藏 | 10本免费的机器学习和数据科学书籍(附链接)

    来源:云栖社区 本文约2500字,建议阅读6分钟. 本文为大家介绍了免费学习机器学习和数据科学方面的书籍. 听说,最近大家都开学了?不对,是学生们都已经开学了,开学第一件事是什么?发新书!发新书!发新 ...

  5. 一文读懂机器学习、数据科学、人工智能、深度学习和统计学之间的区别!

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 作者:Vincent Granville 来源:机器之心公众号 链接:http://www.d ...

  6. AI 开发者不容错过的 20 个机器学习和数据科学网站

    作者 | Oleksii Kharkovyna 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 以下为译文: 如今,科技界最热门的话题莫过于最先进.最前沿.最令人兴奋的数据科学和机器学习 ...

  7. 一文读懂机器学习、数据科学、人工智能、深度学习和统计学之间的区别

    在这篇文章中,数据科学家与分析师 Vincent Granville 明晰了数据科学家所具有的不同角色,以及数据科学与机器学习.深度学习.人工智能.统计学.物联网.运筹学和应用数学等相关领域的比较和重 ...

  8. 《机器学习与数据科学(基于R的统计学习方法)》——1.2 机器学习的实际案例...

    本节书摘来异步社区<机器学习与数据科学(基于R的统计学习方法)>一书中的第1章,第1.2节,作者:[美]Daniel D. Gutierrez(古铁雷斯),更多章节内容可以访问云栖社区&q ...

  9. python神经网络算法pdf_高清图解:神经网络、机器学习、数据科学一网打尽|附PDF...

    原标题:高清图解:神经网络.机器学习.数据科学一网打尽|附PDF [导读]完全图解人工智能.NLP.机器学习.深度学习.大数据!这份备忘单涵盖了上述领域几乎全部的知识点,并使用信息图.脑图等多种可视化 ...

最新文章

  1. java订单实现的_java订单系统的开发
  2. 未来IT的三驾马车:AI、物联网和混合云
  3. iPhone开发进阶(9)--- 用SQLite管理数据库
  4. Apache/Nginx Cache Last-Modified、Expires和Etag相关工作原理
  5. MQTT protocol level的处理
  6. php cookie加密 类,PHP cookie加密类
  7. zuul 网关的用途_Zuul网关
  8. 突发!美国财政部、商务部双双出手制裁!大疆、旷视等8家被列入投资黑名单!34家被拉入实体清单,GPU龙头景嘉微在列!...
  9. HTML 基本知识点(草稿)
  10. 常用的数据结构_动态图展示 6 个常用的数据结构,一目了然
  11. 用Python实现数据结构之队列
  12. How to Use File Choosers
  13. 草根站长的你是感觉自豪还是苦逼
  14. 包含h3c、cisco、F5、华为、中兴、juniper等网络设备巡检命令整理,建议点赞收藏
  15. jQuery+PHP+Mysql在线拍照和在线浏览照片
  16. NOIP模拟赛8.16 C、长跑(LCT)
  17. 实验三 连续系统分析
  18. spring boot 项目 事务 不能回滚 代理(not eligible for auto-proxying)
  19. 全新最简易Git教程(内含视频链接)
  20. oracle bug号,《一次Oracle bug的故障排查过程思考》的问题重现解决

热门文章

  1. 微软私有云解决方案_微软发布电信云平台 ,互联网巨头争夺5G网络商机
  2. java实验金额转换_java 数字金额转换中文金额
  3. 宝塔linux忘记密码,宝塔忘记登录入口了怎么解决 宝塔面板密码忘记了怎么办
  4. python与人工智能应用锁_linux应用锁的搜索结果-阿里云开发者社区
  5. linux内核关闭网络巨帧xenomai,xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务...
  6. python静态递归函数_Python递归函数相关
  7. linux配置nginx命令行,Linux - 加上sudo后,nginx找不到命令
  8. mysql update column_MySQL8.0 新特性:Partial Update of LOB Column
  9. ssh-copy-id命令不存在_Redis(三)- 常见命令
  10. 丘成桐:用10年时间培养一批本土一流基础科学人才