R语言基于树的方法:决策树,随机森林,Bagging,增强树

news2024/11/19 15:32:06

 概观

本文是有关  基于树的  回归和分类方法的。最近我们被客户要求撰写关于决策树的研究报告,包括一些图形和统计输出。

 视频:从决策树到随机森林:R语言信用卡违约分析信贷数据实例

从决策树到随机森林:R语言信用卡违约分析信贷数据实例

,时长10:11

树方法简单易懂,但对于解释却非常有用,但就预测准确性而言,它们通常无法与最佳监督学习方法竞争。因此,我们还介绍了Bagging(自助法),随机森林和增强树。这些示例中的每一个都涉及产生多个树,然后将其合并以产生单个共识预测。我们看到,合并大量的树可以大大提高预测准确性,但代价是损失解释能力。

决策树可以应用于回归和分类问题。我们将首先考虑回归。

决策树基础:回归

我们从一个简单的例子开始:

我们预测棒球运动员的  Salary 。

结果将是一系列分裂规则。第一个分支会将数据分割  Years < 4.5 为左侧的分支,其余的为右侧。如果我们对此模型进行编码,我们会发现关系最终变得稍微复杂一些。

library(tree)
library(ISLR)
attach(Hitters)
# 删除NA数据
Hitters<- na.omit(Hitters)
# log转换Salary使其更正态分布
hist(Hitters$Salary)

Hitters$Salary <- log(Hitters$Salary)
hist(Hitters$Salary)

summary(tree.fit)
## 
## Regression tree:
## tree(formula = Salary ~ Hits + Years, data = Hitters)
## Number of terminal nodes:  8 
## Residual mean deviance:  0.271 = 69.1 / 255 
## Distribution of residuals:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -2.2400 -0.2980 -0.0365  0.0000  0.3230  2.1500

现在,我们讨论通过对特征空间进行分层来构建预测树。通常,有两个步骤。

  1. 找到最能分隔因变量的变量/拆分,从而产生最低的RSS。

  2. 将数据分为两个在第一个标识的节点上的叶子。

  3. 在每片叶子中,找到分隔结果的最佳变量/分割。

目标是找到最小化RSS的区域数。但是,考虑将每个可能的分区划分为J个区域在计算上是不可行的  。为此,我们采取了  自上而下的贪婪  的方法。它是自顶向下的,因为我们从所有观测值都属于一个区域的点开始。贪婪是因为在树构建过程的每个步骤中,都会在该特定步骤中选择最佳拆分,而不是向前看会在将来的某个步骤中生成更好树的拆分。

一旦创建了所有区域,我们将使用每个区域中训练观察的平均值预测给定测试观察的因变量。

剪枝

尽管上面的模型可以对训练数据产生良好的预测,但是基本的树方法可能会过度拟合数据,从而导致测试性能不佳。这是因为生成的树往往过于复杂。具有较少拆分的较小树通常以较小的偏差为代价,从而导致方差较低,易于解释且测试错误较低。实现此目的的一种可能方法是仅在每次拆分导致的RSS减少量超过某个(高)阈值时,才构建一棵树。

因此,更好的策略是生成一棵树,然后  修剪  回去以获得更好的子树。

成本复杂度剪枝算法-也称为最弱链接修剪为我们提供了解决此问题的方法。而不是考虑每个可能的子树,我们考虑由非负调整参数索引的树序列  alpha


trees <- tree(Salary~., train)
plot(trees)
text(trees, pretty=0)


plot(cv.trees)

似乎第7棵树的偏差最小。然后我们可以剪枝树。但是,这并不能真正剪枝模型,因此我们可以选择较小的树来改善偏差状态。这大约是在第四个分支。

prune.trees <- prune.tree(trees, best=4)
plot(prune.trees)
text(prune.trees, pretty=0)

使用剪枝的树对测试集进行预测。

mean((yhat - test$Salary)^2)
## [1] 0.3531

分类树

分类树与回归树非常相似,不同之处在于分类树用于预测定性而不是定量。

为了增长分类树,我们使用相同的递归二进制拆分,但是现在RSS不能用作拆分标准。替代方法是使用  分类错误率。虽然很直观,但事实证明,此方法对于树木生长不够敏感。

实际上,另外两种方法是可取的,尽管它们在数值上非常相似:

Gini index_是K个  类之间总方差的度量  。

如果给定类别中的训练观测值的比例都接近零或一,则__cross-entropy_的值将接近零。

修剪树时,首选这两种方法,但如果以最终修剪模型的预测精度为目标,则规则分类错误率是优选的。

