数据挖掘十大经典算法--CART: 分类与回归树
一、决策树的类型
在数据挖掘中,决策树主要有两种类型:
分类树 的输出是样本的类标。
回归树 的输出是一个实数 (比如房子的价格,病人呆在医院的时间等)。
术语分类和回归树 (CART) 包括了上述两种决策树, 最先由Breiman 等提出.分类树和回归树有些共同点和不同点—比如处理在何处分裂的问题。
分类回归树(CART,Classification And Regression Tree)也属于一种决策树,之前我们介绍了基于ID3和C4.5算法的决策树。
这里仅仅介绍CART是如何用于分类的。
分类回归树是一棵二叉树,且每一个非叶子节点都有两个孩子,所以对于第一棵子树其叶子节点数比非叶子节点数多1。
CART与ID3差别:
CART中用于选择变量的不纯性度量是Gini指数。
假设目标变量是标称的,而且是具有两个以上的类别。则CART可能考虑将目标类别合并成两个超类别(双化);
假设目标变量是连续的。则CART算法找出一组基于树的回归方程来预測目标变量。
二、构建决策树
构建决策树时通常採用自上而下的方法,在每一步选择一个最好的属性来分裂。
"最好" 的定义是使得子节点中的训练集尽量的纯。不同的算法使用不同的指标来定义"最好"。本部分介绍一中最常见的指标。
有4中不同的不纯度量能够用来发现CART模型的划分,取决于目标变量的类型,对于分类的目标变量,能够选择GINI,双化或有序双化;
对于连续的目标变量。能够使用最小二乘偏差(LSD)或最小绝对偏差(LAD)。
以下我们仅仅讲GINI指数。
GINI指数:
1、是一种不等性度量;
2、通经常使用来度量收入不平衡,能够用来度量不论什么不均匀分布;
3、是介于0~1之间的数,0-全然相等。1-全然不相等。
4、整体内包括的类别越杂乱,GINI指数就越大(跟熵的概念非常相似)
CART分析步骤
1、从根节点t=1開始。从全部可能候选S集合中搜索使不纯性减少最大的划分S*,然后,使用划分S*将节点1(t=1)划分成两个节点t=2和t=3;
2、在t=2和t=3上分别反复划分搜索过程。
基尼不纯度指标
在CART算法中, 基尼不纯度表示一个随机选中的样本在子集中被分错的可能性。
基尼不纯度为这个样本被选中的概率乘以它被分错的概率。当一个节点中全部样本都是一个类时,基尼不纯度为零。
如果y的可能取值为{1, 2, ..., m},令fi是样本被赋予i的概率,则基尼指数能够通过例如以下计算:
比如:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTA2NzM2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
上例是属性有8个。每个属性又有多少离散的值可取。在决策树的每个节点上我们能够按任一个属性的任一个值进行划分。比方最開始我们按:
1)表面覆盖为毛发和非毛发
2)表面覆盖为鳞片和非鳞片
3)体温为恒温柔非恒温
等等产生当前节点的左右两个孩子。以下我们按GINI指数划分有:
GINI指数
整体内包括的类别越杂乱,GINI指数就越大(跟熵的概念非常相似)。
比方体温为恒温时包括哺乳类5个、鸟类2个,则:
GINI=1-[(\frac{5}{7})^2+(\frac{2}{7})^2]=\frac{20}{49}" alt="" width="232" height="36" style="border:0px">
体温为非恒温时包括爬行类3个、鱼类3个、两栖类2个,则
所以假设依照“体温为恒温柔非恒温”进行划分的话,我们得到GINI的增益(类比信息增益):
最好的划分就是使得GINI_Gain最小的划分。
终止条件
一个节点产生左右孩子后,递归地对左右孩子进行划分就可以产生分类回归树。这里的终止条件是什么?什么时候节点就能够停止分裂了?直观的情况,当节点包括的数据记录都属于同一个类别时就能够终止分裂了。
这仅仅是一个特例。更一般的情况我们计算χ2值来推断分类条件和类别的相关程度。当χ2非常小时说明分类条件和类别是独立的,即依照该分类条件进行分类是没有道理的,此时节点停止分裂。注意这里的“分类条件”是指依照GINI_Gain最小原则得到的“分类条件”。
假如在构造分类回归树的第一步我们得到的“分类条件”是:体温为恒温柔非恒温。此时:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTA2NzM2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
三、剪枝
决策树为什么(WHY)要剪枝?原因是避免决策树过拟合(Overfitting)样本。
前面的算法生成的决策树很具体而且庞大,每一个属性都被具体地加以考虑。决策树的树叶节点所覆盖的训练样本都是“纯”的。因此用这个决策树来对训练样本进行分类的话。你会发现对于训练样本而言。这个树表现完善。误差率极低且可以正确得对训练样本集中的样本进行分类。训练样本中的错误数据也会被决策树学习,成为决策树的部分,可是对于測试数据的表现就没有想象的那么好,或者极差,这就是所谓的过拟合(Overfitting)问题。Quinlan教授试验,在数据集中。过拟合的决策树的错误率比经过简化的决策树的错误率要高。
怎么剪枝
如今问题就在于,怎样(HOW)在原生的过拟合决策树的基础上,生成简化版的决策树?能够通过剪枝的方法来简化过拟合的决策树。
剪枝能够分为两种:预剪枝(Pre-Pruning)和后剪枝(Post-Pruning),以下我们来具体学习下这两种方法:
PrePrune:预剪枝。及早的停止树增长。方法能够參考见上面树停止增长的方法。
PostPrune:后剪枝,在已生成过拟合决策树上进行剪枝。能够得到简化版的剪枝决策树。
事实上剪枝的准则是怎样确定决策树的规模。能够參考的剪枝思路有下面几个:
1:使用训练集合(Training Set)和验证集合(Validation Set),来评估剪枝方法在修剪结点上的效用
2:使用全部的训练集合进行训练。可是用统计測试来预计修剪特定结点是否会改善训练集合外的数据的评估性能,如使用Chi-Square(Quinlan,1986)測试来进一步扩展结点能否改善整个分类数据的性能。还是只改善了当前训练集合数据上的性能。
3:使用明白的标准来衡量训练例子和决策树的复杂度,当编码长度最小时,停止树增长。如MDL(Minimum Description Length)准则。
1、Reduced-Error Pruning(REP,错误率减少剪枝)
该剪枝方法考虑将书上的每一个节点作为修剪的候选对象。决定是否修剪这个结点有例如以下步骤组成:
1:删除以此结点为根的子树
2:使其成为叶子结点
3:赋予该结点关联的训练数据的最常见分类
4:当修剪后的树对于验证集合的性能不会比原来的树差时,才真正删除该结点
由于训练集合的过拟合,使得验证集合数据可以对其进行修正,重复进行上面的操作,从底向上的处理结点。删除那些可以最大限度的提高验证集合的精度的结点。直到进一步修剪有害为止(有害是指修剪会减低验证集合的精度)
REP是最简单的后剪枝方法之中的一个,只是在数据量比較少的情况下。REP方法趋于过拟合而较少使用。这是由于训练数据集合中的特性在剪枝过程中被忽略。所以在验证数据集合比训练数据集合小的多时,要注意这个问题。
虽然REP有这个缺点,只是REP仍然作为一种基准来评价其他剪枝算法的性能。
它对于两阶段决策树学习方法的长处和缺点提供了了一个非常好的学习思路。
因为验证集合没有參与决策树的创建,所以用REP剪枝后的决策树对于測试例子的偏差要好非常多,可以解决一定程度的过拟合问题。
2、Pessimistic Error Pruning(PEP。悲观剪枝)
先计算规则在它应用的训练例子上的精度。然后假定此预计精度为二项式分布。并计算它的标准差。
对于给定的置信区间。採用下界预计作为规则性能的度量。这样做的结果,是对于大的数据集合,该剪枝策略可以很接近观察精度,随着数据集合的减小,离观察精度越来越远。该剪枝方法虽然不是统计有效的,可是在实践中有效。
PEP为了提高对測试集合的预測可靠性。PEP对误差预计添加了连续性校正(Continuity Correction)。
PEP方法觉得,假设:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTA2NzM2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">成立,则Tt应该被剪枝,
上式中:
当中,e(t)为结点t出的误差;i为覆盖Tt的叶子结点。Nt为子树Tt的叶子树。n(t)为在结点t处的训练集合数量。PEP採用自顶向下的方式,假设某个非叶子结点符合上面的不等式。就裁剪掉该叶子结点。
该算法被觉得是当前决策树后剪枝算法中经度比較高的算法之中的一个。可是饿存在有缺陷。首先,PEP算法是唯一使用Top-Down剪枝策略。这样的策略会导致与先剪枝出现相同的问题,将该结点的某子节点不须要被剪枝时被剪掉;另外PEP方法会有剪枝失败的情况出现。
尽管PEP方法存在一些局限性,可是在实际应用中表现出了较高的精度,。
两外PEP方法不须要分离训练集合和验证机和。对于数据量比較少的情况比較有利。再者其剪枝策略比其他方法相比效率更高,速度更快。由于在剪枝过程中,树中的每颗子树最多须要訪问一次,在最坏的情况下,它的计算时间复杂度也仅仅和非剪枝树的非叶子节点数目成线性关系。
Cost-Complexity Pruning(CCP、代价复杂度)
CCP方法包括两个步骤:
1:从原始决策树T0開始生成一个子树序列{T0、T1、T2、...、Tn},当中Ti+1是从Ti总产生,Tn为根节点
2:从子树序列中,依据树的真实误差预计选择最佳决策树。
对于分类回归树中的每个非叶子节点计算它的表面误差率增益值α。
是子树中包括的叶子节点个数;
R(t)" alt="" width="30" height="18" style="border:0px">是节点t的误差代价。假设该节点被剪枝;
R(t)=r(t)*p(t)" alt="" width="121" height="18" style="border:0px">
r(t)是节点t的误差率;
p(t)是节点t上的数据占全部数据的比例。
R(T_t)" alt="" width="40" height="18" style="border:0px">是子树Tt的误差代价,假设该节点不被剪枝。它等于子树Tt上全部叶子节点的误差代价之和。
比方有个非叶子节点t4如图所看到的:
比方有个非叶子节点t4如图所看到的:
已知全部的数据总共同拥有60条。则节点t4的节点误差代价为:
子树误差代价为:
R(T_t)=\sum{R(i)}=(\frac{2}{5}*\frac{5}{60})+(\frac{0}{2}*\frac{2}{60})+(\frac{3}{9}*\frac{9}{60})=\frac{5}{60}" alt="" width="410" height="35" style="border:0px">
以t4为根节点的子树上叶子节点有3个,终于:
找到α值最小的非叶子节点,令其左右孩子为NULL。
当多个非叶子节点的α值同一时候达到最小时,取
|N_{T_t}|" alt="" width="34" height="17" style="border:0px">最大的进行剪枝。
剪枝过程特别重要,所以在最优决策树生成过程中占有重要地位。
有研究表明。剪枝过程的重要性要比树生成过程更为重要。对于不同的划分标准生成的最大树(Maximum Tree),在剪枝之后都可以保留最重要的属性划分,区别不大。反而是剪枝方法对于最优树的生成更为关键。
数据挖掘十大经典算法--CART: 分类与回归树的更多相关文章
- 数据挖掘十大经典算法(5) 最大期望(EM)算法
在统计计算中,最大期望(EM,Expectation–Maximization)算法是在概率(probabilistic)模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量(Lat ...
- ICDM评选:数据挖掘十大经典算法
原文地址:http://blog.csdn.net/aladdina/article/details/4141177 国际权威的学术组织the IEEE International Conferenc ...
- 数据挖掘十大经典算法(9) 朴素贝叶斯分类器 Naive Bayes
贝叶斯分类器 贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类.眼下研究较多的贝叶斯分类器主要有四种, ...
- 数据挖掘十大经典算法[0]-K-Means算法
K-Means算法的输入N,K和一个size为N的向量组vector.输出K个两两互不相交的向量组.其本质是将给定的向量组划分成K个类别,使得同类别的向量相似度比较大,而不同类别的向量之间的相似度较小 ...
- 数据挖掘领域十大经典算法之—C4.5算法(超详细附代码)
https://blog.csdn.net/fuqiuai/article/details/79456971 相关文章: 数据挖掘领域十大经典算法之—K-Means算法(超详细附代码) ...
- JS的十大经典算法排序
引子 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements JavaScript. 当年,想凭借抱Java大腿火一把而不惜把自己名字给改了的JavaScript(原名LiveScript ...
- CART分类与回归树与GBDT(Gradient Boost Decision Tree)
一.CART分类与回归树 资料转载: http://dataunion.org/5771.html Classification And Regression Tree(CART)是决策 ...
- 十大经典算法 Python实现
十大经典排序算法(python实现)(原创) 使用场景: 1,空间复杂度 越低越好.n值较大: 堆排序 O(nlog2n) O(1) 2,无空间复杂度要求.n值较大: 桶排序 O(n+k) O(n+k ...
- CART分类与回归树 学习笔记
CART:Classification and regression tree,分类与回归树.(是二叉树) CART是决策树的一种,主要由特征选择,树的生成和剪枝三部分组成.它主要用来处理分类和回归问 ...
随机推荐
- Mysql数据库系列
详情点击 MySQL基础 Mysql表操作 Mysql插入 更新 删除 查询操作 Mysql创建用户和授权 基本的Mysql语句 Mysql库的操作 Mysql表的操作 Mysql数据类型(一) My ...
- C99新增内容之变长数组(VLA)
我们在使用多维数组是有一点,任何情况下只能省略第一维的长度.比如在函数中要传一个数组时,数组的行可以在函数调用时传递,当属数组的列却只能在能被预置在函数内部.看下面一个例子: #define COLS ...
- Run as ant build每次都执行两次
因为用了selenium+testng+ant的框架,所以每次执行自动化,我就run as ant build.发现测试每次都执行两次,很奇怪.因为也没有影响到测试结果,所以一开始也就let it g ...
- 前端-git思维导图笔记
命令汇总 git config配置本地仓库 常用git config --global user.name.git config --global user.email git config --li ...
- Android Studio Library 编译成 jar,aar
1. 导入Library ,打开Library 的build gradle 在最外面添加如下: /** AVLView 自定义的jar 包名 **/ task clearJar(type: Dele ...
- 在命令提示符窗口下(cmd)使用指令操作并编译java代码,运行java编译代码
使用cmd操作java代码,编译.java文件,运行.class文件. 操作步骤: 1:创建一个文件夹: 例如:在e盘根目录(\)下面创建一个名为Hello的文件夹: 使用md指令:如图 在e盘中会生 ...
- 【SQL】约束
1. 添加约束 1)使用ALTER TABLE语句 •添加或删除约束,不会修改其结构 •启用和禁用约束 •通过使用MODIFY子句添加NOTNULL约束 ALTER TABLE <table_n ...
- OpenCV:OpenCV中的 parallel_for 和opencv parallel_for_
OpenCV使用OMP完成并行运算,在使用AdaBoost检测的时候,在cascadedetect.cpp 里面,大量使用 parallel_for_(Range(0, stripCount), Ca ...
- jQuery插件的怎么写
对于jQuery之前一直用,也看到过别人写的插件,直到最近才想着学习怎么写自己的jQuery插件,今天看了网上的一些资料,发现其实很简单的. 先看一个简单的jQuery插件的例子 <script ...
- 读书笔记「Python编程:从入门到实践」_11.测试函数
11.1 测试函数 要学习测试,得有要测试的代码.下面是一个简单的函数,它接受名和姓并返回整洁的姓名: def get_formatted_name(first, last): "" ...