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

还在为如何抉择而感到纠结吗?快采用决策树(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, 以便树不必学习如此多的特征上的拆分;
  • 出于与过拟合情况类似的原因,决策树也容易变得偏向于在数据集中占多数的类别,对不平衡数据进行某种类平衡(例如类权重、采样或专门的损失函数)操作是一个不错的主意。

 

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

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

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

相关文章

腾讯安全全面出击:双十一不该成为黑产的狂欢

戳蓝字“CSDN云计算”关注我们哦!作者 | 刘丹出品 | CSDN云计算(ID:CSDNcloud)根据CNCERT/CC国家互联网应急中心资料报告显示:中国遭受DDoS攻击仅次于美国排名第二,在遭受攻击的行业中,电子商务…

Linux环境 Oracle 监听和服务 日常操作

文章目录一、Oracle监听1.1. 查看Oracle监听运行状态1.2. 启动Oracle监听1.3. 关闭监听器二、Oracle 服务2.1. 以SYS用户身份登录Oracle2.2. 切换用户至sys2.3. 启动Oracle实例2.4. 停止Oeacle实例运行一、Oracle监听 操作声明:登录服务器,切换到oracle…

五分钟教你如何用函数计算部署钉钉群发机器人

如果你是钉钉多个群的管理员,想要在多个钉钉群群发消息的时候,是不是还在为要寻找所有的群,并不断的复制黏贴消息而烦恼? 过去的你:(N 个群,N 次操作) 现在的你:(N 个群,1 次操作) …

php原生态三级联动_ajax php实现三级联动的方法

ajax php实现三级联动的方法发布时间:2020-08-19 09:34:43来源:亿速云阅读:106作者:小新小编给大家分享一下ajax php实现三级联动的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧&#xf…

使用Terraform创建托管版Kubernetes

目前,阿里云容器服务已经可以创建托管版 Kubernetes 集群了。相比于默认的 Kubernetes 集群,托管版本会主动替您运维一套高可用的 Master 组件,免去了默认版本集群中三个 Master ECS 节点,从而节约所需的资金成本及维护时的人力成…

确认! Python夺冠,Java“被迫”退出竞争舞台,网友:崩溃!

2019年转眼已经接近尾声,如果盘点下2019年最火的语言,除了Python还能有谁?你心中的王者语言又是谁?这一年Python风光无限这一年JAVA走向右边这一年,我们都很感慨,你呢?关于Python,编…

阿里专家梁笑:2018双十一下单成功率99.9%!供应链服务平台如何迎接大促

本篇文章来自于2018年12月22日举办的《阿里云栖开发者沙龙—Java技术专场》,梁笑专家是该专场第一位演讲的嘉宾,本篇文章是根据梁笑专家在《阿里云栖开发者沙龙—Java技术专场》的演讲视频以及PPT整理而成。 摘要:2018年双十一平稳度过&#…

首次公开!《阿里计算机视觉技术精选》揭秘前沿落地案例

当下计算机视觉技术无疑是AI浪潮中最火热的议题之一。视觉技术的渗透,既可以对传统商业进行改造使之看到新的商业机会,还可以创造全新的商业需求和市场。无论在电商、安防、娱乐,还是在工业、医疗、自动驾驶领域,计算机视觉技术都…

阿里程序员常用的 15 款开发者工具

戳蓝字“CSDN云计算”关注我们哦!作者 | Linux技术责编 | 阿秃从人工到自动化,从重复到创新,技术演进的历程中,伴随着开发者工具类产品的发展。阿里巴巴将自身在各类业务场景下的技术积淀,通过开源、云上实现或工具等形…

一文深度解读阿里云CDN实时日志的前世今生:挖掘实时数据的无限价值

阿里云CDN实时日志服务可以将CDN采集的日志,秒级的交付给用户, 并且可以对采集到的日志进行实时、交互式分析和报表呈现,为监控、报警、渠道分析、运营分析提供实时、可靠的数据参考,让用户远离锁事,专注数据价值。 12月26日&…

推荐系统之信息茧房问题

什么是信息茧房 信息茧房其实是现在社会一个很可怕的现象,从字面意思来看的话其实比喻的是信息被虫茧一般封锁住。这个问题反映了现在随着个性化推荐的普及衍射的一个社会问题。 平时在浏览新闻或者淘宝的时候,平台会自动根据用户的浏览记录获取用户的…

【快讯】阿里云张建锋:数据成为经济发展的新生产要素

在2019阿里云广东峰会上,阿里云智能总裁张建锋表示,全面迈入数字经济时代,数据成为社会经济发展的新生产要素,云智能是新基础设施。 “数字经济时代,最大的不一样是有一种新的生产要素是数据。”张建锋表示&#xff0c…

Flutter Exception降到万分之几的秘密

1. flutter exception 闲鱼技术团队于2018年上半年率先引入了Flutter技术实现客户端开发,到目前为止成功改造并上线了复杂的商品详情和发布业务。随着flutter比重越来越多,我们开始大力治理flutter的exception,起初很长一段时间内闲鱼内flutter的except…

mac vim php 颜色,mac vim 配色

syntax onset nuset noicset t_Co256set tabstop4set nocompatibleset shiftwidth4set softtabstop4set backspace2set autoindentset expandtabset smartindentset hlsearch"状态栏显示当前执行的命令set showcmd"粘贴时保持格式set paste"允许使用鼠标点击定位…

云栖专辑 | 阿里开发者们的第6个感悟:享受折磨

2015年12月20日,云栖社区上线。2018年12月20日,云栖社区3岁。 阿里巴巴常说“晴天修屋顶”。 在我们看来,寒冬中,最值得投资的是学习,是增厚的知识储备。 所以社区特别制作了这个专辑——分享给开发者们20个弥足珍贵的…

2019年人工智能硬件与应用大趋势

2019年即将到来,人工智能将往什么方向发展?机器学习将如何演变为人工智能?在神经网络领域具有20年的技术经验Eugenio Culerciello,在硬件和软件两方面都有经验积累。他预测,在硬件和应用两方面,2019年的人工…

阿里专家杜万:Java响应式编程,一文全面解读

本篇文章来自于2018年12月22日举办的《阿里云栖开发者沙龙—Java技术专场》,杜万专家是该专场第四位演讲的嘉宾,本篇文章是根据杜万专家在《阿里云栖开发者沙龙—Java技术专场》的演讲视频以及PPT整理而成。 摘要:响应式宣言如何解读&#xf…