为了证明这一点,我们将使用  Heart 数据集。这些数据包含AHD 303名胸痛患者的二进制结果变量  。结果被编码为  Yes 或  No 存在心脏病。

dim(Heart)
[1] 303 15

到目前为止,这是一棵非常复杂的树。让我们确定是否可以通过使用分类评分方法的交叉验证来使用修剪后的版本改善拟合度。

cv.trees
## $size
## [1] 16  9  5  3  2  1
## 
## $dev
## [1] 44 45 42 41 41 81
## 
## $k
## [1] -Inf  0.0  1.0  2.5  5.0 37.0
## 
## $method
## [1] "misclass"
## 
## attr(,"class")
## [1] "prune"         "tree.sequence"

看起来4棵分裂树的偏差最小。让我们看看这棵树是什么样子。同样,我们使用  prune.misclass 分类设置。

prune.trees <- prune.misclass(trees, best=4)
plot(prune.trees)
text(prune.trees, pretty=0)

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Yes
##        No  72  24
##        Yes 10  45
##                                       
##                Accuracy : 0.775       
##                  95% CI : (0.7, 0.839)
##     No Information Rate : 0.543       
##     P-Value [Acc > NIR] : 2.86e-09    
##                                       
##                   Kappa : 0.539       
##  Mcnemar's Test P-Value : 0.0258      
##                                       
##             Sensitivity : 0.878       
##             Specificity : 0.652       
##          Pos Pred Value : 0.750       
##          Neg Pred Value : 0.818       
##              Prevalence : 0.543       
##          Detection Rate : 0.477       
##    Detection Prevalence : 0.636       
##       Balanced Accuracy : 0.765       
##                                       
##        'Positive' Class : No          
## 

在这里,我们获得了约76%的精度。

那么为什么要进行拆分呢?拆分导致节点纯度提高  ,这可能会在使用测试数据时有更好的预测。

树与线性模型

最好的模型始终取决于当前的问题。如果可以通过线性模型近似该关系,则线性回归将很可能占主导地位。相反,如果我们在特征和y之间具有复杂的,高度非线性的关系,则决策树可能会胜过传统方法。

优点/缺点

优点

  • 树比线性回归更容易解释。

  • 更能反映了人类的决策。

  • 易于以图形方式显示。

  • 可以处理没有伪变量的定性预测变量。

缺点

  • 树木通常不具有与传统方法相同的预测准确性,但是,诸如  Bagging,随机森林和增强等方法  可以提高性能。

其他例子

 

树结构中实际使用的变量:“价格”、“ CompPrice”、“年龄”、“收入”、“ ShelveLoc”、“广告”,终端节点数:19,残差平均偏差:0.414 = 92/222,错误分类错误率:0.0996 = 24/241

在这里,我们看到训练误差约为9%。我们  plot() 用来显示树结构和  text() 显示节点标签。

plot(sales.tree)
text(sales.tree, pretty=0)

让我们看看完整的树如何处理测试数据。

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction High Low
##       High   56  12
##       Low    23  68
##                                         
##                Accuracy : 0.78          
##                  95% CI : (0.707, 0.842)
##     No Information Rate : 0.503         
##     P-Value [Acc > NIR] : 6.28e-13      
##                                         
##                   Kappa : 0.559         
##  Mcnemar's Test P-Value : 0.091         
##                                         
##             Sensitivity : 0.709         
##             Specificity : 0.850         
##          Pos Pred Value : 0.824         
##          Neg Pred Value : 0.747         
##              Prevalence : 0.497         
##          Detection Rate : 0.352         
##    Detection Prevalence : 0.428         
##       Balanced Accuracy : 0.779         
##                                         
##        'Positive' Class : High          
## 

约74%的测试错误率相当不错,但是我们可以通过交叉验证来改善它。

在这里,我们看到最低的错误分类错误是模型4的。现在我们可以将树修剪为4模型。

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction High Low
##       High   52  20
##       Low    27  60
##                                         
##                Accuracy : 0.704         
##                  95% CI : (0.627, 0.774)
##     No Information Rate : 0.503         
##     P-Value [Acc > NIR] : 2.02e-07      
##                                         
##                   Kappa : 0.408         
##  Mcnemar's Test P-Value : 0.381         
##                                         
##             Sensitivity : 0.658         
##             Specificity : 0.750         
##          Pos Pred Value : 0.722         
##          Neg Pred Value : 0.690         
##              Prevalence : 0.497         
##          Detection Rate : 0.327         
##    Detection Prevalence : 0.453         
##       Balanced Accuracy : 0.704         
##                                         
##        'Positive' Class : High          
## 

这并不能真正改善我们的分类,但是我们大大简化了模型。

