决策树的value是什么意思_从零开始的机器学习实用指南(六):决策树

3925e2d22bf170099e38a7e6c56544d7.png

类似SVM,决策树也是非常多功能的机器学习算法,可以分类,回归,甚至可以完成多输出的任务,能够拟合复杂的数据集(比如第二章的房价预测例子,虽然是过拟合了=。=)

决策树也是很多集成学习的组件,比如随机森林和梯度提升树等等

决策树的训练和可视化

还是以熟悉的iris数据集为例:

首先训练一个决策树模型,然后做一些可视化,使用export_graphviz()方法,通过生成一个叫做iris_tree.dot

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
iris = load_iris()
X = iris.data[:, 2:] # petal length and width 
y = iris.target
tree_clf = DecisionTreeClassifier(max_depth=2)
tree_clf.fit(X, y)from sklearn.tree import export_graphviz
export_graphviz(tree_clf,out_file=image_path("iris_tree.dot"),feature_names=iris.feature_names[2:],class_names=iris.target_names,rounded=True,filled=True)

可以利用graphviz package(http://www.graphviz.org/) 中的dot命令行,将.dot文件转换成 PDF 或 PNG 等多种数据格式。

$ dot -Tpng iris_tree.dot -o iris_tree.png

f79ac81c4d93bef413a6db1eeb1be62b.png

我们将从这个图开始,简单分析决策树是怎么样工作的

从根节点出发,首先要判断花瓣长度是否小于 2.45 厘米,如果小于移动到左子节点,会判断这个花是Iris-Setosa。如果大于2.45cm,会移动到右子节点,判断宽度是否小于等于1.75cm

,如果是的,会到它的左子节点,判断为versicolor,否则到右子节点,判断为,virginica。

过程是非常清晰简单的

决策树的众多特性之一就是, 它不需要太多的数据预处理, 尤其是不需要进行特征的缩放或者归一化。

图中还有一些属性

  • samples属性统计出它应用于多少个训练样本实例。如,开始有150组例子
  • value属性告诉你这个节点对于每一个类别的样例有多少个。如:右下角的节点中包含 0 个 Iris-Setosa,1 个 Iris-Versicolor 和 45 个 Iris-Virginica。
  • Gini属性用于测量它的纯度:如果一个节点包含的所有训练样例全都是同一类别的,我们就说这个节点是纯的(Gini=0)。基尼不纯度的公式在下面,具体的用处我们稍后再说。

12b08d2355b9d1d81aadbc94fe259dfc.png
Sklearn 用的是 CART 算法, CART 算法仅产生二叉树(是或否)。然而,像 ID3 这样的算法可以产生超过两个子节点的决策树模型。

下面的图展示了决策边界,第一次的边界是在length=2.45,左面是纯的,不用再分了。右面是不纯的,再在width=1.75做了分割,如果树高可以为3的话,会继续分割下去(如虚线)

49171dc690137290d46fd1af67ca948a.png
从图中可以看出,决策树是典型的白盒模型,可以提供清楚的分类依据。分类具有很强的可解释性

另外,决策树可以很容易的给出分类的概率

比如你发现了一个花瓣长 5 厘米,宽 1.5 厘米的花朵,对应上图6-1的绿色那一块

Iris-Setosa 为 0%(0/54),Iris-Versicolor 为 90.7%(49/54),Iris-Virginica 为 9.3%(5/54)

测试结果完全符合预期

>>> tree_clf.predict_proba([[5, 1.5]])
array([[ 0. , 0.90740741, 0.09259259]])
>>> tree_clf.predict([[5, 1.5]])
array([1])

CART树算法

SkLearn 用分裂回归树(Classification And Regression Tree, CART)算法训练决策树

原理非常简单

每次分裂都要找到特征k和阈值tk(比如特征=宽度,阈值=2.45),CART会寻找一个分裂方法,让分裂后两边的基尼不纯度按照节点数量加权尽可能的小,损失函数为

126f2032d9e6572ccffb6d5262dd7ac6.png

然后递归的,对于子集,子集的子集,按照同样的方法进行分裂

可以看出,每次分割是贪心算法,不能保证这是全局上最好的解。这是因为找到最优树是一个 NP 完全问题,需要超出多项式的复杂度,我们需要找一个合理的(而不是最佳的)方案

CART停止的条件是达到预定的最大深度之后将会停止分裂(由max_depth超参数决定)

,或者是它找不到可以继续降低不纯度的分裂方法的时候(所有节点都是同一个类了)。几个其他超参数(之后介绍)控制了其他的停止生长条件。

复杂度计算

建立好决策树后,预测的速度是非常快的。决策树是一个近似平衡的树,大概只需要O(logm)的复杂度(m样本数),因此是非常快的。

但是训练上因为要比较多种的分裂可能,有了O(nmlogm)的复杂度。过程是比较慢的。对于小型的数据集(少于几千),可以用预排序来加速(presort = True)但是大数据反而会降低速度。

基尼不纯度/信息熵

通常,算法使用 Gini 不纯度来进行检测, 但是你也可以设置为"entropy"来使用熵不纯度进行检测。

熵的概念是源于热力学中分子混乱程度的概念,当分子井然有序的时候,熵值接近于 0。后来推广到信息论中,当所有信息相同的时候熵被定义为零。

03bcc1bdf3880f2df68943b2ed8379ff.png

在机器学习中,熵经常被用作不纯度的衡量方式,当一个集合内只包含一类实例时, 我们称为数据集的熵为 0。 熵的减少通常称为信息增益。

通常来说Gini不纯度和信息熵的结果是类似的,基尼指数计算稍微快一点,所以这是一个很好的默认值。但是,也有的时候它们会产生不同的树,基尼指数会趋于在树的分支中将最多的类隔离出来,而熵指数趋向于产生略微平衡一些的决策树模型。

正则化

决策树不对数据做任何的假设,如果任由决策树无限制的拟合数据,必然会造成严重的过拟合。

这样的模型称为非参数模型,没有参数数量的限制,可以自由的去拟合数据。线性回归等这类有参数的模型,自由度受到一定的限制,本身就有一些抵御过拟合的能力(也增加了欠拟合的风险)

除了限制树的高度可以显著的限制模型过拟合,SKlearn还有一些其他的正则化相关的超参数:

  • min_samples_split(节点在被分裂之前必须具有的最小样本数)
  • min_samples_leaf(叶节点必须具有的最小样本数)
  • min_weight_fraction_leaf(和min_samples_leaf相同,但表示为加权总数的一小部分实例)
  • max_leaf_nodes(叶节点的最大数量)
  • max_features(在每个节点被评估是否分裂的时候,具有的最大特征数量)
增加min_开头的超参数或者减小max开头的超参数会让模型更正则化
还有一些其他的决策树算法采用后剪枝形式,先生成足够大的树,再删去一些不必要的节点

下图展示了正则化对决策边界的影响,左面显然是过拟合了。

5bbd563a30b11edf7fd2a299bff5af2a.png

回归

决策树也可以处理回归的问题

from sklearn.tree import DecisionTreeRegressor
tree_reg = DecisionTreeRegressor(max_depth=2)
tree_reg.fit(X, y)

得到了一棵这样的树

8a4f91872a8f7cf5d6dcf9d9eeda78bf.png

可以看出,和分类相比,区别在于,不再最小化不纯度了,而是最小化MSE

57820e3787158dcfdc4d64b2a4f7ee36.png

直观的看,每一个子集的红线代表了value值,即这个子集的平均

247cbfd5a95d746d3f3027f786fe1456.png

同样,正则化可以带来帮助

c886dc331e3a66bb16ecde27f8c85b97.png

不稳定性

决策树是一类非常强大的模型,但是也有一些局限性

首先,决策树的决策边界和坐标轴是垂直的,这样的性质导致对数据的旋转很敏感,如图,左右两个虽然都可以分割开,但是右面的泛化显然不如左边好(可以用PCA来解决这样的问题,见第八章)

41e048b84be1ff7e315d47a5721233d8.png

其次,决策树对一些数据的微小变化可能非常敏感,一点点的区别可能导致决策边界截然不同的,而且,SKlearn中许多方法都有偶然性,除非设置了随机种子,这也会带来许多不稳定性。下一章中将会看到,随机森林可以通过多棵树的平均预测值限制这种不稳定性

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

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

相关文章

Hive中生成随机唯一标识ID的方法

2019独角兽企业重金招聘Python工程师标准>>> HIVE中处理的数据往往比较多,在处理数据的时候希望给处理得到的数据一个ID标识,这时候可以用到UUID。 UUID的算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成UUID。从理论上讲&#…

php从网页获得数据,php根据URL获得网页内容

php 中根据url来获得网页内容非常的方便,可以通过系统内置函数file_get_contents(),传入url,即可返回网页的内容,比如获得百度首页的内容代码为:$html file_get_contents(http://www.baidu.com/);echo $html;就可以显示出百度首页的内容&…

2020知道python语言应用答案_2020知到Python语言应用答案章节期末答案

组合管理理论最早由哈维马科维兹于1962年系统的提出,他开创了对投资进行整体管理的先 公司型基金和契约型基金的区别,下列不包括()。 A.资金的性质B.基金的营运依据C.基 我国(&#…

如何在Bootstrap中使用Jumbotron和页面标头类?

Introduction 介绍 In the previous article, we have learned how Responsive column, Nesting Columns and offset Columns work and how to use them? I hope now, you all are comfortable with the grid system; what is it, how to use it and how we can use it for c…

python中的数字类型格式与运算,python数字数据类型

python数字数据类型1. 数字在我们很小的时候,父母便开始教我们数数,从1数到10,聪明的孩子可以数的更多。python支持3中数值类型整型(int),通常称之为整型或整数,这个概念与我们小学时学过的整数是相同的,py…

getprocaddress得到为0_基于ZU+系列MPSoC芯片的USB3.0/2.0接口硬件设计

本文主要介绍Zynq UltraScale MPSoC系列芯片的USB3.0/2.0接口硬件设计。ZU系列MPSoC要实现USB3.0/2.0的全部功能,需要同时使用MIO和GTR。因为GTR接口中的USB接口只支持USB3.0,对USB2.0的支持需要通过MIO接口外接USB PHY实现。ZU系列MPSoC包括两个USB接口…

如何设置单词第一个字母大写_大写一行中每个单词的第一个和最后一个字母

如何设置单词第一个字母大写Problem statement: 问题陈述: Given an input line, capitalize first and last letter of each word in the given line. Its provided that the input line is in lowercase. 给定输入行, 将给定行中每个单词的第一个和最…

php如何编造简历,在简历里编造内容需要注意哪些问题?

在个人简历里编造内容可得有一定依据才行,总得为自己后期做个准备工作是不是?你编造的东西不只是给企业看一看而已,企业还会对这些内容作出进一步的判断,并且可能就其对你进行提问,如果你答不出来而曝光自己是在欺骗企…

Java LinkedList公共对象pollLast()方法(带示例)

LinkedList公共对象pollLast()方法 (LinkedList public Object pollLast() method) This method is available in package java.util.LinkedList.pollLast(). 软件包java.util.LinkedList.pollLast()中提供了此方法。 This method is used to retrieves the last or ending ele…

python编写学生成绩排序_Python实现按学生年龄排序的实际问题详解

前言 本文主要给大家了关于利用Python按学生年龄排序的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 问题:定义一个Class:包含姓名name、性别gender、年龄age,需要按…

前方危险-让很多“高逼格”高管深刻反思的文章

在很多的时候,现实会让我们每个人迷惑,周边的人和事可以让人极度的膨胀,你可以想吃了迷药一样,分不清是现实还是虚幻。很久以前,在公司的一次会议上,某主管告诉我们说,“他一个同事,…

oracle实例的概念组成,oracle体系结构的两个基本概念:数据库和实例

您可能感兴趣的话题:oracle核心提示:要了解oracle体系结构必须先了解两个基本的概念: 数据库和实例.要了解oracle体系结构必须先了解两个基本的概念: 数据库和实例.一: 数据库数据库(database)是一个数据集合.无论数据库是采用关系结构还是面向对象结构,…

c#二维数据最大最小值_C#| 打印类型,各种数据类型的最大值和最小值

c#二维数据最大最小值In the below example – we are printing types, min value, max value of various data types in C#, like integer data types, floating point data types, Boolean data type, Reference types, Nullable types. 在下面的示例中-我们正在打印C&#x…

自定义taglib引入失败_小程序拼团总失败?看看微信官方和开发者们怎么说

阅读时间:6m最懂小程序生态商业的自媒体可怕... 刚过国庆,南方还在短袖短裙,北方竟然都下雪了!什么叫一天之内感受四季?晓程序观察(yinghoo-tech)的小伙伴们算是深刻体验了,穿着短袖上飞机,抵达…

微信公众平台开发5:翻译功能

思路分析首先对用户发送过来的消息进行判断,判断消息里是否含有“翻译”关键字,如果有,则提取翻译内容,然后调用网络上开放的翻译API 进行翻译。我们用有道翻译API:http://fanyi.youdao.com/openapi?pathdata-mode记下…

Linux之基础I/O

目录 一、C语言中的文件操作 二、系统文件操作I/O 三、文件描述符fd 1、文件描述符的引入 2、对fd的理解 3、文件描述符的分配规则 四、重定向 1、重定向的原理 2、重定向的系统调用dup2 五、Linux下一切皆文件 一、C语言中的文件操作 1、打开和关闭 在C语言的文…

moore和mealy_Mealy机和Moore机的比较研究 目录

moore和mealyFinite automata may also have outputs corresponding to each input symbol. Such finite automata are known as finite automata with the output. 有限自动机还可以具有与每个输入符号相对应的输出。 这种有限自动机称为输出的有限自动机。 There are two fi…

oracle sys连接不上,oracle – 为什么我不能在SYS拥有的对象上创建触发器?

在尝试创建名为ghazal_current_bef_upd_row的触发器时&#xff1a;create trigger ghazal_current_bef_upd_rowbefore update on ghazal_currentfor each rowwhen (new.Rating < old.Rating)begininsert into ghazal_current_audit(GhazalName,Old_Rating,New_Rating)values…

大一python编程题_请教python编程问题(作业就剩这几道题了)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1. def cleanword(word):(用Python写出程序&#xff0c;使程序可以通过下面的doctest)""">>> cleanword(what?)what>>> cleanword("now!")now>>> cleanword(?"word!,$…

Linux笔记1-5 --用户

## 1 ## 用户理解用户就是系统使用者的身份在系统中用户存储为若干窜字符若干个系统配置文件用户信息涉及到的系统配置文件&#xff1a;/etc/passwd ###用户信息用户&#xff1a;密码&#xff1a;uid&#xff1a;gid&#xff1a;说明&#xff1a;家目录&#xff1a;用户使用…