决策树是一种简单但使用广泛的分类算法,根据目标变量的类型,决策树分为分类决策树(目标变量为因子型)与回归决策树(目标变量为连续数值型)。在这里,我们使用R建议一个回归决策树模型。

决策树简单介绍

对于一个分类问题,我们可能需要多个属性值来构建问题,通过回答这些问题(比如长度大于多少,宽度大于多少,重量大于多少),有序地得到问题的答案,并重复问题到我们得到最后的分类,把上面的过程(问题、答案)有组织的组合在一起,就能形成类似倒立的树结构。图1:摘自《数据挖掘导论》

上面是摘自《数据挖掘导论》决策树章节,我们根据不同的属性特征,对动物进行分类。

问题1:体温特征是什么?

答案1:冷血→非哺乳动物;恒温→问题2;

问题2:是否为胎生?

答案2:胎生→哺乳动物;非胎生:非哺乳动物;

这就是一个简单的决策树,我们通过不停得提出问题,根据问题的答案又提出新的问题,不断重复直到得到我们的分类类别。这个过程称为决策树的生长,而第一个问题(问题1)我们称为根节点,其余问题(问题2,问题3,...,问题i)称为内部节点,最后的类别(哺乳动物、非哺乳动物)则称为叶结点。

什么是修枝?

决策树是一种监督下学习算法,需要提供变量与类别值(目标变量)。随着变量的增加,决策树也生长成一棵巨大的树,我们的内部节点也会非常多。这时候我们会发现这个内部节点的描述(问题n)可能就变成这样了:年收入大于50000元、年龄大于50岁、姓名叫张三的人购买了此产品。越多的限定条件(规则),越能够拟合训练集,但使用上面的限定条件来预测未知测试集。我们就会发现预测的结果非常不理想(根本没有名字叫张三的人年收入在50000且年龄大于50),这就是模型的过拟合。

为了避免模型过拟合,我们要对决策树进行修枝。很形象的说法,对于一棵枝叶茂盛的树,我们通过修枝让树枝按我们想要的方向生长。而在决策树种,通过修枝,我们把限定条件适当的减去(比如把名字叫张三这个内部节点删去),防止模型过拟合。常用的修枝方法有:预修枝;

后修枝;

预修枝:在建立模型之前,我们就指定了决策树的最大深度(内部节点数),或者最小样本量。但是需要我们对变量的业务理解较深,且要反复试验,才能取到“最优值”。注意:无论是最大深度过浅还是过深,都会造成糟糕的预测结果。

后修枝:预先设定的最大错误率,在决策树充分生长后再修剪,每减少一个内部节点就检验模型的错误率,当模型的错误率大于预先设定值时,停止修剪。

根据修枝的不同策略,决策树算法可以分为:C4.5、C5.0、CHAID、CART和QUEST。

回归决策树

当目标变量为连续型数值型时,决策树为回归决策树。对于连续型数值型来说,如何来划分类别呢?图2:摘自《数据挖掘导论》

假设我们有变量x,y,我们要预测出目标变量z。图2中的点为目标变量z在二维平面的投影。划分步骤如下:

1、根节点:x < 0.43

0.43???为什么是0.43?0.43是根据一些准则算出来的,比如Gini指标、熵、分类误差等。如下图3,我们根据Gini指标,选择最佳划分值。图3:摘自《数据挖掘导论》

首先,我们将x变量按顺序排序,取相邻两个观测值的均值作为划分依据(划分点),同时计算其Gini指标,根据这些Gini指标,选择最优的划分值。

ps:Gini指标越小越好,所以图3选择了97作为划分值。

2、内部节点:y < 0.47,y < 0.33

重复上面划分值的选择,在x不同划分下,分别选出y的最佳划分点。

3、叶结点

叶结点将z变量分成了四类。

好了,根据决策树模型,我们将x,y分成四类,那么我们如何预测未知值呢?假设我们现在有一个未知观测(x1,y1),根据模型,该观测归于类1,那么其z1值则为所有类1的均值。

R建立模型

在上一篇文章中,我们使用了SVR模型预测了面试者的年薪来判断面试者的要求是否合理,在这里,我仍使用该数据,但我们使用回归决策树来预测面试者的年薪。

#载入相关库

library(rpart)

library(readr)

library(ggplot2)

#读入数据

dataset

数据集的介绍与散点图请点击这里查看,在这里就不重复了。下面直接使用rpart包来建立一个回归决策树模型。

#建立模型

regressor

formula = Salary ~ Level,

data = dataset

)

与其他建模函数类似,rpart()函数使用formula参数就能创建一个简单的决策树。我们试着绘制出这个决策树。

#绘制决策树

plot(regressor)

> plot(regressor)

Error in plot.rpart(regressor) : fit is not a tree, just a root

发现出错了!!!发现我们的模型只生长出一个根节点。我们试着把这曲线绘制出来。