## CART 
## 
## 241 samples
##  10 predictors
##   2 classes: 'High', 'Low' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## 
## Summary of sample sizes: 217, 217, 216, 217, 217, 217, ... 
## 
## Resampling results across tuning parameters:
## 
##   cp    ROC  Sens  Spec  ROC SD  Sens SD  Spec SD
##   0.06  0.7  0.7   0.7   0.1     0.2      0.1    
##   0.1   0.6  0.7   0.6   0.2     0.2      0.2    
##   0.4   0.5  0.3   0.8   0.09    0.3      0.3    
## 
## ROC was used to select the optimal model using  the largest value.
## The final value used for the model was cp = 0.06.

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction High Low
##       High   56  21
##       Low    23  59
##                                         
##                Accuracy : 0.723         
##                  95% CI : (0.647, 0.791)
##     No Information Rate : 0.503         
##     P-Value [Acc > NIR] : 1.3e-08       
##                                         
##                   Kappa : 0.446         
##  Mcnemar's Test P-Value : 0.88          
##                                         
##             Sensitivity : 0.709         
##             Specificity : 0.738         
##          Pos Pred Value : 0.727         
##          Neg Pred Value : 0.720         
##              Prevalence : 0.497         
##          Detection Rate : 0.352         
##    Detection Prevalence : 0.484         
##       Balanced Accuracy : 0.723         
##                                         
##        'Positive' Class : High          
## 

选择了更简单的树,预测精度有所降低。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『微信小程序从0到1』视图与逻辑

&#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409; 请乘理想之马&#xff0c;挥鞭从此起程&#xff0c;路上春色正好&#xff0c;天上太阳正晴&#x1f43e;&#x1f43e;&#x1f43e;/font> &#x1f308;博客主页&#x1f449;白小…

【SQL】主从复制

主从复制主从复制的作用主从复制的原理一主一从架构主从配置文件1.主机配置2.从机配置3.主机建立账户并授权4.从机&#xff1a;配置需要复制的主机5.测试6.停止主从同步binlog_format三种格式双主双从架构如何提升数据库并发能力&#xff1a;在实际工作中&#xff0c;我们常常将…

B站运营,B站游戏数据如何分析?

B站聚集了大部分年轻人&#xff0c;用户量和黏性一直持续增长&#xff0c;在B站&#xff0c;游戏也是重点发展的一个分区&#xff0c;而对于运营者想做好游戏运营也并非易事&#xff0c;想做好运营掌握游戏数据必不可少&#xff0c;那么应该如何查看游戏数据呢&#xff1f; 一…

童年 高尔基

每周读一本经典&#xff0c;大概从2022年11月开始了&#xff0c;目前已经读了4本&#xff0c;csdn平台更适合技术分享&#xff0c;知乎比较适合书籍分享 《童年》是高尔基三部曲中的第一部。坐在柳东图书馆像海水浸过的沙子般座椅&#xff0c;周末的下午沉浸在高尔基先生奇特的…

线程池应用(四)

线程池应用线程池线程池应用多线程应用同步和异步1. 需要等待结果1. join 实现&#xff08;同步&#xff09;2. Future 实现&#xff08;同步&#xff09;3.CompletableFuture 实现&#xff08;异步&#xff09;4. BlockingQueue 实现&#xff08;异步&#xff09;2. 不需等待结…

5分钟搞定,实现 定时任务 的五种方案!

我们在实际开发中&#xff0c;多多少少都会用到定时任务来处理一些问题。 比如金融项目中的对账&#xff0c;每天定时对昨天的账务进行核对&#xff0c;每个月初对上个月的账务进行核对等。 还比如&#xff0c;我们需要处理一些老数据迁移&#xff0c;修复一些新项目和老项目…

基于java+springboot+mybatis+vue+mysql的财务管理系统

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

CI24R1/SI24R1 2.4G无线传输技术--无线门铃

无线门铃是一种基于2.4G无线传输技术的智能家居产品&#xff0c;主要用于亲朋好友探访的语音提醒功能。此次方案采用2.4G无线通信设计&#xff0c;室内和室外子母机组网&#xff0c;在智能家居及办公场所等方面得到广泛的应用。 一、应用场景 适用于居民社区、家庭、公寓、酒店…

2-2-3-5-5、Disruptor详解

目录简介juc包下的队列存在的问题设计方案RingBuffer数据结构数据存取方案常用等待策略写数据流程单线程&#xff08;一个生产者&#xff09;多线程&#xff08;多个生产者&#xff09;多个消费者读数据多个生产者写数据核心概念使用构造器引入依赖单生产者单消费者模式创建Eve…

