决策树的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;就可以显示出百度首页的内容&…

如何在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…

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接口…

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

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

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

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

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

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

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…

机器视觉支架制作(带效果测试)

图像处理系统中,镜头、光源的选配,对于最后能否产生稳定的识别效果至关重要。而搭载镜头、光源的是支架。机器视觉的支架一般都是根据项目的具体需要进行配置的,搜索淘宝能够得到一些商品。 这些支架形状不一,价格在数百元到千元之…

redis rdb aof区别_理解Redis的持久化机制:RDB和AOF

什么是Redis持久化?Redis作为一个键值对内存数据库(NoSQL),数据都存储在内存当中,在处理客户端请求时,所有操作都在内存当中进行,如下所示:这样做有什么问题呢?注 意文末有:3625页互联网大厂面…

python--批量下载豆瓣图片

溜达豆瓣的时候,发现一些图片,懒得一个一个扒,之前写过c#和python版本的图片下载,因此拿之前的Python代码来改了改,折腾出一个豆瓣版本,方便各位使用 # -*- coding:utf8 -*- import urllib2, urllib, socke…

linux touch权限不够,Linux下的Access、Modify、Change , touch的使用以及权限问题

每个文件在linux下面都会记录许多的时间参数,其实是有三个主要的变动时间,那么,这三个时间的意义又是什么?下面我们来介绍:* Modify time(mtime)当该文件的“内容数据”更改时,就会更新这个时间。内容数据指…

运用多种设计模式的综合案例_SpreadJS 纯前端表格控件应用案例:表格数据管理平台...

由某科技公司研发的表格数据管理平台,是一款面向业务和企业管理系统定制开发的应用平台,包括类 Excel 设计器、PC应用端和移动应用端等应用模块。该平台具备强大的业务配置和集成开发能力,对于企业客户的信息系统在管理模式、业务流程、表单界…

VS中C++ 项目重命名

应该都有过这样的经历,在Visual studio中创建解决方案,添加几个项目进去,然后开始愉快的敲代码...。写代码正欢的时候,却总是感觉那里有些不舒服,一细看,这项目名称取的真心挫,修改个吧。直接右…

axure9数据统计插件_WMDA:大数据技术栈的综合实践

一、概述WMDA是58自主开发的用户行为分析产品,同时也是一款支持无埋点的数据采集产品,只需要在第一次使用的时候加载一段SDK代码,即可采集全量、实时的PC、M、APP三端以及小程序的用户行为数据。同时,为了满足用户个性化的数据采集…

openfoam安装中出现allmake error_如何更新OpenFOAM的版本?

这是协作翻译的第四章,翻译完感觉挺有意思的,分享给大家一起看看。4.更新OpenFOAM版本4.1 版本管理OpenFOAM以两种不同的方式分发。一种方式是使用Git仓库下载的仓库版本。仓库版本的版本号由附加的x标记,例如 OpenFOAM2.1.x。该版本会经常更…

相同布局在不同手机上显示不同_不懂响应式,不同尺寸屏幕下的页面很难达到最佳效果...

让用户在不同设备和尺寸的屏幕下看的页面显示效果更佳,屏幕空间利用更高,操作体验更统一,交互方式更符合习惯。本文主要围绕什么是响应式,如何搭建响应系统,响应式网站解析 三个部分进行阐述,在项目中提前定…

markdown 流程图_测试了12款Markdown编辑器,推荐一个最好用的!

有很多喜欢写博客的小伙伴问我,这个代码笔记的格式怎么弄的简洁又好看,虽然csdn里面有Markdown的书写模式,但是我还是想推荐一款比较好用的写笔记的编辑器 - Typora。相信很多小伙伴都在使用吧,这个一直是我最喜欢的 markdown 编辑…

mysql多行合并成一行_数据文件合并与拆分

在数据处理业务中,经常要把文件结构相同或近似相同的数据文件合并成一个文件,或者将一个比较大的数据文件拆分成小的数据文件。本文将介绍文本文件和 Excel 文件合并及拆分会遇到的几种情况,并提供用 esProc SPL 编写的代码示例。esProc 是专…