为了账号安全,请及时绑定邮箱和手机立即绑定

人工智障学习笔记——机器学习(3)决策树

一.概念

决策树(Decision Tree)是一种十分常用的分类方法。也是监督学习的一种,是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。


二.节点

一个决策树包含三种类型的节点:
决策节点:是对几种可能方案的选择,即最后选择的最佳方案。如果决策属于多级决策,则决策树的中间可以有多个决策点,以决策树根部的决策点为最终决策方案
机会节点:代表备选方案的经济效果(期望值),通过各状态节点的经济效果的对比,按照一定的决策标准就可以选出最佳方案。由状态节点引出的分支称为概率枝,概率枝的数目表示可能出现的自然状态数目每个分枝上要注明该状态出现的概率。
结果节点:将每个方案在各种自然状态下取得的损益值标注于结果节点的右端。


三.算法

决策树学习也是资料探勘中一个普通的方法。在这里,每个决策树都表述了一种树型结构,它由它的分支来对该类型的对象依靠属性进行分类。每个决策树可以依靠对源数据库的分割进行数据测试。这个过程可以递归式的对树进行修剪。 当不能再进行分割或一个单独的类可以被应用于某一分支时,递归过程就完成了。PS:可以用随机森林分类器将许多决策树结合起来以提升分类的正确率。
决策树同时也可以依靠计算条件概率来构造。
决策树如果依靠数学的计算方法可以取得更加理想的效果。 数据库已如下所示:
  (x, y) = (x1, x2, x3…, xk, y)
相关的变量 Y 表示我们尝试去理解,分类或者更一般化的结果。 其他的变量x1, x2, x3 等则是帮助我们达到目的的变量。

决策树思想,实际上就是寻找最纯净的划分方法。这个最纯净在数学上叫纯度,纯度通俗点理解就是目标变量要分得足够开(y=1的和y=0的混到一起就会不纯)。另一种理解是分类误差率的一种衡量。不过因为我们很难给定一个表示纯度的公式,所以实际决策树算法的切入点是另一面。即不纯,不纯度的选取有多种方法,每种方法也就形成了不同的决策树方法,比如ID3算法使用信息增益作为不纯度;C4.5算法使用信息增益率作为不纯度;CART算法使用基尼系数作为不纯度。但实际主要都是干两件事,建树和剪枝。

3.1建树:

建树首先就是确定层级和结构,即树从根到各个节点变量的重要程度,其实也就是不纯度,也就是说将A属性作为父节点,产生的纯度增益(GainA)要大于B属性作为父节点,则A作为优先选取的属性。然后就是分支策略,依然是依靠不纯度:

ID3算法:使用信息增益作为分裂的规则,信息增益越大,则选取该分裂规则。多分叉树。信息增益可以理解为,有了x以后对于标签p的不确定性的减少,减少的越多越好,即信息增益越大越好。

C4.5算法:使用信息增益率作为分裂规则(需要用信息增益除以,该属性本身的熵),此方法避免了ID3算法中的归纳偏置问题,因为ID3算法会偏向于选择类别较多的属性(形成分支较多会导致信息增益大)。多分叉树。连续属性的分裂只能二分裂,离散属性的分裂可以多分裂,比较分裂前后信息增益率,选取信息增益率最大的。

CART算法:说白了就是二分法,对于连续特征的情况:比较阈值,高于某个阈值就属于某一类,低于某个阈值属于另一类。再对于离散特征:抽取子特征。所以CART算法只能形成二叉树。CART的叶子节点比非叶子多1。CART分类时,使用基尼指数(Gini)来选择最好的数据分割的特征,gini描述的是纯度,与信息熵的含义相似。CART中每一次迭代都会降低GINI系数。


三种方法对比:
ID3的缺点,倾向于选择水平数量较多的变量,可能导致训练得到一个庞大且深度浅的树;另外输入变量必须是分类变量(连续变量必须离散化);最后无法处理空值。并且ID3中根据属性值分割数据,之后该特征不会再起作用,这种快速切割的方式会影响算法的准确率。
C4.5选择了信息增益率替代信息增益,不过虽然C4.5弥补了ID3中不能处理特征属性值连续的问题。但是对连续属性值需要扫描排序,这样会使C4.5性能下降
CART以基尼系数替代熵;最小化不纯度而不是最大化信息增益。相比ID3和C4.5,CART应用要多一些,既可以用于分类也可以用于回归。


3.2剪枝:

树的剪枝分为预剪枝和后剪枝:

预剪枝:通过设定停止分类条件的方法及早的停止树增长控制树的规模。比如节点中所有观测属于一类或属性取值一类、再比如观测数小于设定的阈值等。而且最好设置树的最大深度以达到可控的状态。

后剪枝:在已生成过拟合决策树上进行剪枝,删除没有意义的组,可以得到简化版的剪枝决策树,包括REP(设定一定的误分类率,减掉对误分类率上升不超过阈值的多余树)、PEP,还有一种CCP,即给分裂准则—基尼系数加上惩罚项,此时树的层数越深,基尼系数的惩罚项会越大。

