决策树0-基本模型

什么是决策树

其实网络上有着很多说明决策树的文章,比如参考资料中的1和2,主要是因为这个机器学习的方法实在太经典了,有着很多不同的算法实现,包括最早的由Quinlan在1986年提出的ID3算法、1993年同样是Quinlan提出的C4.5算法以及由Braiman等人在1984年提出的CART算法。

尽管这个模型如此的”尽人皆知”,但是此处还是要说明一下,到底什么才是决策树。

决策树模型其实是一种描述决策过程的树形结构,既可以用来分类也可以进行回归分析。一个决策树就是一个树结构,它是由节点有向边组成的。其中的节点又分为两类:叶节点非叶节点。叶节点表示一个候选的类别,非叶节点表示一次属性的判断,该节点的每一个后继分支都对应于该属性的一个可能值。

预测的过程就是一个从根节点开始的寻找路径的过程(也可以说是一个决策的序列),从根节点开始,根据样本中的每一个属性值,在非叶结点中选择一个分支往下走,直至到达叶节点,此时叶节点所代表的类别就是该样本预测的类别。如下图所示:

根据决策树的预测过程,其实我们可以将决策树看成是一个if-else的规则集合,每一条从根节点到叶节点的路径都对应着一条if-else规则,但是需要注意的是,此处有一个重要的性质:

互斥完备性: 每一个实例都被一条路径或一条规则所覆盖,而且只被一条路径或一条规则覆盖

决策树的优点和缺点

首先我们来看一下决策树模型具有哪些优点:

  1. 学习和预测过程简单明了,对于学习到的模型方便解释。
  2. 数据预处理少,不需要进行正规化等数据预处理操作。
  3. 能够处理任意的数据类型(实数值和离散值)。
  4. 没有过强的假设条件,比如在朴素贝叶斯模型中有属性之间是条件独立的假设,而在决策树中没有预设的假设,该模型仅仅依靠观测到的数据。

当然,任何一个模型都不会只有优点而没有缺点的,决策树的缺点有如下几点:

  1. 寻找一个最优的决策树其实是一个NP难题,目前所用的决策树生成算法都是一种基于启发式的贪心算法,每一个节点根据某种预设的判定规则进行节点的分裂,最终得到的决策树不能保证是全局最优的,只能说是局部最优
  2. 容易发生过拟合的情况,尤其当树生长层次特别深的时候,往往都会发生过拟合现象。(这个问题可以通过进行剪枝技术来解决。)

决策树的学习过程

一棵决策树的生成过程主要分为以下3个部分:

  • 特征选择: 特征选择是指从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同的标准,常用的有:信息增益信息增益比Gini指数
  • 决策树生成: 根据选择的节点分裂标准,从上至下递归地生成子节点1

    1其实具体代码实现的时候,不一定就是递归的,但是此处对于树结构来说,递归结构是最容易理解的方式。

    ,直到某个节点不满足分裂的标准,则停止决策树停止生长。

  • 剪枝: 由于决策树存在着过拟合的风险,所以一般来说需要对生成的决策树进行剪枝操作,缩小树结构的规模,缓解过拟合的现象。其实这个过程并不是必须的,比如在最早的ID3算法中,就没有剪枝的过程,但是在实际分析数据的时候,往往都会出现过拟合的现象,所以通常在生成树结构之后会进行剪枝操作。

参考资料

  1. July大神的<从决策树学习谈到贝叶斯分类算法、EM、HMM>
  2. Decision Tree:Analysis
  3. <统计机器学习>——李航
  4. <机器学习>Tom M.Mitchell

http://zhouyichu.com/machine-learning/Decision-Tree-0.html

时间: 2024-12-17 07:34:18

决策树0-基本模型的相关文章

吴裕雄 python 机器学习——集成学习梯度提升决策树GradientBoostingRegressor回归模型

