r语言svr模型_使用R语言建立一个决策树回归模型
决策树是一种简单但使用广泛的分类算法,根据目标变量的类型,决策树分为分类决策树(目标变量为因子型)与回归决策树(目标变量为连续数值型)。在这里,我们使用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语言建立一个决策树回归模型相关推荐
- csv数据,已区分训练集和验证集,需要用r语言建立随机森林回归模型,计算模型精度,包括训练集和验证集的r方、mae、rmse
csv数据,已区分训练集和验证集,需要用r语言建立随机森林回归模型,计算模型精度,包括训练集和验证集的r方.mae.rmse #读取训练集 train <- read.csv("tra ...
- R语言使用lm函数拟合多元线性回归模型、假定预测变量之间有交互作用、R语言使用effects包的effect函数查看交互作用对于回归模型预测响应变量的影响
R语言使用lm函数拟合多元线性回归模型.假定预测变量之间有交互作用.R语言使用effects包的effect函数查看交互作用对于回归模型预测响应变量的影响 目录
- 超效率dea模型_【探索】基于超效率DEA模型的我国公立医院排行榜研究
点击标题下「蓝色微信名」可快速关注 文章来源: 中华医院管理杂志, 2020,36 (11):896-901 作者: 郭淑岩 李萌 杨威 杨婷婷 尹畅 胡广宇 董四平 DOI:10.376 ...
- Python实现决策树回归模型(DecisionTreeRegressor算法)并应用网格搜索算法调优项目实战
说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 决策树除了能进行分类分析,还能进行回归分析,即预测连续变量,此时 ...
- 机器学习(五)—— 决策树回归模型和集合算法
决策树回归模型和集合算法 1. 决策树概述 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率 --百度百科 决策树就是我们通常所 ...
- r语言 悲观剪枝_【R语言新书】前言Ⅲ—R语言编程思想
张敬信:我的R语言新书信息汇总zhuanlan.zhihu.com 0.3 R 语言编程思想 0.3.1 面向对象 R 是一种基于对象的编程语言,即在定义类的基础上,创建与操作对象:数值向量.函数. ...
- r语言员工离职_使用R机器学习进行员工离职预测系列(一)
最近一直觉得,其实机器学习的门槛并不高,以R语言的角度,甚至稍微学过一点,就可以针对相关数据进行各种算法模型的建立和测试. 而真正有难度的地方一是算法优化部分,二是和对于模型评价的部分,这两个部分往往 ...
- r语言pls分析_基于R语言的PLS算法的实现解读.pptx
基于R语言的PLS算法的实现及研究 目录 使用的开发工具 偏最小二乘的设计思想 基于R语言.MATLAB的偏最小二乘的实现 通径分析 测定系数 实验分析 使用的开发工具 R 语言(R是用于统计分析.绘 ...
- R语言epiDisplay包mlogit.display函数无序多分类logistic回归模型的汇总统计信息(各分组模型对应系数及标准差、相对危险降低率RRR值及其置信区间、AIC值等)、保存到csv
R语言使用epiDisplay包的mlogit.display函数获取无序多分类logistic回归模型的汇总统计信息(各分组模型对应的系数及标准差.相对危险降低率RRR值及其置信区间.AIC值等). ...
最新文章
- Quick Sort 快速排序算法
- 密码学:RSA加密算法详解
- bccomp在php中什么意思,PHP bccomp()用法及代码示例
- 过虑数字类型后面的0
- mongo php update 写法,mongodb update 字符 操作
- 【BZOJ1013】球形空间产生器,第一次的高斯消元
- 华中科技大学计算机专业培养计划,2021年华中科技大学计算机科学与技术专业本科人才培养方案.doc...
- linux下使用wget下载jdk
- Toast-Android 专属浮动小提示
- [分享]屏幕取色工具
- linux系统安装snort,linux下SNORT安装.doc
- 面试题--------11、Mysql的三大范式详解
- 抖音网红怎么赚钱了?通过一百行代码批量下载抖音视频!找到窍门!
- 写给安徽合肥高三的你——少年不惧岁月长,敢挽桑弓射玉衡
- HHUOJ 1887 班级聚会上的游戏
- 快闪PPT,定义PPT的全新使用方式
- 《CSDN/TUP 系列活动:我们的开源》学习
- Discover the Web(找浏览器网页)
- gcc/g++ 如何支持c11 / c++11标准编译
- Android 将文字转换成图片并保存起来
热门文章
- 第六天啦,最近忙的不行,休息时间都很少了,不过收获蛮大的,继续加油秃头吧,小吴
- 洛谷1594 护卫队_区间dp_题解
- Android 分享图片到WhatsApp,Messenger,Facebook
- Java一行代码将yyyyMMdd转换为yyyy-MM-dd,yyyy-MM-dd转换为yyyyMMdd
- 计算机启动过程从电路,pc 启动过程 -- 加载MBR之前的过程,即加电到bios启动过程...
- 马云将卸任,“创办让中国人骄傲的全世界最好公司”他做到了!
- C#---- VS 打包成 exe.
- Yang Y-2021-1: Y6
- 零点起飞学C语言pdf
- c#大华摄像头调用,抓取图片