回归树过程:

例:有10名学生,他们的身高分布如下:
R1:
女生(7):156,167,165,163,160,170,160
R2:
男生(3):172,180,176
那么,落入R1的样本均值为163,落入R2的样本均值为176,那么对于新样本,如果是女生,树模型预测的身高是163,是男生,则为176.
那么如何划分出区域R1,R2(建造树模型)?
需要使用自上到下的贪婪算法—–递归二元分割,即从根节点逐步向下分隔,每次产生两个树枝(二元分割)
R中可以建造回归树的包:ctree,rpart,tree

> library(rpart)
> library(tree)
Error in library(tree) : 不存在叫‘tree’这个名字的程辑包
> install.packages("tree")
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.4/tree_1.0-37.zip'
Content type 'application/zip' length 122090 bytes (119 KB)
downloaded 119 KBpackage ‘tree’ successfully unpacked and MD5 sums checkedThe downloaded binary packages are inC:\Users\LLJiang\AppData\Local\Temp\RtmpmMgvpx\downloaded_packages
> library(tree)
Warning message:
程辑包‘tree’是用R版本3.4.3 来建造的
> dat=read.csv("https://raw.githubusercontent.com/happyrabbit/DataScientistR/master/Data/SegData.csv")
> dat=subset(dat,store_exp>0&online_exp>0)
> trainx=dat[,grep("Q",names(dat))]
> trainy=dat$store_exp+dat$online_exp
> set.seed(100)
> rpartTrue=train(trainx,trainy,method="rpart2",tuneLength=10,trControl=trainControl(method="cv"))
> plot(rpartTrue)
> 


如上图,树的最大深度大于2,RMSE就不再变化了,这里我们就用深度2来建立树

> rpartTrue=rpart(trainy~.,data=trainx,maxdepth=2)
> print(rpartTrue)
n= 999 node), split, n, deviance, yval
      * denotes terminal node1) root 999 15812720000  3479.113  2) Q3< 3.5 799  2373688000  1818.720  4) Q5< 1.5 250     3534392   705.193 *5) Q5>=1.5 549  1919009000  2325.791 *3) Q3>=3.5 200  2436211000 10112.380 *
> 

Q3,Q5被最终预测总花销
以下为对rpart生成的树绘制图形

> library(partykit)
载入需要的程辑包:grid
载入需要的程辑包:libcoin
载入需要的程辑包:mvtnorm
Warning messages:
1: 程辑包‘partykit’是用R版本3.4.3 来建造的
2: 程辑包‘libcoin’是用R版本3.4.3 来建造的
> rpartTrue2=as.party(rpartTrue)
> plot(rpartTrue2)
> 

决策树

其目标是把数据划分为更小,同质性更强的组
与回归树不同在于,因变量是分类变量而不是数值。
故预测并不是基于平均而是基于每个类别样本的频数。叶节点的预测值就是落入相应区域训练集样本中频数最高的类别。
其分裂准则不是RSS,而是熵或者Gini系数
当自变量是连续型时,确定最佳分裂点的划分过程很之间,然而当自变量是分类型时,有两种处理方式
1.不对分类变量进行变换,每个分类型自变量作为单独的个体输入到模型中。
2.分类型自变量先被重新编码为二元虚拟变量,这样讲类别信息分解成独立信息块。
如果某些类对结果又强预测性,第一种方法更合适。
下面我们用不同方法对服装消费者性别进行判定(分类模型)

> library(pROC)
Type 'citation("pROC")' for a citation.载入程辑包:‘pROC’The following objects are masked from ‘package:stats’:cov, smooth, varWarning message:
程辑包‘pROC’是用R版本3.4.3 来建造的
> dat=read.csv("https://raw.githubusercontent.com/happyrabbit/DataScientistR/master/Data/SegData.csv")
#将10个问卷调查变量当做自变量> trainx1=dat[,grep("Q",names(dat))]
#将类别也作为自变量
#用两种方法编码分类变量
#trainx1不对消费者类别进行变换> trainx1$segment=dat$segment#trainx2中消费者类别被转换成虚拟变量> dumMod=dummyVars(~.,data=trainx1,levelsOnly=F)
#用原变量名加上因子层级的名称作为新的名义变量名
> trainx2=predict(dumMod,trainx1)
#性别作为因变量
> trainy=dat$gender

不对分类变量进行编码,cp指复杂度参数,是树生长的停止准则,cp=0.01意味着相应分裂度量(熵,Gini)每一步分裂都需要比之前提高0.01,在交互校检结果中不满0.01提升的部分会被修剪掉

