• 决策树是什么

决策树是基于树结构来进行决策,这恰是人类在面临决策问题时一种很自然的处理机制。例如,我们要对“这是好瓜吗?”这样的问题进行决策时,通常会进行一系列的判断或“子决策”:我们先看“它是什么颜色?”,如果是“青绿色”,则我们再看“它的根蒂是什么形态?”,如果是“蜷缩”,我们再判断“它敲起来是什么声音?”,最后我们得出决策:这是一个好瓜。这个决策如图所示:

  • 决策树能做什么

决策树能实现对数据的探索,能对数据轮廓进行描述,能进行预测和分类,了解哪些变量最重要

  • 决策树基本流程

  • 几种分列准则

一 信息增益

二 增益率

三 基尼系数

  • 停止条件

1.如果节点中所有观测属于一类。
2.如果该节点中所有观测的属性取值一致。
3.如果树的深度达到设定的阈值。
4.如果该节点所含观测值小于设定的父节点应含观测数的阈值。
5.如果该节点的子节点所含观测数将小于设定的阈值。
6.如果没有属性能满足设定的分裂准则的阈值。

  • C4.5,对连续属性的处理

在C4.5中,对连续属性的处理如下:

1.      对特征的取值进行升序排序

2.      两个特征取值之间的中点作为可能的分裂点,将数据集分成两部分,计算每个可能的分裂点的信息增益(InforGain)。优化算法就是只计算分类属性发生改变的那些特征取值。

3.      选择修正后信息增益(InforGain)最大的分裂点作为该特征的最佳分裂点

4.      计算最佳分裂点的信息增益率(Gain Ratio)作为特征的Gain Ratio。注意,此处需对最佳分裂点的信息增益进行修正:减去log2(N-1)/|D|(N是连续特征的取值个数,D是训练数据数目,此修正的原因在于:当离散属性和连续属性并存时,C4.5算法倾向于选择连续特征做最佳树分裂点)

  • R代码实现(C5.0)

一.导入数据集,把目标变量转为因子

setwd("D:\\R_edu\\data")
rm(list=ls())
accepts<-read.csv("accepts.csv")
str(accepts)
accepts$bad_ind<-as.factor(accepts$bad_ind)
names(accepts)
accepts=accepts[,c(,:)]

根据业务理解生成更有意义的衍生变量,不过这些变量都是临时的,因为没有经过数据清洗,此处仅作一个示例

二.将数据分为训练集和测试集

set.seed()
select<-sample(:nrow(accepts),length(accepts$bad_ind)*0.7)
train=accepts[select,]
test=accepts[-select,]
summary(train$bad_ind)

三.运行C50算法建模

train<-na.omit(train)
library(C50)
ls('package:C50')
tc<-C5.0Control(subset =F,CF=0.25,winnow=F,noGlobalPruning=F,minCases =)
model <- C5.(bad_ind ~.,data=train,rules=F,control =tc)
summary( model )

四.图形展示

plot(model)
C5imp(model)

五.生成规则

rule<- C5.(bad_ind ~.,data=train,rules=T,control =tc)
summary( rule )
  • CRAT算法处理离散型变量

  1. 记m为样本T中该属性取值的种类数
  2. 穷举将m种取值分为两类的划分
  3. 对上述所有划分计算GINI系数
  • R代码实现CART算法

rpart包中有针对CART决策树算法提供的函数,比如rpart函数
以及用于剪枝的prune函数
rpart函数的基本形式:rpart(formula,data,subset,na.action=na.rpart,method.parms,control,...)

一.设置向前剪枝的条件

tc <- rpart.control(minsplit=,minbucket=,maxdepth=,xval=,cp=0.005)

rpart.control对树进行一些设置  
minsplit是最小分支节点数,这里指大于等于20,那么该节点会继续分划下去,否则停止  
minbucket:树中叶节点包含的最小样本数  
maxdepth:决策树最大深度
xval:交叉验证的次数
cp全称为complexity parameter,指某个点的复杂度,对每一步拆分,模型的拟合优度必须提高的程度

二.建模

rpart.mod=rpart(bad_ind ~.,data=train,method="class",
parms = list(prior = c(0.65,0.35), split = "gini"),
control=tc)
summary(rpart.mod)
#.3看变量重要性
rpart.mod$variable.importance
#cp是每次分割对应的复杂度系数
rpart.mod$cp
plotcp(rpart.mod)

三.画树图

library(rpart.plot)
rpart.plot(rpart.mod,branch=, extra=, under=TRUE, faclen=,
cex=0.8, main="决策树")

四.CART剪枝

prune函数可以实现最小代价复杂度剪枝法,对于CART的结果,每个节点均输出一个对应的cp
prune函数通过设置cp参数来对决策树进行修剪,cp为复杂度系数
我们可以用下面的办法选择具有最小xerror的cp的办法:

rpart.mod.pru<-prune(rpart.mod, cp= rpart.mod$cptable[which.min(rpart.mod$cptable[,"xerror"]),"CP"])
rpart.mod.pru$cp

五.绘制剪枝后的树状图

library(rpart.plot)
rpart.plot(rpart.mod.pru,branch=, extra=, under=TRUE, faclen=,
cex=0.8, main="决策树")

六.CART预测

  • 使用模型对测试集进行预测使用模型进行预测
  • 使用模型进行预测
rpart.pred<-predict(rpart.mod.pru,test)

可以看到,rpart.pred的结果有两列,第一列是为0的概率,第二列是为1的概率
通过设定阀值,得到预测分类

pre<-ifelse(rpart.pred[,]>0.5,,)

决策树及R语言实现的更多相关文章

  1. R语言︱决策树族——随机森林算法

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:有一篇<有监督学习选择深度学习 ...

  2. R语言学习——根据信息熵建决策树KD3

    R语言代码 决策树的构建 rm(list=ls()) setwd("C:/Users/Administrator/Desktop/R语言与数据挖掘作业/实验3-决策树分类") #s ...

  3. R语言学习笔记—决策树分类

    一.简介 决策树分类算法(decision tree)通过树状结构对具有某特征属性的样本进行分类.其典型算法包括ID3算法.C4.5算法.C5.0算法.CART算法等.每一个决策树包括根节点(root ...

  4. 决策树ID3原理及R语言python代码实现(西瓜书)

    决策树ID3原理及R语言python代码实现(西瓜书) 摘要: 决策树是机器学习中一种非常常见的分类与回归方法,可以认为是if-else结构的规则.分类决策树是由节点和有向边组成的树形结构,节点表示特 ...

  5. 数据挖掘算法R语言实现之决策树

    数据挖掘算法R语言实现之决策树 最近,看到很多朋友问我如何用数据挖掘算法R语言实现之决策树,想要了解这方面的内容如下: > library("party")导入数据包 > ...

  6. 关联规则-R语言实现

    关联规则code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && ...

  7. R语言与数据分析

    K最近邻(k-Nearest Neighbor,KNN)分类算法 R语言实现包:R语言中有kknn package实现了weighted k-nearest neighbor. 决策树: R语言实现决 ...

  8. 机器学习与R语言

    此书网上有英文电子版:Machine Learning with R - Second Edition [eBook].pdf(附带源码) 评价本书:入门级的好书,介绍了多种机器学习方法,全部用R相关 ...

  9. 数据分析与R语言

    数据结构 创建向量和矩阵 函数c(), length(), mode(), rbind(), cbind() 求平均值,和,连乘,最值,方差,标准差 函数mean(), sum(), min(), m ...

随机推荐

  1. Docker中部署Kubernetes

    Kubernetes为Google开源的容器管理框架,提供了Docker容器的夸主机.集群管理.容器部署.高可用.弹性伸缩等一系列功能:Kubernetes的设计目标包括使容器集群任意时刻都处于用户期 ...

  2. python-运算符

    1.算数运算: 2.比较运算: 3.赋值运算:   4.逻辑运算: 5.成员运算: 本文转载自http://www.cnblogs.com/wupeiqi/articles/5444685.html

  3. 无表头单链表的总结----从a链表中删去与b链表中有相同ID的那些节点

    #include"head.h" struct Student* del_same_ID(struct Student*p1, struct Student*p2) { struc ...

  4. MonoBehaviour Lifecycle(生命周期/脚本执行顺序)

    脚本执行顺序 前言 搭建一个示例来验证Unity脚本的执行顺序,大概测试以下部分: 物理方面(Physics) 渲染(Scene rendering) 输入事件(InputEvent) 流程图 Uni ...

  5. [bzoj1269][AHOI2006文本编辑器editor] (splay模版题 or pb_ds [rope]大法)

    Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义:   文本:由0个或 ...

  6. 杂项之使用qq邮箱发送邮件

    杂项之使用qq邮箱发送邮件 本节内容 特殊设置 测试代码 1. 特殊设置 之前QQ邮箱直接可以通过smtp协议发送邮件,不需要进行一些特殊的设置,但是最近使用QQ邮箱测试的时候发现以前使用的办法无法奏 ...

  7. [python]设计模式

    需要说明:java跟python在思维模式上并不一样,java利用接口以及多态可以实现很多抽象上的东西,而python不行,其实以下很多设计模式写法并不适用也没有必要,更多是为了对比和帮助理解这些设计 ...

  8. PAT 1049. 数列的片段和(20)

    给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1 ...

  9. 【swift学习笔记】五.使用枚举优雅的管理Segue

    在做页面转跳的时候,我们要给Segue命名,如果Segue多了,管理他们就是一个恶梦.我们可以枚举更优雅的管理这些Segue. 1.我们先来建立一个protocol,他的功能就是让实现类实现一个Seg ...

  10. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...