c5.0决策树算法原理中c5.0和cart的区别是什么

一、CART决策树模型概述(Classification And Regression Trees)
  &&决策树是使用类似于一棵树的结构来表示类的划分,树的构建可以看成是变量(属性)选择的过程,内部节点表示树选择那几个变量(属性)作为划分,每棵树的叶节点表示为一个类的标号,树的最顶层为根节点。
& & & &决策树是通过一系列规则对数据进行分类的过程。它提供一种在什么条件下会得到什么值的类似规则的方法。决策树算法属于有指导的学习,即原数据必须包含预测变量和目标变量。决策树分为分类决策树(目标变量为分类型数值)和回归决策树(目标变量为连续型变量)。分类决策树叶节点所含样本中,其输出变量的众数就是分类结果;回归树的叶节点所含样本中,其输出变量的平均值就是预测结果。&
&&&&&&& 决策树是一种倒立的树结构,它由内部节点、叶子节点和边组成。其中最上面的一个节点叫根节点。 构造一棵决策树需要一个训练集,一些例子组成,每个例子用一些属性(或特征)和一个类别标记来描述。构造决策树的目的是找出属性和类别间的关系,一旦这种关系找出,就能用它来预测将来未知类别的记录的类别。这种具有预测功能的系统叫决策树分类器。
决策树有非常良好的优点:
1)决策树的够造不需要任何领域知识,就是简单的IF...THEN...思想 ;
2)决策树能够很好的处理高维数据,并且能够筛选出重要的变量;
3)由决策树产生的结果是易于理解和掌握的;
4)决策树在运算过程中也是非常迅速的;
5)一般而言,决策树还具有比较理想的预测准确率。
CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很好的解决分类问题。但需要注意的是,该算法是一个二叉树,即每一个非叶节点只能引伸出两个分支,所以当某个非叶节点是多水平(2个以上)的离散变量时,该变量就有可能被多次使用。
决策树算法中包含最核心的两个问题,即特征选择和剪枝:
关于特征选择目前比较流行的方法是信息增益、增益率、基尼系数和卡方检验,下文就先介绍基于基尼系数的特征选择,因为本文所描述的CART决策树就是基于基尼系数选择特征的;
关于剪枝问题,主要分预剪枝和后剪枝,预剪枝是在树还没有生长之前就限定了树的层数、叶节点观测数量等,而后剪枝是在树得到充分生长后,基于损失矩阵或复杂度方法实施剪枝,下文将采用后剪枝的方法对树进行修正。
二、决策树的核心问题
&&&&&& 决策树核心问题有二:一是利用Training Data完成决策树的生成过程;二是利用Testing Data完成对决策树的精简过程。即前面我们提到的,生成的推理规则往往过多,精简是必需的。
1)决策树的生长
决策树生长过程的本质是对Training Data反复分组(分枝)的过程,当数据分组(分枝)不再有意义——注意,什么叫分组不再有意义——时,决策树生成过程停止。因此,决策树生长的核心算法是确定数据分析的标准,即分枝标准。
何为有意义呢?注意,当决策树分枝后结果差异不再显著下降,则继续分组没有意义。也就是说,我们分组的目的,是为了让输出变量在差异上尽量小,到达叶节点时,不同叶节点上的输出变量为相同类别,或达到用户指定的决策树停止生成的标准。
这样,分枝准则涉及到两方面问题:1、如果从众多输入变量中选择最佳分组变量;2、如果从分组变量的众多取值中找到最佳分割点。不同的决策树算法,如C4.5、C5.0、Chaid、Quest、Cart采用了不同策略。
2)决策树的修剪
完整的决策树并不是一棵分类预测新数据对象的最佳树。其原因是完整的决策树对Training Data描述过于“精确”。我们知道,随着决策树的生长,决策树分枝时所处理的样本数量在不断减少,决策树对数据总体珠代表程度在不断下降。在对根节点进行分枝时,处理的是全部样本,再往下分枝,则是处理的不同分组下的分组下的样本。可见随着决策树的生长和样本数量的不断减少,越深层处的节点所体现的数据特征就越个性化,可能出现如上推理规则:“年收入大于50000元且年龄大于50岁且姓名叫张三的人购买了此产品”。这种过度学习从而精确反映Training Data特征,失去一般代表性而无法应用于新数据分类预测的现象,叫过度拟合(Overfitting)或过度学习。那我们应该怎么办呢?修剪!
常用的修剪技术有预修剪(Pre-Pruning)和后修剪(Post-Pruning)。
Pre-Pruning可以事先指定决策树的最大深度,或最小样本量,以防止决策树过度生长。前提是用户对变量聚会有较为清晰的把握,且要反复尝试调整,否则无法给出一个合理值。注意,决策树生长过深无法预测新数据,生长过浅亦无法预测新数据。
Post-pruning是一个边修剪边检验的过程,即在决策树充分生长的基础上,设定一个允许的最大错误率,然后一边修剪子树,一边计算输出结果的精度或误差。当错误率高于最大值后,立即停止剪枝。
基于Training Data(训练集)的Post-Pruning(剪枝)应该使用Testing Data(测试集)。
决策树中的C4.5、C5.0、CHAID、CART和QUEST都使用了不同 剪枝策略。
案例、使用rpart()回归树分析糖尿病的血液化验指标
install.packages("rpart")
library("rpart")
install.packages("rpart.plot")
library(rpart.plot)
1、主要应用函数:
1)构建回归树的函数:rpart()
rpart(formula, data, weights, subset,na.action = na.rpart, method,
model = FALSE, x = FALSE, y = TRUE, parms, control, cost, ...)
主要参数说明:
fomula:回归方程形式:例如 y~x1+x2+x3。
data:数据:包含前面方程中变量的数据框(dataframe)。
na.action:缺失数据的处理办法:默认办法是删除因变量缺失的观测而保留自变量缺失的观测。
method:根据树末端的数据类型选择相应变量分割方法,本参数有四种取值:连续型“anova”;离散型“class”;计数型(泊松过程)“poisson”;生存分析型“exp”。程序会根据因变量的类型自动选择方法,但一般情况下最好还是指明本参数,以便让程序清楚做哪一种树模型。
parms:用来设置三个参数:先验概率、损失矩阵、分类纯度的度量方法。
cost:损失矩阵,在剪枝的时候,叶子节点的加权误差与父节点的误差进行比较,考虑损失矩阵的时候,从将“减少-误差”调整为“减少-损失”
control:控制每个节点上的最小样本量、交叉验证的次数、复杂性参量:即cp:complexitypamemeter,这个参数意味着对每一步拆分,模型的拟合优度必须提高的程度,等等。rpart.control对树进行一些设置
xval是10折交叉验证
minsplit是最小分支节点数,这里指大于等于20,那么该节点会继续分划下去,否则停止
minbucket:叶子节点最小样本数;maxdepth:树的深度
cp全称为complexity parameter,指某个点的复杂度,对每一步拆分,模型的拟合优度必须提高的程度,用来节省剪枝浪费的不必要的时间。
2)进行剪枝的函数:prune()
prune(tree, cp, ...)
主要参数说明:
tree:一个回归树对象,常是rpart()的结果对象。
cp:复杂性参量,指定剪枝采用的阈值。cp全称为complexity parameter,指某个点的复杂度,对每一步拆分,模型的拟合优度必须提高的程度,用来节省剪枝浪费的不必要的时间。
二、特征选择
CART算法的特征选择就是基于基尼系数得以实现的,其选择的标准就是每个子节点达到最高的纯度,即落在子节点中的所有观察都属于同一个分类。下面简单介绍一下有关基尼系数的计算问题:
假设数据集D中的因变量有m个水平,即数据集可以分成m类群体,则数据集D的基尼系数可以表示为:
由于CART算法是二叉树形式,所以一个多水平(m个水平)的离散变量(自变量)可以把数据集D划分为2^m-2种可能。举个例子也许能够明白:如果年龄段可分为{青年,中年,老年},则其子集可以是{青年,中年,老年}、{青年,中年}、{青年,老年}、{中年,老年}、{青年}、{中年}、{老年}、{}。其中{青年,中年,老年}和空集{}为无意义的Split,所以6=2^3-2。
对于一个离散变量来说,需要计算每个分区不纯度的加权和,即对于变量A来说,D的基尼系数为:
对于一个连续变量来说,需要将排序后的相邻值的中点作为阈值(分裂点),同样使用上面的公式计算每一个分区不纯度的加权和。
根据特征选择的标准,只有使每个变量的每种分区的基尼系数达到最小,就可以确定该变量下的阈值作为分裂变量和分裂点。如果这部分读的不易理解的话,可参考《数据挖掘:概念与技术》一书,书中有关于计算的案例。
剪枝是为了防止模型过拟合,而更加适合样本外的预测。一般决策树中的剪枝有两种方式,即预剪枝和后剪枝,而后剪枝是运用最为频繁的方法。后剪枝中又分为损失矩阵剪枝法和复杂度剪枝法,对于损失矩阵剪枝法而言,是为了给错误预测一个惩罚系数,使其在一定程度上减少预测错误的情况;对于复杂度剪枝法而言,就是把树的复杂度看作叶节点的个数和树的错误率(错误分类观察数的比例)的函数。这里讲解的有点抽象,下面我们通过一个简单的例子来说明后剪枝的作用。
四、案例分享
以“知识的掌握程度”数据为例,说说决策树是如何实现数据的分类的(数据来源
:http://archive.ics.uci.edu/ml/datasets/User+Knowledge+Modeling)。
该数据集通过5个维度来衡量知识的掌握程度,它们分别是:
STG:目标科目的学习时长程度;&
SCG:对目标科目的重复学习程度;&
STR:其他相关科目的学习时长程度;
LPR:其他相关科目的考试成绩;&
PEG:目标科目的考试成绩。&
知识的掌握程度用UNS表示,它有4个水平,即Very Low、Low、Middle、High。
#读取外部文件
Train &- read.csv(file = file.choose())
Test &- read.csv(file = file.choose())
#加载CART算法所需的扩展包,并构建模型
library(rpart)
fit &- rpart(UNS ~ ., data = Train)
#查看模型输出的规则
上面的输出规则看起来有点眼花缭乱,我们尝试用决策树图来描述产生的具体规则。由于rpart包中有plot函数实现决策树图的绘制,但其显得很难看,我们下面使用rpart.plot包来绘制比较好看的决策树图:
#加载并绘制决策树图
library(rpart.plot)
rpart.plot(fit, branch = 1, branch.type = 1, type = 2, extra = 102,shadow.col='gray', box.col='green',border.col='blue', split.col='red',main="CART决策树")
上图可一目了然的查看具体的输出规则,如根节点有258个观测,其中Middle有88个,当PEG&=0.68时,节点内有143个观测,其中Middle有78个,当PEG&=0.12且PEG&0.34时,节点内有115个观察,其中Low有81个,以此类推还可以得出其他规则。
#将模型用于预测
Pred &- predict(object = fit, newdata = Test[,-6], type = 'class')
#构建混淆矩阵
CM &- table(Test[,6], Pred)
#计算模型的预测准确率
Accuracy &- sum(diag(CM))/sum(CM)
结果显示,模型在测试集中的预测能力超过91%。但模型的预测准确率还有提升的可能吗?下面我们对模型进行剪枝操作,具体分损失矩阵法剪枝和复杂度剪枝:
根据混淆矩阵的显示结果,发现High的预测率达100%(39/39),Low的预测率达91.3%(42/46),Middle的预测率达88.2%(30/34),very_low的预测率达80.8(21/26)。如果希望提升very_low的预测准确率的话就需要将其惩罚值提高,经尝试调整,构建如下损失矩阵:
vec = c(0,1,1,1,1,0,1,1,1,2,0,1,1,3.3,1,0)
cost = matrix(vec, nrow = 4, byrow = TRUE)
fit2 = rpart(UNS ~ ., data = Train, parms = list(loss = cost))
Pred2 = predict(fit2, Test[,-6], type = 'class')
CM2 &- table(Test[,6], Pred2)
Accuracy2 &- sum(diag(CM2))/sum(CM2)
准确率提升了1.4%,且在保证High、Low、Middle准确率不变的情况下,提升了very_low的准确率88.5%,原来为80.8%。
下面再采用复杂度方法进行剪枝,先来看看原模型的CP值:
printcp(fit)
复杂度剪枝法满足的条件是,在预测误差(xerror)尽量小的情况下(不一定是最小值,而是允许最小误差的一个标准差(xstd)之内),选择尽量小的cp值。这里选择cp=0.01。
fit3 = prune(fit, cp = 0.01)
Pred3 = predict(fit3, Test[,-6], type = 'class')
CM3 &- table(Test[,6], Pred3)
Accuracy3 &- sum(diag(CM3))/sum(CM3)
很显然,模型的准确率并没有得到提升,因为这里满足条件的cp值为0.01,而函数rpart()默认的cp值就是0.01,故模型fit3的结果与fit一致。
确定递归建树的停止条件:否则会使节点过多,导致过拟合。
1.&每个子节点只有一种类型的记录时停止,这样会使得节点过多,导致过拟合。
2.&可行方法:当前节点中的记录数低于一个阈值时,那就停止分割。
过拟合原因:
(1)噪音数据,某些节点用噪音数据作为了分割标准。
(2)缺少代表性的数据,训练数据没有包含所有具有代表性的数据,导致某类数据无法很好匹配。
(3)还就是上面的停止条件设置不好。
阅读(...) 评论()浅谈C5.0与CART算法的比较--理论理解
一、决策树的发展
决策树是目前比较流行的一种分类算法,实质上是一种自上而下的归纳学习算法。该算法最早由Quinlan在1986年提出,当时称为ID3算法,该算法是基于信息增益进行节点变量的选择,但该选择方法会倾向于属性值比较多的那些变量(如省份字段有31个水平,性别有2个水平,信息增益首选会考虑选择省份作为特征节点);而且该算法在构造树的时候不能很好的处理连续的自变量,导致该算法的扩展性比较弱;随后的1993年,Quinlan又提出了C4.5算法,改进了ID3的缺点,即使用信息增益率进行特征节点的选择,避免了偏袒的可能性,而且该算法对自变量不作任何的限制,但是最大的缺点是该算法的运行效率比较低;为了解决效率的问题,基于C4.5提出了商业版的C5.0,可惜的是C5.0并没有公布算法的更多细节,但其主要核心部分还是和C4.5一致的。与此同时,1984年Brieman等人提出了CART算法,该算法拥有一个非常完整的体系,包括树的生长过程(采用基尼指数选择树的节点)、剪枝过程等,而且该算法还可以解决回归问题。接下来就针对C5.0和CART算法做一个简要的对比。
二、C5.0与CART的比较
1、C5.0是一种多叉树(即如果根节点或中间节点存在连续型的自变量,则该变量会一分为二的展开两个分支;如果根节点或中间节点存在离散的自变量,则该变量会根据离散变量的水平数分开多个分支),就会导致某个变量一旦被使用,后面的节点将不会再启用该变量。
2、C5.0决策树的生长过程采用的是最大信息增益率原则进行节点选择和分裂点的选择,具体可从下方的理论中理解:
信息熵反应的是信息杂乱程度,信息越杂乱(越不纯),则信息熵越大;反之,信息熵越小。其数学公式为:
其中-log2(pj)反应的是信息量,即某随机事件发生的概率越小,则信息量越大;反之概率越大,则信息量越小。所以信息熵就是指事件发生的概率(pj)乘以其对应的信息量(-log2(pj)),然后再加总。
信息增益的计算为:
其中,Info为Y变量的信息熵,InfoA为自变量A对Y变量分割的信息熵,
接下来举个例子,也许你就能够明白。
Y变量为是否相亲,不妨我们计算学历这个变量对Y变量的分割信息增益值。
Y变量的信息熵:
学历对Y变量的分割信息熵:
学历对Y变量的分割信息增益:
在非叶节点的特征选择时,我们要求信息增益最大化,但考虑信息增益最大化会带来一个问题,就是特征的选择会倾向于那些离散水平多的变量。例如两种极端情况:一种是ID变量(当作离散变量处理),该变量对Y变量的分割信息增益就等于Y变量的信息熵,达到最大;另一种是单一值变量,如国籍,该变量对Y变量的分割信息增益就等于0,达到最小,所以节点变量很可能会选择ID变量。但这样做其实是对那些水平比较少的离散变量的一种不公平处理。于是就提出了信息增益率的概念,即:
SI为分割信息,说白了就是计算自变量A的信息熵;信息增益率就是在信息增益的基础上除以自变量A的信息熵。仍然接着上面的学历例子:
学历变量的信息熵:
学历对Y变量的分割信息增益率:
通过这样的一个变换就可以解决信息增益存在的偏袒弊端。
3、剪枝采用“减少-误差”法和“减少-损失”法技术
“减少-误差”法:其核心思想是对比剪枝前后的误差率,如果剪枝后的误差率比剪枝前的误差率要低,则剪枝,否则不剪枝。关于误差率的计算:如果第i个节点中包含N个样本,其中预测错误的样本量为M,则该节点的错误率为f=M/N,根据正态分布假设,该观测错误率的置信区间为:
所以得到悲观的真实错误率为:
该剪枝方法所设定的默认alpha值为0.25,所以,alpha(置信水平)越小,则1-alpha(置信度)就越大,就越可能执行剪枝,使得真实错误率越小,模型的泛化能力越大。
“减少-损失”法:该方法结合损失矩阵对树进行剪枝,核心思想是比较剪枝前后损失量,如果剪枝后的损失要小于剪枝前的损失,则剪枝,否则不剪枝。有关损失的计算如下:
其中,k为待剪子树中叶节点的个数,pi为第i个叶节点所含样本量占子树所含样本量的比例,ei为第i个叶节点的估计误差,oi为第i个叶节点的错判损失,e为父节点的估计误差,o为父节点的错判损失。
4、C5.0算法只能解决分类问题。
1、是一个二叉树,即每一个非叶节点只能引伸出两个分支,所以当某个非叶节点是多水平(2个以上)的离散变量时,该变量就有可能被多次使用。举个例子也许能够明白:如果年龄段可分为{青年,中年,老年},则其子集可以是{青年,中年,老年}、{青年,中年}、{青年,老年}、{中年,老年}、{青年}、{中年}、{老年}、{}。其中{青年,中年,老年}和空集{}为无意义的分割,所以最终有2^3-2=6种组合,形成3对对立的组合,如{青年,中年}与{老年}可以分出两个分支。
2、CART决策树的生长过程采用的是最大基尼增益指数原则进行节点选择和分裂点的选择,具体可从下方的理论中理解:
对于分类问题
Y变量的基尼指数:
自变量A对Y变量的分割基尼增益指数:
我们仍然拿上面的相亲数据为例,计算学历的各个水平对Y变量的分割基尼增益指数:
Y变量的基尼指数:
{大专}与{本科、硕士}二叉树的基尼指数:
所以,大专与非大专的分割基尼增益指数为0.486-0.483=0.003。
{本科}与{大专、硕士}二叉树的基尼指数:
所以,本科与非本科的分割基尼增益指数为0.486-0.438=0.048。
{硕士}与{大专、本科}二叉树的基尼指数:
所以,硕士与非硕士的分割基尼增益指数为0.486-0.419=0.067。
对于回归问题
非叶结点的特征选择及分割点选择使用最小二乘偏差:
Y变量的最小二乘偏差:
其中,yi为实际的连续值,ri为预测的连续值;ri的是由某个叶节点中样本均值来衡量。
自变量A对Y变量的分割最小二乘偏差增益:
其中,beta为连续变量的某个分割点,基于这个分割点可以将数据分成两组。
3、剪枝采用“最小代价复杂度”法和“损失矩阵”法技术
最小代价复杂度说白了就是某个中间节点中往叶节点发展的过程中,其大错误率是否下降的明显,如果不明显,则剪枝,否则不减枝。具体数学公式如下:
举个例子也许你就明白了:
上图反应了一个简单的树,根节点有100个样本,两个中间节点T1,T2和4个叶节点。则中间节点T1,T2误差率增益值α分别为:
可通过设置一个阈值,当误差率增益值α低于阈值时可以考虑剪枝。
损失矩阵的思想与C5.0的类似,这里就不在赘述。
4、CART算法既可以解决分类问题(Y变量为离散变量),也能够很好的处理预测问题(Y变量为连续变量)。
关于两个算法的理论比较我们今天就讲到这里,主要是从算法的几叉树?如何选择节点特征、分割点?树的剪枝技术?和各自解决的问题做了梳理。在下一期我们将针对这两个算法如何通过R语言实现落地,并通过案例完成两个算法的较量。
本文已获得原作者授权
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点R语言之决策树CART、C4.5算法
来源:博客园
决策树是以树的结构将决策或者分类过程展现出来,其目的是根据若干输入变量的值构造出一个相适应的模型,来预测输出变量的值。预测变量为离散型时,为分类树;连续型时,为回归树。
常用的决策树算法: ID3
使用信息增益作为分类标准 ,处理离散数据,仅适用于分类树 。
CART使用基尼系数作为分类标准,离散、连续数据均可,适用于分类树,回归树。 rpart包
rpart()C4.5使用信息增益和增益率相结合作为分类标准,离散、连续数据均可,但效率较低,适用于分类树 RWeka包
J48()C5.0是C4.5用于大数据集的拓展,效率较高 C50包
建模过程:
1)选定一个最佳变量将全部样本分为两类,并且实现两类中的纯度最大化,其分类标准有“信息增益”,“增益率”,“基尼系数”等。具体理论可参考周志华老师的《机器学习》一书。
2)对每一个分类子集重复步骤1)。
3)重复步骤1)、2),直到没有分类方法能将不纯度下降到给定的阈值以下。
4)根据步骤3)得出的模型预测所属类别。
用到的程序包rpart,raprt.plot.RWake,sampling,partykit。 建模所用数据为UCI机器学习数据库里的威斯康星州乳腺癌数据集和汽车数据集mtcars。仅以CART和C4.5算法函数的调用为例,C5.0算法的调用可用C50包中的C5.0()函数。一、CART算法
1、数据预处理,建立好训练集和预测集。代码如下:可参见《R语言实战》。& loc&-"http://archive.ics.uci.edu/ml/machine-learning-databases/"& ds&-"breast-cancer-wisconsin/breast-cancer-wisconsin.data"& url&-paste(loc,ds,sep="")& data&-read.table(url,sep=",",header=F,na.strings="?")& names(data)&-c("ID","clumpThickness","sizeUniformity",+
"shapeUniformity","maginalAdhesion",+
"singleEpithelialCellSize","bareNuclei",+
"blandChromatin","normalNucleoli",+
"mitosis","class")& data$class[data$class==<span style="color: #]&-"良性"& data$class[data$class==<span style="color: #]&-"恶性"& data&-data[-<span style="color: #]& set.seed(<span style="color: #34)& train&-sample(nrow(data),<span style="color: #.7*nrow(data))& tdata&-data[train,]& vdata&-data[-train,]
2、用rpart()构建树rpart()函数的格式:
rpart(formula,data,weights,subsets,na.action=na.rpart,method,parms,control...)formula
如y1~y2+y3+y4或者简写形式y1~.(表示输入变量为除y的所有变量)。
训练集。subset从data中选取子集建模。na.action缺失值处理,默认为na.rpart。表示剔除缺失y值或者缺失所有输入变量的数据。method选择决策树的类型。"anova"对应回归树。“class”用于分类变量,对应分类树。“poisson”用于二分类变量,对应分类树。“exp”用于生存分析。 parms此参数只适用于分类变量。若method="class",则parms=list(split,prior,loss).其中split可取“information”(信息增益分类规则),“gini” (基尼分类规则)。不同的分类规则分别对应上述不同的算法。control控制树的各种参数。control=list(minsplit,minbucket=round(minsplit/3),...)minsplit每个节点中所含样本最小数,默认为10.当训练集样本数较少时,需自己设置此参数大小,否则可能因为样本数较少与此参数默认值冲突,导致画出来的树没有分支。minbucket叶节点中所含样本最小数.cp复杂度参数,通常设定阈值用来剪枝。& library(rpart)& dtree&-rpart(class~.,data=tdata,method="class", parms=list(split="information"))
#使用ID3算法,若split="gini",则为CART算法。& printcp(dtree)Classification tree:rpart(formula = class ~ ., data = tdata, method = "class", parms = list(split = "information"))Variables actually used in tree construction:[<span style="color: #] bareNuclei
clumpThickness
shapeUniformity sizeUniformity Root node error: <span style="color: #0/<span style="color: #9 = <span style="color: #.3272n= <span style="color: #9
CP nsplit rel error
xstd<span style="color: # <span style="color: #.800000
<span style="color: #
<span style="color: #.00000 <span style="color: #.00000 <span style="color: #.064846<span style="color: # <span style="color: #.046875
<span style="color: #
<span style="color: #.20000 <span style="color: #.27500 <span style="color: #.039549<span style="color: # <span style="color: #.012500
<span style="color: #
<span style="color: #.10625 <span style="color: #.16875 <span style="color: #.031567<span style="color: # <span style="color: #.010000
<span style="color: #
<span style="color: #.09375 <span style="color: #.16875 <span style="color: #.031567
3、prune()剪枝,提高模型的泛化能力
prune(tree,cp,...)& dtree$cptable
#剪枝前的复杂度
nsplit分枝数
rel error训练集对应的误差
xerror 10折交叉验证误差
xstd交叉验证误差的标准差
CP nsplit rel error
xstd<span style="color: # <span style="color: #.800000
<span style="color: #
<span style="color: #.00000 <span style="color: #.00000 <span style="color: #.<span style="color: # <span style="color: #.046875
<span style="color: #
<span style="color: #.20000 <span style="color: #.27500 <span style="color: #.<span style="color: # <span style="color: #.012500
<span style="color: #
<span style="color: #.10625 <span style="color: #.16875 <span style="color: #.<span style="color: # <span style="color: #.010000
<span style="color: #
<span style="color: #.09375 <span style="color: #.16875 <span style="color: #.& tree&-prune(dtree,cp=<span style="color: #.0125)& tree$cptable
#剪枝后的复杂度及分枝数
CP nsplit rel error
xstd<span style="color: # <span style="color: #.800000
<span style="color: #
<span style="color: #.00000 <span style="color: #.00000 <span style="color: #.<span style="color: # <span style="color: #.046875
<span style="color: #
<span style="color: #.20000 <span style="color: #.27500 <span style="color: #.<span style="color: # <span style="color: #.012500
<span style="color: #
<span style="color: #.10625 <span style="color: #.16875 <span style="color: #.
4、画出树图rpart.plot()
rpart.plot(tree,type,fallen.leaves=T,branch,...) tree
画图所用的树模型。
type可取1,2,3,4.控制图形中节点的形式。fallen.leaves默认值为T,在图的地段显示终端节点。branch控制图的外观。如branch=1,获得垂直树干的决策树。树状图代码如下:& opar&-par(no.readonly = T)& par(mfrow=c(<span style="color: #,<span style="color: #))& library(rpart.plot)& rpart.plot(dtree,branch=<span style="color: #,type=<span style="color: #, fallen.leaves=T,cex=<span style="color: #.8, sub="剪枝前")& rpart.plot(tree,branch=<span style="color: #, type=<span style="color: #,fallen.leaves=T,cex=<span style="color: #.8, sub="剪枝后")& par(opar)上述代码画出剪枝前后的决策树,图如下所示:5、利用预测集检验模型效果predict()格式
predict(fit,newdata,type,...)& predtree&-predict(tree,newdata=vdata,type="class")
#利用预测集进行预测& table(vdata$class,predtree,dnn=c("真实值","预测值"))
#输出混淆矩阵
预测值真实值 恶性 良性
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #2从混淆矩阵可以看出此模型准确率为(79+122)/(79+2+7+122)=95.71% 二、C4.5算法
RWeka包里的J48()可实现C4.5算法的调用。调用格式:
J48(formula,data,subset,na.action,control=Weka_control(u=T,c=0.25,M=2,R=T,N=3,B=T),options=NULL)U
默认值为TURE,表示不剪枝。
C对剪枝过程设置的置信阈值。M默认值为2,表示叶节点最小样本量。R默认值为TURE,表示按错误率递减剪枝。N默认值为3,表示在R=T的情况下,交叉验证的折叠次数。B默认值为T,表示是否建立二叉树。 对R自带的数据集mtcars的变量mpg进行分类预测。
1、对mpg进行分组,创建训练集和预测集,代码如下:& y&-quantile(mtcars$mpg,c(.<span style="color: #,.<span style="color: #,.<span style="color: #,.<span style="color: #))
#对mpg的数值取分位数& mtcars$group[mtcars$mpg&y[<span style="color: #]&mtcars$mpg&=y[<span style="color: #]]&-"A"
& mtcars$group[mtcars$mpg&y[<span style="color: #]&mtcars$mpg&=y[<span style="color: #]]&-"B"& mtcars$group[mtcars$mpg&y[<span style="color: #]&mtcars$mpg&=y[<span style="color: #]]&-"C"& mtcars$group[mtcars$mpg&y[<span style="color: #]]&-"D"& mtcars$group&-factor(mtcars$group)
#将要预测的变量定义为因子,否则J48()函数无法识别& a&-round(<span style="color: #/<span style="color: #*sum(mtcars$group=="A"))& b&-round(<span style="color: #/<span style="color: #*sum(mtcars$group=="B"))& c&-round(<span style="color: #/<span style="color: #*sum(mtcars$group=="C"))& d&-round(<span style="color: #/<span style="color: #*sum(mtcars$group=="D"))library(sampling) & sub&-strata(mtcars,stratanames="group",size=c(a,b,c,d),method="srswor")
#对分组变量采用分层抽样,保证样本的代表性& tdata&-mtcars[sub$ID_unit,]
#训练集& vdata&-mtcars[-sub$ID_unit,]
2、创建分类树J48()& library(RWeka)
& ctree&-J48(group~.,data=tdata,control=Weka_control(M=<span style="color: #))& print(ctree)J48 pruned tree------------------mpg &= <span style="color: #.7|
mpg &= <span style="color: #.7: D (<span style="color: #.0)|
mpg & <span style="color: #.7|
mpg &= <span style="color: #.8: C (<span style="color: #.0)|
mpg & <span style="color: #.8: B (<span style="color: #.0)mpg & <span style="color: #.7: A (<span style="color: #.0)Number of Leaves
<span style="color: #Size of the tree :
<span style="color: #& library(partykit)& plot(ctree,type="simple")
#画出树图,结果如下,由于训练集的数据较少,只有23条数据,最后的树图仅以mpg作为分支变量,也直接影响了最后的准确率。
3、预测predict()& pretree&-predict(ctree,newdata=vdata)& table(pretree,vdata$group,dnn=c("预测值","真实值"))
#输出混淆矩阵
真实值预测值 A B C D
A <span style="color: # <span style="color: # <span style="color: # <span style="color: #
B <span style="color: # <span style="color: # <span style="color: # <span style="color: #
C <span style="color: # <span style="color: # <span style="color: # <span style="color: #
D <span style="color: # <span style="color: # <span style="color: # <span style="color: #& pretree[<span style="color: #] A A C C C A A A CLevels: A B C D& vdata$group[<span style="color: #] A A C C C A A B DLevels: A B C D准确率为77%。因为数据较少,所以准确率会稍低。
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动

我要回帖

更多关于 决策树算法 c 实现 的文章

 

随机推荐