#可视化

ggplot()+

geom_point(aes(dataset$Level, dataset$Salary), color = "blue")+

geom_line(aes(dataset$Level, predict(regressor, dataset)), color = "red")第一个模型

很明显,我们的模型将所有的Level都归于一类,结果预测值为salary的均值。

#预测值

> predict(regressor, dataset) == mean(dataset$Salary)

[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

我们的模型需要修改。

#添加参数

regressor

formula = Salary ~ Level,

data = dataset,

control = rpart.control(minsplit = 1)

)

control参数用以控制算法的细节。minsplit:一个内部节点最少包含多少条观测值,默认值为20,由于我们的数据集才10条,所以会将所有观测归于一类。

#绘制决策树

plot(regressor, margin = 0.2)

text(regressor, use.n = T)

重新建模后,我们再绘制来看看。margin参数:防止因图形过大而被遮挡一部分图形。树状图

好了,我们的回归决策树将Salary分为四类,我们可以看出来,第一次Level的划分点为8.5,接下来两个划分点分别为6.5与9.5。

我们也可以直接打印出rpart对象,返回了文字形式的结果。

> #查看对象

> regressor

n= 10

node), split, n, deviance, yval

* denotes terminal node

1) root 10 806622500000 249500

2) Level< 8.5 8 55371880000 124375

4) Level< 6.5 6 8287500000 82500 *

5) Level>=6.5 2 5000000000 250000 *

3) Level>=8.5 2 125000000000 750000

6) Level< 9.5 1 0 500000 *

7) Level>=9.5 1 0 1000000 *

其中:*号标识叶结点。

接下来,我们使用这个模型来预测一下,看看预测结果与面试者的要求相差多远。

> #预测

> pred

> pred

1

250000

预测结果为250K,远高于面试者的要求,与我们使用SVR的结果相差较大。

我们来看看曲线。

x

y

ggplot()+

geom_point(aes(dataset$Level, dataset$Salary), color = "blue")+

geom_line(aes(x, y), color = "red")

从上图也可以看出来,我们将Level变量分为四类,预测值为每一类的均值。而我们的未知值(6.5),整好是划分点,同时将其归到了类[6.5,8.5)中,所以预测结果为观测点7、8的均值。

没错,从图中来看,预测结果偏差较大。是否可以通过剪枝来优化模型呢?rpart包提供了复杂度损失修剪的修剪方法,printcp()会告诉分裂到每一层,cp是多少,平均相对误差是多少,交叉验证的估计误差(“xerror”列),以及标准误差(“xstd”列),平均相对误差=xerror±xstd。

> cp

Regression tree:

rpart(formula = Salary ~ Level, data = dataset, control = rpart.control(minsplit = 1))

Variables actually used in tree construction:

[1] Level

Root node error: 8.0662e+11/10 = 8.0662e+10

n= 10

CP nsplit rel error xerror xstd

1 0.776386 0 1.000000 1.2346 0.78351

2 0.154967 1 0.223614 1.6956 0.79287

3 0.052174 2 0.068647 1.6956 0.79287

4 0.010000 3 0.016473 1.6956 0.79287

通过分析上面的各分裂层的确定cp值。这里我们取cp = 0.1。

#添加参数

regressor.prune

plot(regressor.prune, margin = 0.2)

text(regressor.prune, use.n = T)

pred

> pred

1

124375修枝后的树状图

可以看出来,我们把level<8.5下的观测都归于一类。而这时候,我们的预测结果变成了124K,与之前的结果少了接近一半,而且这时候结果与面试者的要求要少。两个模型得出了两种结果,看来现在的模型仍不够完善。我们可以通过调节control参数来进行优化,在这里就不尝试了。

我们建了两个模型,结果相差较远,那我们可不可以综合这两个模型,取其平均值当做预测结果呢?答案是肯定可以的,这就是我们接下要讲的随机森林算法,详细将在随机森林介绍。

总结

我们了解了什么是决策树,决策树如何构成,如何划分变量,简单介绍了什么是修枝。接着我们使用R语言建立了一个回归决策树模型,并将我们的模型可视化。通过修枝,我们建立了第二模型,并引出了随机森林。

参考:

《数据挖掘导论》第四章决策树(回归树)分析及应用建模_实践者_新浪博客​blog.sina.com.cnR语言 决策树和随机森林 回归分析​yq.aliyun.com

扫一扫,关注我的个人公众号:DataTurtle,获取源码,更有各种数据分析视频免费获取。