import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,ensemble from sklearn.model_selection import train_test_split def load_data_regression(): ''' 加载用于回归问题的数据集 ''' #使用 scikit-learn 自带的一个糖尿病病人的数据集 diabetes = datasets.load_di

Spark1.0.0 编程模型

Spark Application可以在集群中并行运行,其关键是抽象出RDD的概念(详见RDD 细解),也使得Spark Application的开发变得简单明了.下图浓缩了Spark的编程模型. 1:Spark应用程序的结构 Spark应用程序可分两部分:driver部分和executor部分初始化SparkContext和主体程序 A:driver部分 driver部分主要是对SparkContext进行配置.初始化以及关闭.初始化SparkContext是为了构建Spark应用程序的运行环

CSS3.0盒模型display:-webkit-box;的使用

box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典的一个布局应用就是布局的垂直等高.水平均分.按比例划分.目前box-flex属性还没有得到firefox.Opera.chrome浏览器的完全支持,但可以使用它们的私有属性定义firefox(-moz).opera(-0).chrome/safari(-webkit). 一.box-flex属性 box-flex主要让子容器针对父容器的宽度按一定规则进行划分 HTML代码 <article

Yii框架2.0的模型

模型是 MVC 模式中的一部分, 是代表业务数据.规则和逻辑的对象. 可通过继承 [[yii\base\Model]] 或它的子类定义模型类,基类[[yii\base\Model]]支持许多实用的特性: 属性: 代表可像普通类属性或数组一样被访问的业务数据; 属性标签: 指定属性显示出来的标签; 块赋值: 支持一步给许多属性赋值; 验证规则: 确保输入数据符合所申明的验证规则; 数据导出: 允许模型数据导出为自定义格式的数组. 属性: 所有 non-static public非静态公有 成员变量

Pytorch 0.3加载0.4模型

- pytorch0.4有一些接口已经改变,且模型向下版本兼容,不向上兼容. In PyTorch 0.4, is it recommended to use `reshape` than `view` when it is possible? Question about 'rebuild_tensor_v2'? 使用pytorch0.3导入pytorch0.4保存的模型时候: Monkey-patch because I trained with a newer version. # Thi

CSS3.0盒模型display:flex;的使用[兼容微信浏览器]

话不多说,上代码,关键在对应的低版本安卓的微信浏览器,需要-webkit-box对应的-webkit-box-orient -webkit-box-pack等的设置. .flex{ /* 设置弹性布局 */ display:-webkit-box;/* android 2.1-3.0, ios 3.2-4.3 */ display:-webkit-flex;/* Chrome 21+ */ display:-ms-flexbox;/* WP IE 10 */ display:flex;/* an

使用nuget包下载Entity Framework6.0无法使用模型类与数据库上下文自动生成controller与view

解决方法:卸载掉原有的6.0版本EF,从控制台安装5.0版本的. >工具>库程序包管理器>程序包管理器控制台.在PM>后面输入安装命令. 命令如下 Install-Package EntityFramework -Version 5.0.0.0 以下是提示: 正在安装“EntityFramework 5.0.0”. 您正在从 Microsoft 下载 EntityFramework,有关此程序包的许可协议在 http://go.microsoft.com/fwlink/?LinkI

CSS3.0盒子模型:display:-webkit-box

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>css3盒子模型</title> 5 <style> 6 .box3{ 7 width: 300px; 8 height: 100px; 9 /*设置css3盒子模型的父类*/ 10 display: -webkit-box; 11 display: -moz-box; 12 display: box; 13 14 background-colo

18.Yii2.0框架模型修改记录 和 修改点击量

目录 修改数据 修改点击量 修改数据 上面要 use app\models\Article; //修改 //http://yii.com/?r=home/Edit public function actionEdit() { $article = Article::findOne(9); $article->article_title = '刘亦菲穿旗袍带仙气,赵丽颖穿旗袍优雅,她穿旗袍最有民国范'; $article->num = 8; //$data = $article->upda