> set.seed(100)
> rpartTune1=caret::train(trainx1,trainy,method="rpart",tuneLength=30,metric="ROC",trControl=trainControl(method="cv",summaryFunction=twoClassSummary,classProbs=TRUE,savePredictions=TRUE))
> rpartTune1
CART 1000 samples11 predictor2 classes: 'Female', 'Male' No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 901, 899, 900, 900, 901, 900, ...
Resampling results across tuning parameters:cp           ROC        Sens       Spec     0.000000000  0.6936668  0.6516883  0.68838380.008350085  0.7026106  0.6118506  0.73545450.016700170  0.6851629  0.5324351  0.82045450.025050255  0.6802976  0.5107468  0.84984850.033400340  0.6802976  0.5107468  0.84984850.041750425  0.6802976  0.5107468  0.84984850.050100510  0.6802976  0.5107468  0.84984850.058450595  0.6802976  0.5107468  0.84984850.066800680  0.6802976  0.5107468  0.84984850.075150765  0.6802976  0.5107468  0.84984850.083500850  0.6802976  0.5107468  0.84984850.091850936  0.6802976  0.5107468  0.84984850.100201021  0.6802976  0.5107468  0.84984850.108551106  0.6802976  0.5107468  0.84984850.116901191  0.6802976  0.5107468  0.84984850.125251276  0.6802976  0.5107468  0.84984850.133601361  0.6802976  0.5107468  0.84984850.141951446  0.6802976  0.5107468  0.84984850.150301531  0.6802976  0.5107468  0.84984850.158651616  0.6802976  0.5107468  0.84984850.167001701  0.6802976  0.5107468  0.84984850.175351786  0.6802976  0.5107468  0.84984850.183701871  0.6802976  0.5107468  0.84984850.192051956  0.6802976  0.5107468  0.84984850.200402041  0.6802976  0.5107468  0.84984850.208752126  0.6802976  0.5107468  0.84984850.217102211  0.6802976  0.5107468  0.84984850.225452296  0.6802976  0.5107468  0.84984850.233802381  0.6340747  0.5936039  0.67454550.242152466  0.5556313  0.7872727  0.3239899ROC was used to select the optimal model using the largest value.
The final value used for the model was cp = 0.008350085.
> 

对将分类变量进行编码后的数据集进行训练

> rpartTune2=caret::train(trainx2,trainy,method="rpart",tuneLength=30,metric="ROC",trControl=trainControl(method="cv",summaryFunction=twoClassSummary,classProbs=TRUE,savePredictions=TRUE))
> rpartRoc=roc(response=rpartTune1$pred$obs,predictor=rpartTune1$pred$Female,levels=rev(levels(rpartTune$pred$obs)))
Error in levels(rpartTune$pred$obs) : object 'rpartTune' not found
> rpartRoc=roc(response=rpartTune1$pred$obs,predictor=rpartTune1$pred$Female,levels=rev(levels(rpartTune1$pred$obs)))
> rpartFactorRoc=roc(response=rpartTune2$pred$obs,predictor=rpartTune2$pred$Female,levels=rev(levels(rpartTune1$pred$obs)))
> plot(rpartRoc,type="s",print.thres=c(.5),print.thres.pch=3,print.thres.pattern="",print.thres.cex=1.2,col="red",legacy.axes=TRUE,print.thres.col="red")

> plot(rpartFactorRoc,type="s",add=TRUE,print.thres=c(.5),print.thres.pch=16,legacy.axes=TRUE,print.thres.pattern="",print.thres.cex=1.2)

> legend(.75,.2,c("Grouped Categories","Independent Categories"),lwd=c(1,1),col=c("black","red"),pch=c(16,3))
> 


由上图可以看出,对于使用CART构建的树,对消费者类别变量编码或者不编码并不影响对受访者性别做预测
下面我们通过partykit包对最终模型绘制图形。

> library(partykit)
> plot(as.party(rpartTune2$finalModel))
> 

单棵树很直观,容易解释,但它有两个缺点:
1.和很多回归模型相比精确度差
2.非常不稳定,数据微小的变化会导致模型结果很大的变化。