r语言svr模型_使用R语言建立一个决策树回归模型相关推荐

  1. csv数据,已区分训练集和验证集,需要用r语言建立随机森林回归模型,计算模型精度,包括训练集和验证集的r方、mae、rmse

    csv数据,已区分训练集和验证集,需要用r语言建立随机森林回归模型,计算模型精度,包括训练集和验证集的r方.mae.rmse #读取训练集 train <- read.csv("tra ...

  2. R语言使用lm函数拟合多元线性回归模型、假定预测变量之间有交互作用、R语言使用effects包的effect函数查看交互作用对于回归模型预测响应变量的影响

    R语言使用lm函数拟合多元线性回归模型.假定预测变量之间有交互作用.R语言使用effects包的effect函数查看交互作用对于回归模型预测响应变量的影响 目录

  3. 超效率dea模型_【探索】基于超效率DEA模型的我国公立医院排行榜研究

    点击标题下「蓝色微信名」可快速关注 文章来源: 中华医院管理杂志, 2020,36 (11):896-901 作者: 郭淑岩  李萌  杨威  杨婷婷  尹畅  胡广宇  董四平 DOI:10.376 ...

  4. Python实现决策树回归模型(DecisionTreeRegressor算法)并应用网格搜索算法调优项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 决策树除了能进行分类分析,还能进行回归分析,即预测连续变量,此时 ...

  5. 机器学习(五)—— 决策树回归模型和集合算法

    决策树回归模型和集合算法 1. 决策树概述 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率 --百度百科 决策树就是我们通常所 ...

  6. r语言 悲观剪枝_【R语言新书】前言Ⅲ—R语言编程思想

    张敬信:我的R语言新书信息汇总​zhuanlan.zhihu.com 0.3 R 语言编程思想 0.3.1 面向对象 R 是一种基于对象的编程语言,即在定义类的基础上,创建与操作对象:数值向量.函数. ...

  7. r语言员工离职_使用R机器学习进行员工离职预测系列(一)

    最近一直觉得,其实机器学习的门槛并不高,以R语言的角度,甚至稍微学过一点,就可以针对相关数据进行各种算法模型的建立和测试. 而真正有难度的地方一是算法优化部分,二是和对于模型评价的部分,这两个部分往往 ...

  8. r语言pls分析_基于R语言的PLS算法的实现解读.pptx

    基于R语言的PLS算法的实现及研究 目录 使用的开发工具 偏最小二乘的设计思想 基于R语言.MATLAB的偏最小二乘的实现 通径分析 测定系数 实验分析 使用的开发工具 R 语言(R是用于统计分析.绘 ...

  9. R语言epiDisplay包mlogit.display函数无序多分类logistic回归模型的汇总统计信息(各分组模型对应系数及标准差、相对危险降低率RRR值及其置信区间、AIC值等)、保存到csv

    R语言使用epiDisplay包的mlogit.display函数获取无序多分类logistic回归模型的汇总统计信息(各分组模型对应的系数及标准差.相对危险降低率RRR值及其置信区间.AIC值等). ...

最新文章

  1. Quick Sort 快速排序算法
  2. 密码学:RSA加密算法详解
  3. bccomp在php中什么意思,PHP bccomp()用法及代码示例
  4. 过虑数字类型后面的0
  5. mongo php update 写法,mongodb update 字符 操作
  6. 【BZOJ1013】球形空间产生器,第一次的高斯消元
  7. 华中科技大学计算机专业培养计划,2021年华中科技大学计算机科学与技术专业本科人才培养方案.doc...
  8. linux下使用wget下载jdk
  9. Toast-Android 专属浮动小提示
  10. [分享]屏幕取色工具
  11. linux系统安装snort,linux下SNORT安装.doc
  12. 面试题--------11、Mysql的三大范式详解
  13. 抖音网红怎么赚钱了?通过一百行代码批量下载抖音视频!找到窍门!
  14. 写给安徽合肥高三的你——少年不惧岁月长,敢挽桑弓射玉衡
  15. HHUOJ 1887 班级聚会上的游戏
  16. 快闪PPT,定义PPT的全新使用方式
  17. 《CSDN/TUP 系列活动:我们的开源》学习
  18. Discover the Web(找浏览器网页)
  19. gcc/g++ 如何支持c11 / c++11标准编译
  20. Android 将文字转换成图片并保存起来

热门文章

  1. 第六天啦,最近忙的不行,休息时间都很少了,不过收获蛮大的,继续加油秃头吧,小吴
  2. 洛谷1594 护卫队_区间dp_题解
  3. Android 分享图片到WhatsApp,Messenger,Facebook
  4. Java一行代码将yyyyMMdd转换为yyyy-MM-dd,yyyy-MM-dd转换为yyyyMMdd
  5. 计算机启动过程从电路,pc 启动过程 -- 加载MBR之前的过程,即加电到bios启动过程...
  6. 马云将卸任,“创办让中国人骄傲的全世界最好公司”他做到了!
  7. C#---- VS 打包成 exe.
  8. Yang Y-2021-1: Y6
  9. 零点起飞学C语言pdf
  10. c#大华摄像头调用,抓取图片