预剪枝是在树的生长过程中设定一个指标,当达到该指标时就停止生长,这样做容易产生“视界局限”,就是一旦停止分支,使得节点N成为叶节点,就断绝了其后继节点进行“好”的分支操作的任何可能性。不严格的说这些已停止的分支会误导学习算法,导致产生的树不纯度降差最大的地方过分靠近根节点。后剪枝中树首先要充分生长,直到叶节点都有最小的不纯度值为止,因而可以克服“视界局限”。然后对所有相邻的成对叶节点考虑是否消去它们,如果消去能引起令人满意的不纯度增长,那么执行消去,并令它们的公共父节点成为新的叶节点。这种“合并”叶节点的做法和节点分支的过程恰好相反,经过剪枝后叶节点常常会分布在很宽的层次上,树也变得非平衡。后剪枝技术的优点是克服了“视界局限”效应,而且无需保留部分样本用于交叉验证,所以可以充分利用全部训练集的信息。但后剪枝的计算量代价比预剪枝方法大得多,特别是在大样本集中,不过对于小样本的情况,后剪枝方法还是优于预剪枝方法的。


3.3集成——随机森林

尽管有剪枝等等方法,一棵树的生成肯定还是不如多棵树,因此就有了随机森林,解决决策树泛化能力弱的缺点。
而同一批数据,用同样的算法只能产生一棵树,这时Bagging策略可以帮助我们产生不同的数据集。Bagging策略来源于bootstrap aggregation:从样本集(假设样本集N个数据点)中重采样选出Nb个样本(有放回的采样,样本数据点个数仍然不变为N),在所有样本上,对这n个样本建立分类器(ID3\C4.5\CART\SVM\LOGISTIC),重复以上两步m次,获得m个分类器,最后根据这m个分类器的投票结果,决定数据属于哪一类。
随机森林在bagging的基础上更进一步:
1.  样本的随机:从样本集中用Bootstrap随机选取n个样本
2.  特征的随机:从所有属性中随机选取K个属性,选择最佳分割属性作为节点建立CART决策树(泛化的理解,这里面也可以是其他类型的分类器,比如SVM、Logistics)
3.  重复以上两步m次,即建立了m棵CART决策树
4.  这m个CART形成随机森林,通过投票表决结果,决定数据属于哪一类(投票机制有一票否决制、少数服从多数、加权多数)


四.sklearn提供的API

Sklearn.tree提供了决策树的相关方法

DecisionTreeClassifier 能够对数据进行多分类的类。和其他分类器一样,DecisionTreeClassifier 有两个向量输入:X,稀疏或密集,大小为[n_sample,n_fearure],存放训练样本; Y,值为整型,大小为[n_sample],存放训练样本的分类标签

https://img1.sycdn.imooc.com//5b4d711200017bd804430454.jpg

DecisionTreeRegressor 类可以解决回归问题,和分类一样,拟合方法也需要两个向量参数,X 和 y,不同的是这里y是浮点型数据,而不是整型

https://img1.sycdn.imooc.com//5b4d711e0001683104110374.jpg


其算法目前是用的CART


https://img1.sycdn.imooc.com//5b4d71270001c4e706120301.jpg


https://img1.sycdn.imooc.com//5b4d7133000168a106070333.jpg

(上为http://scikit-learn.org/stable/modules/tree.html官方文档的谷歌翻译截图)

可以通过graphviz输出视图


# -*- coding: utf-8 -*-  from sklearn.datasets import load_irisfrom sklearn import treeimport sysimport osos.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'iris = load_iris()clf = tree.DecisionTreeClassifier()clf = clf.fit(iris.data, iris.target)import graphvizdot_data = tree.export_graphviz(clf, out_file=None)print(dot_data)#graph = graphviz.Source(dot_data) #graph.render("iris") dot_data = tree.export_graphviz(clf, 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', view=True)



https://img1.sycdn.imooc.com//5b4d713d0001030e06410361.jpg

安装方法:

1.首先系统安装graphviz   http://www.graphviz.org/ 且安装完配置环境变量(但是没什么卵用)

https://img1.sycdn.imooc.com//5b4d714b0001eafa00650070.jpg

2.然后python安装 graphviz和pydotplus模块     pip install graphviz    pip install pydotplus

3.如果找不到,在代码里加os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'(改成自己的安装目录)



五.总结

决策树是一个非常直观的机器学习方法,其优点是易于理解和实现,能够直接体现数据的特点,对于决策树,数据的准备往往是简单或者是不必要的,而且能够同时处理数据型和常规型属性,在相对短的时间内能够对大型数据源做出可行且效果良好的结果。易于通过静态测试来对模型进行评测,可以测定模型可信度;如果给定一个观察的模型,那么根据所产生的决策树很容易推出相应的逻辑表达式。缺点是对连续性的字段比较难预测。对有时间顺序的数据,需要很多预处理的工作。当类别太多时,错误可能就会增加的比较快。一般的算法分类的时候,只是根据一个字段来分类,所以很难保证理想准确率。



六.相关学习资源

http://www.cnblogs.com/fionacai/p/5894142.html

https://baike.baidu.com/item/%E5%86%B3%E7%AD%96%E6%A0%91/10377049?fr=aladdin


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消