一.概念

决策树(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],存放训练样本的分类标签

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

其算法目前是用的CART


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

可以通过graphviz输出视图

# -*- coding: utf-8 -*-
from sklearn.datasets import load_iris
from sklearn import tree
import sys
import os
os.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 graphviz
dot_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)

安装方法:

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

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

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

  1. 人工智障学习笔记——机器学习(16)降维小结

    机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中.降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达形式. ...

  2. 人工智障学习笔记——机器学习(4)支持向量机

    一.概念 支持向量机(Support Vector Machine),简称SVM.是常见的一种判别方法.在机器学习领域,是一个有监督的学习模型,通常用来进行模式识别.分类以及回归分析. SVM的主要思 ...

  3. 人工智障学习笔记——机器学习(1)特征工程

    一.概念 学习过Machine Learning的一定听过这句话:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已. 所谓特征工程,做的就是[ 最大限度地从原始数据中提取特征点以供算法 ...

  4. 人工智障学习笔记——机器学习(9)最大期望算法

    一.概念 最大期望算法,也就是著名的em算法,他起源于一条dog 没错,就是这个 好吧不扯蛋了,em算法(Expectation Maximization Algorithm,又译期望最大化算法),是 ...

  5. 人工智障学习笔记——机器学习(6)协同过滤

    一.概念 有句成语可以将协同过滤这个思想表现的淋漓尽致,那就是物以类聚,人以群分  --出处:<易经·系辞上>: 天尊地卑,乾坤定矣.卑高以陈,贵贱位矣.动静有常,刚柔断矣.方以类聚,物以 ...

  6. 人工智障学习笔记——机器学习(5)朴素贝叶斯

    一.概念 1.1贝叶斯定理:假设H[1],H[2]-,H[n]互斥且构成一个完全事件,已知它们的概率P(H[i]),i=1,2,-,n,现观察到某事件A与H[1],H[2]-,H[n]相伴随机出现,且 ...

  7. 人工智障学习笔记——机器学习(15)t-SNE降维

    一.概念 t-SNE(t分布随机邻域嵌入)是一种用于探索高维数据的非线性降维算法.它将多维数据映射到适合于人类观察的两个或多个维度. t-SNE主要包括两个步骤:第一.t-SNE构建一个高维对象之间的 ...

  8. 人工智障学习笔记——机器学习(12)LDA降维

    一.概念 LDA:Linear Discriminant Analysis (也有叫做Fisher Linear Discriminant).与PCA一样,是一种线性降维算法.不同于PCA只会选择数据 ...

  9. 人工智障学习笔记——机器学习(11)PCA降维

    一.概念 Principal Component Analysis(PCA):主成分分析法,是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中表示,即把原先的n个特征用 ...

最新文章

  1. js 微信小程序日期 时间转时间戳
  2. 数据恢复 从binlog文件
  3. struts2综合例子--------拦截器(登陆检查,日志记录),校验validate,
  4. Ubuntu18.10的chrome免输入密码
  5. 【mysql】Innodb三大特性之double write
  6. exfat为什么不适合机械硬盘_为什么有人说小排量车不适合跑高速,多少排量的车适合?...
  7. 车辆行人检测数据集_澎思科技行人再识别技术取得突破,刷新三大数据集世界记录...
  8. 在ibatis中做等值判断(if-else)
  9. 读卡器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  10. c语言 哪些运算符左右需要空格,C语言运算符优先级口诀?
  11. “requireJs前传”之为什么要用前端模块化?
  12. 0017-Spark的HistoryServer不能查看到所有历史作业分析
  13. 华为交换机做qos案例_华为交换机 01-08 QoS
  14. 最方便简单的经纬度查询方法
  15. 按指定次数重复显示 Excel 单元格
  16. SharePoint 2016 Beta 2 使用体验
  17. 数据控制—完整性约束
  18. 2020最新版前端学习路线图--Javascript网页编程重点知识
  19. C# WPF MVVM 实战 – 5- 用绑定,通过 VM 设置 View 的控件焦点
  20. python数码时钟代码_micro:bit 编程模拟时钟表盘

热门文章

  1. python julia go_挑战Python的四个语言:Swift、Go、Julia、R
  2. openwrt 19 overlay 空间不足_【邯郸】2020年度市级科技企业孵化器和众创空间拟认定名单公示...
  3. 以独占方式锁定此配置文件失败.另一个正在运行_加速用例执行最有效的方法,手把手教你如何并行地运行自动化测试...
  4. boolean android.content.SharedPreferences.getBoolean(String key, boolean defValue)
  5. mysql5.7.28下载_MySql5.7.28下载、安装、登陆详解
  6. c语言位向量机伞_一文读懂C语言精华-指针变量和指向指针的指针
  7. 抽象类继承多个抽象类_多重继承?抽象类?C++的内存布局并不复杂
  8. 好看清新的双栏博客模板,可以用来做工作室官网,自媒体官网,个人博客,产品展示等网站。
  9. 简单易用的开源ORM框架SqlSugar v5.0.0.19源码
  10. ZDOO全协同管理系统 v6.9