R语言笔记之树模型(回归树和决策树)相关推荐

  1. R语言使用caret包构建遗传算法树模型(Tree Models from Genetic Algorithms )构建回归模型、通过method参数指定算法名称

    R语言使用caret包构建遗传算法树模型(Tree Models from Genetic Algorithms  )构建回归模型.通过method参数指定算法名称.通过trainControl函数控 ...

  2. R语言caret包构建机器学习回归模型(regression model)、使用DALEX包进行模型解释分析、特征重要度、偏依赖分析等

    R语言caret包构建机器学习回归模型(regression model).使用DALEX包进行模型解释分析.特征重要度.偏依赖分析等 目录

  3. R语言广义加性模型(generalized additive models,GAMs):使用广义线性加性模型GAMs构建logistic回归

    R语言广义加性模型(generalized additive models,GAMs):使用广义线性加性模型GAMs构建logistic回归 目录

  4. R语言使用broom包将回归模型(线性回归、逻辑回归、比例风险回归)的结果整理成dataframe并导出到excel等文件中:基于mtcars和colon数据集

    R语言使用broom包将回归模型(线性回归.逻辑回归.比例风险回归)的结果整理成dataframe并导出到excel等文件中:基于mtcars和colon数据集 目录

  5. R语言无序多分类Logistic回归模型实战

    R语言无序多分类Logistic回归模型实战 目录 R语言无序多分类Logistic回归模型实战 #导入包 #加载数据数据编码

  6. R语言基于glmnet构建Logistic回归模型使用L1正则化并可视化系数及最佳lambda值

    R语言基于glmnet构建Logistic回归模型使用L1正则化并可视化系数及最佳lambda值 Glmnet主要用于拟合广义线性模型.筛选可以使loss达到最小的正则化参数lambda.该算法非常快 ...

  7. R语言使用lm函数构建回归模型、使用broom包的augmented函数将模型结果存入dataframe中、使用ggplot2可视化回归残差图(拟合值和残差值的关系图)

    R语言使用lm函数构建回归模型.使用broom包的augmented函数将模型结果存入dataframe中.使用ggplot2可视化回归残差图(拟合值和残差值的关系图) 目录

  8. R语言使用lm函数构建回归模型、使用MASS包的boxcox函数寻找最佳幂变换提高模型拟合度、可视化boxcox曲线并获取最佳lambda值

    R语言使用lm函数构建回归模型.使用MASS包的boxcox函数寻找最佳幂变换提高模型拟合度.可视化boxcox曲线并获取最佳lambda值 目录

  9. R语言笔记4_模型诊断(关于残差)

    R语言笔记4_模型诊断(关于残差)及模型补救(Box-Cox变换) 文章目录 R语言笔记4_模型诊断(关于残差)及模型补救(Box-Cox变换) 检验线性关系 检验方差齐性 检验残差正态性 检验离群值 ...

  10. R语言使用glm构建logistic回归模型,构建多个协变量和分组变量之间的关系模型进行倾向性评分计算、估计(Propensity score)、预测倾向性评分并可视化不同分组倾向性评分的分布

    R语言使用glm构建logistic回归模型,构建多个协变量和分组变量之间的关系模型进行倾向性评分计算.估计(Propensity score).预测倾向性评分并可视化不同分组倾向性评分的分布 目录

最新文章

  1. 数据结构与算法之美day 6: 如何实现LRU缓存淘汰算法?
  2. xp 设备管理器 android,XP设备管理器怎么打开?
  3. mysql内置的变量,MySQL服务器模式及相关内置变量
  4. es6 ie不兼容 函数_ES6:什么是块级作用域?
  5. Tableau Desktop认证:为什么要关心以及如何通过
  6. 常用的一些页面操作 js jsp check
  7. Mac更新之后使用终端提示:The default interactive shell is now zsh.
  8. 斐波那契数列前n项和 c++_蹲在马桶看算法(Day8—LeetCode之NO.509 斐波那契数列)...
  9. FTP文件传输协议之vsftpd服务
  10. BZOJ4025 : 二分图
  11. mysql shrink_MySQL Group Replication内存使用分析和优化-1
  12. visio业务流程图教学_Visio流程图入门
  13. 机器人领域 期刊与会议
  14. 软件工程毕业设计课题(80)微信小程序毕业设计PHP电影视频播放小程序系统设计与实现
  15. Lonza Cocoon 细胞治疗生产平台扩展细胞磁珠分选新功能
  16. Spring Boot Redis关闭
  17. (2021-08-09)空气质量指数计算例题练习(一)
  18. 机器学习三剑客之Matplotlab
  19. html 设置min height,CSS中min-height使用技巧
  20. Dreamweaver中如何调整同行图片的距离

热门文章

  1. 更新Windows\BIOS之后WiFi消失的解决方法
  2. MATLAB程序设计与应用刘卫国(第三版)课后实验答案——2
  3. 从今天开始喂马、劈柴,周游世界
  4. MATLAB关于偏相关系数,基于matlab的逐像元偏相关分析
  5. 调整计算机启动顺序,电脑双系统如何修改第一启动项???
  6. php翻牌游戏代码,HTML5翻牌对对碰游戏源码
  7. linux颜色吸取工具,Pick:Linux下功能强大的拾色器
  8. PHP生成一个不重复的会员号,php生成一个不重复的会员号
  9. Arcgis中如何实现线转面
  10. UE4消除后期对透明材质的影响