微信公众号开发——接收用户消息(图文、语言、上报位置、关注、取消关注)及自动回复

&#x1f60a; 作者&#xff1a; 一恍过去&#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390&#x1f38a; 社区&#xff1a; Java技术栈交流&#x1f389; 主题&#xff1a; 微信公众号开发——接收用户消息(图文、语言、上报位置、关注、取消关注)及…

推动MRO工业品数字化基建升级,数商云采购系统赋能企业采购数字化管理

MRO工业品是工业生产中的重要组成部分&#xff0c;经历了十余年的发展成长&#xff0c;市场规模持续增长&#xff0c;然而据数据显示&#xff0c;MRO工业品市场的线上渗透率仍停留在个位数&#xff0c;这意味着MRO工业品数字化采购仍有巨大的发展空间。 MRO工业品行业发展受困…

非零基础自学Golang 第1章 走进Go 1.1 Go编程语言概述 1.1.1 Go 的历史

非零基础自学Golang 文章目录非零基础自学Golang第1章 走进Go1.1 Go编程语言概述1.1.1 Go 的历史第1章 走进Go 1.1 Go编程语言概述 Go语言也叫Golang&#xff0c;是由谷歌&#xff08;Google&#xff09;公司在2007年推出的一款静态编译型语言。Go语言高效、简洁、容易上手&a…

上海诺基亚贝尔-S-010W-AV2B卡刷固件包

上海诺基亚贝尔-S-010W-AV2B卡刷固件包 固件特点&#xff1a; 1、修改dns&#xff0c;三网通用&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、无开机广告&#xff0c;无系统更新&#xff0c;不在被强制升级&#xff1b; 4、大量精简内置的没用的…

最新版Crack:MailBee.NET 2022最后版

MailBee.NET Items Package 包括 SMTP、POP3、IMAP、EWS、Security、Antispam、Outlook Converter、Address Validator、PDF 部件&#xff0c;以及作为免费功能的 BounceMail、HTML、MIME、ICalVCard 部件。MailBee.NET Objects是一组功能强大且功能丰富的 .NET 元素&#xff0…

基于nodejs如何爬取csdn上自己的文章

当你想把自己在csdn上写的文章转为hexo上可以发布的文章或是将文章写入自己的数据库时,可以用到 将所有博客数据写入数据库 获取你的文章的分页接口: 在浏览自己的所有文章时,我们不难发现,文章的数据是往下滑动到底时,才会刷新出新的数据, 那么此时肯定是发送了一个请求来获…

一篇文章教你实战Docker容器数据卷

在上一篇中&#xff0c;咱们对Docker中的容器数据卷做了介绍。已经知道了容器数据卷是什么&#xff1f;能干什么用。那么本篇咱们就来实战容器数据卷&#xff0c;Docker容器数据卷案例主要做以下三个案例 1&#xff1a;宿主机(也就是Docker所安装的机器)与容器之间的映射-让Do…

LeetCode 538. 把二叉搜索树转换为累加树(C++)

标签&#xff1a;二叉树搜索 深度优先遍历 二叉树 思路一&#xff1a;递归实现反向中序遍历&#xff0c;并累加递归过程中的根的值 思路二&#xff1a;使用迭代&#xff0c;给每个根节点添加一个反向中序遍历的前驱节点。 原题链接&#xff1a;https://leetcode.cn/problems/co…

数据分析业务场景 | CTR预估

一.概况 定义 是推荐中最核心的算法之一 对每次广告的点击情况做出预测&#xff0c;预测用户是点击还是不点击 就是预测点击与否的而分类算法&#xff0c;成功的关键之一就是样本的准确性 对于正样本&#xff0c;一般可发挥的空间不是很大&#xff0c;最多就是卡一个停留时…

LinkedList源码解析

LinkedList源码解析 简介 LinkedList 是一个双向链表&#xff08;内部是 Node 节点&#xff09;实现的 List&#xff0c;并且还实现了 Deque 接口&#xff0c;它除了作为 List 使用&#xff0c;还可以作为队列或者栈来使用。 这样看来&#xff0c;LinkedList 简直就是个全能…

【文字版】津津有味:感染新冠后没食欲,那咱也得吃饭啊!

点击文末“阅读原文”即可收听本期节目剪辑、音频 / 朱峰 编辑 / 姝琦 SandLiu监制 / 姝琦 文案 / 粒粒 产品统筹 / bobo你阳了吗&#xff1f;你嗓子疼吗&#xff1f;你的食欲还好吗&#xff1f;没有什么比好好吃饭更重要&#xff0c;生病的时候尤其是。营养对健康而言是预防…