R语言决策树(1)

数据集heart_learning.csv与heart_test.csv是关于心脏病的数据集,heart_learning.csv是训练数据集,heart_test.csv是测试数据集。要求:target和target2为因变量,其他诸变量为自变量。用决策树模型对target和target2做预测,并与实际值比较来验证预测情况。变量说明:pain,ekg,slope,thal是分类变量,在做模型训练前需要对其进行转换为因子型变量。target是定类多值因变量,target2是二值变量,文中分别对其进行预测。

变量名称变量说明
age年龄
sex性别,取值1代表男性,0代表女性
pain 胸痛的类型,取值1,2,3,4,代表4种类型
bpress入院时的静息血压(单位:毫米汞柱)
chol血清胆固醇(单位:毫克/分升)
bsugar空腹血糖是否大于120毫克/公升,1代表是,0代表否
ekg静息心电图结果,取值0,1,2代表3中不同的结果
thalach达到的最大心率
exang是否有运动性心绞痛,1代表是0代表否
oldpeak运动引起的ST段压低
slope锻炼高峰期ST段的斜率,取值1代表上斜,2代表平坦,3代表下斜
ca荧光染色的大血管数目,取值为0,1,2,3
thal取值3代表正常,取值6代表固定缺陷,取值7代表可逆缺陷
target因变量,直径减少50%以上的大血管数目,取值0,1,2,3,4
target2因变量,取值1表示target大于0,取值0表示target等于0

二、对二元因变量target2进行预测

1、导入分析包和数据集,进行数据清理

library(rpart)  #rpart包实现分类树和回归树
install.packages('rpart.plot') 
library(rpart.plot)   #rpart.plot包含各种决策树和可视化函数
install.packages('rattle')
library(rattle)   #实现数据挖掘和图形交互式可视化函数
library(dplyr)  #数据处理包
library(ggplot2)
library(sampling)  #实现各种数据抽样,包含各种随机抽样函数

将数据集heart_learning和heart_test里面的分类变量转换为因子变量

heart_learning<-read.csv('F:/桌面/练习表格/heart_learning.csv',
                         colClasses=rep('numeric',15)) %>%
  mutate(pain=as.factor(pain)) %>% mutate(ekg=as.factor(ekg)) %>% 
  mutate(slope=as.factor(slope)) %>% mutate(thal=as.factor(thal))
heart_test<-read.csv('F:/桌面/练习表格/heart_test.csv',
                        colClasses=rep('numeric',15)) %>%
  mutate(pain=as.factor(pain)) %>% mutate(ekg=as.factor(ekg)) %>% 
  mutate(slope=as.factor(slope)) %>% mutate(thal=as.factor(thal))  

对数据集heart_learning进行分层随机抽样,以便选取出验证数据集最佳的模型参数

idtrain<-strata(heart_learning,stratanames = 'target2',
                size = round(0.7*table(heart_learning$target2)),
                method='srswor')$ID_unit
train<-heart_learning[idtrain,]
valid<-heart_learning[-idtrain,]

2、建立决策树模型,设置模型参数,查看决策树结果

二值因变量target2要转换为因子型变量

fit.tree<-rpart(as.factor(target2)~.,train[,-14],
                parms=list(split='gini'),
                control = rpart.control(minbucket = 5),
                minsplit=10,
                maxcompete=2,
                maxdepth=30,
                maxsurrogate=5,
                cp=0.0001) #CP是复杂度参数

查看决策树

attributes(fit.tree)

attributes(fit.tree)
$names
 [1] "frame"               "where"               "call"                "terms"               "cptable"            
 [6] "method"              "parms"               "control"             "functions"           "numresp"            
[11] "splits"              "csplit"              "variable.importance" "y"                   "ordered"            

$xlevels
$xlevels$pain
[1] "1" "2" "3" "4"

$xlevels$ekg
[1] "0" "1" "2"

$xlevels$slope
[1] "1" "2" "3"

$xlevels$thal
[1] "3" "6" "7"


$ylevels
[1] "0" "1"

$class
[1] "rpart"

显示决策树子树矩阵

print(fit.tree$cptable)

print(fit.tree$cptable)
          CP nsplit rel error    xerror       xstd
1 0.51515152      0 1.0000000 1.0000000 0.09059288
2 0.06060606      1 0.4848485 0.7121212 0.08525299
3 0.01000000      4 0.3030303 0.4393939 0.07291598

显示决策树的规则

print(fit.tree)

print(fit.tree)
n= 144 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

 1) root 144 66 0 (0.54166667 0.45833333)  
   2) thalach>=147.5 88 21 0 (0.76136364 0.23863636)  
     4) ca< 0.5 65  8 0 (0.87692308 0.12307692) *
     5) ca>=0.5 23 10 1 (0.43478261 0.56521739)  
      10) pain=1,3 13  4 0 (0.69230769 0.30769231) *
      11) pain=2,4 10  1 1 (0.10000000 0.90000000) *
   3) thalach< 147.5 56 11 1 (0.19642857 0.80357143)  
     6) oldpeak< 0.6 10  3 0 (0.70000000 0.30000000) *
     7) oldpeak>=0.6 46  4 1 (0.08695652 0.91304348) *

绘制决策树图

fancyRpartPlot(fit.tree,type=5,digits=3,main = '',sub='')


prp(fit.tree,box.palette = 'auto',roundint = FALSE)

3、使用验证数据集分类准确率对决策树进行修剪,选取合适的子树

初始化变量,赋初值

nsubtree<-length(fit.tree$cptable[,1])
results<-data.frame(cp=rep(0,nsubtree),accu=rep(0,nsubtree))

循环的思想是用建立的决策树fit.tree中子树矩阵每个子树对应的复杂度参数CP去修剪决策树,得到每个修剪后的子树,用这些修剪后的子树去验证分层随机抽样后的数据集valid,得到了预测概率和分类结果,与实际真值进行比对,得到了预测准确率,数据框results有两列,一列是每个子树的CP值,一个是验证准确率。

for(j in 1:nsubtree){
  results$cp[j]<-fit.tree$cptable[j,'CP']
  fit.subtree<-prune(fit.tree,results$cp[j])
  prob_valid<-predict(fit.subtree,valid[,-14],
                      type='prob')[,2]
  class_valid<-1*(prob_valid>0.5)
  results$accu[j]<-length(which(valid$target2==class_valid))/length(valid$target2)
}

从results数据框中的accu找出最准确的值对于的CP参数值。
bestcp<-results$cp[which.max(results$accu)]

用这个CP参数值进行修剪子树,得到了最佳修剪后子树
fit.valid.subtrees<-prune(fit.tree,bestcp)

4、用修剪后的最佳子树做预测

用这个最佳修改子树去预测测试数据集heart_test,得到了预测概率

prob.tree.valid<-predict(fit.valid.subtrees,heart_test[,-14],type='prob')[,2]

class.tree<-1*(prob.tree>0.5)

得到了分类预测结果
class.tree

得到了预测值和真实值的列联表
table(heart_test$target2,class.tree)

 class.tree
     0  1
  0 34 14
  1 10 33

5、每个自变量的影响程度分析

初始化向量importance.tree

importance.tree<-rep(0,13)
names(importance.tree)<-colnames(heart_learning)[1:13]
nvar<-length(fit.valid.subtrees$variable.importance)

通过循环把最佳决策子树中的向量fit.valid.subtrees$variable.importance赋值到向量importance.tree

for(i in 1:nvar)

{ importance.tree[which(names(importance.tree)==names(fit.valid.subtrees$variable.importance)[i])]<-fit.valid.subtrees$variable.importance[i]}

进行标准化
importance.tree<-importance.tree/sum(importance.tree)
imp<-data.frame(name=names(importance.tree),importance=importance.tree)

绘制各变量影响程度的柱形图
ggplot(imp,aes(reorder(name,importance),importance))+geom_col()+xlab('Variables')+
  ylab('relative importance')+coord_flip()+ggtitle('Importance of Variables')

6、查看最佳子树的可视化图形

fancyRpartPlot(fit.valid.subtrees,type=5,digits=3,main = '',sub='')
prp(fit.valid.subtrees,box.palette = 'auto',roundint = FALSE)

二、对二多值因变量target进行预测

target取值为0,1,2,3,4,程序和target2类似,也需要把分类变量转化为因子变量,需要注意的是预测概率和预测分类类别的取值和定义。

library(rpart)
library(rpart.plot)
library(rattle)
library(dplyr)
library(ggplot2)
library(sampling)
set.seed(12345)
heart_learning<-read.csv('F:/桌面/练习表格/heart_learning.csv',
                         colClasses=rep('numeric',15)) %>%
  mutate(pain=as.factor(pain)) %>% mutate(ekg=as.factor(ekg)) %>% 
  mutate(slope=as.factor(slope)) %>% mutate(thal=as.factor(thal))
heart_test<-read.csv('F:/桌面/练习表格/heart_test.csv',
                     colClasses=rep('numeric',15)) %>%
  mutate(pain=as.factor(pain)) %>% mutate(ekg=as.factor(ekg)) %>% 
  mutate(slope=as.factor(slope)) %>% mutate(thal=as.factor(thal))  
idtrain<-strata(heart_learning,stratanames = 'target2',
                size = round(0.7*table(heart_learning$target)),
                method='srswor')$ID_unit
train<-heart_learning[idtrain,]
valid<-heart_learning[-idtrain,]
fit.tree<-rpart(as.factor(target)~.,train[,-15],
                parms=list(split='gini'),
                control = rpart.control(
                  minbucket = 5,
                minsplit=10,
                maxcompete=2,
                maxdepth=30,
                maxsurrogate=5,
                cp=0.0001))
attributes(fit.tree)
print(fit.tree$cptable)
print(fit.tree)
plotcp(fit.tree)
fancyRpartPlot(fit.tree,type=5,digits=3,main = '',sub='')
prp(fit.tree,box.palette = 'auto',roundint = FALSE)
nsubtree<-length(fit.tree$cptable[,1])
results<-data.frame(cp=rep(0,nsubtree),accu=rep(0,nsubtree))
for(j in 1:nsubtree){
  results$cp[j]<-fit.tree$cptable[j,'CP']
  fit.subtree<-prune(fit.tree,results$cp[j])
  prob_valid<-predict(fit.subtree,valid[,-15],
                      type='prob')
  class_valid<-apply(prob_valid,1,which.max)-1
  results$accu[j]<-length(which(valid$target==class_valid))/length(valid$target)
}
bestcp<-results$cp[which.max(results$accu)]
fit.valid.subtrees<-prune(fit.tree,bestcp)

importance.tree<-rep(0,13)
names(importance.tree)<-colnames(heart_learning)[1:13]

nvar<-length(fit.valid.subtrees$variable.importance)
for(i in 1:nvar){
  importance.tree[which(names(importance.tree)==names(fit.valid.subtrees$variable.importance)[i])]<-fit.valid.subtrees$variable.importance[i]}
importance.tree<-importance.tree/sum(importance.tree)
imp<-data.frame(name=names(importance.tree),importance=importance.tree)
ggplot(imp,aes(reorder(name,importance),importance))+geom_col()+xlab('Variables')+
  ylab('relative importance')+coord_flip()+ggtitle('Importance of Variables')

prob.tree<-predict(fit.valid.subtrees,heart_test[,1:13],type = 'prob')
class.tree<-apply(prob.tree,1,which.max)-1
class.tree
table(heart_test$target,class.tree)

运行可以得到

真实值与预测值的列联表

table(heart_test$target,class.tree)
   class.tree
     0  1  2  3
  0 43  4  1  0
  1 10  4  1  2
  2  4  2  3  2
  3  3  4  3  1
  4  1  0  3  0

变量的重要程度柱形图

决策树的可视化图形等

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习—— PU-Learning算法

机器学习—— PU-Learning算法 本篇博客将介绍PU-Learning算法的基本概念、基本流程、基本方法&#xff0c;并简单探讨Two-step PU Learning算法和无偏PU Learning算法的具体流程。最后&#xff0c;将通过Python代码实现一个简单的PU-Learning示例&#xff0c;以便更好地理解这…

事务传播行为Propagation

目录 背景Propagation测试程序1测试程序2分析 背景 前段时间&#xff0c;某个项目在部署时&#xff0c;被公司的一个检测拦截了&#xff0c;提示报错如下&#xff1a; Your code exists Method or Class with Transactional annotation that not use Propagation.REQUIRED.有…

npm镜像源证书过期问题解决

title: npm镜像源证书过期 search: 2024-02-29 文章目录 Failed to check for updates 问题ERR_PNPM_NO_PKG_MANIFESTnpm缓存清除指令权限不足导致删除不了解决方案npm创建基础配资文件 Failed to check for updates 问题 错误描述如上 检查完 node,vue,npm 的版本后都没啥问…

使用hping3网络工具构造TCP/IP数据包和进行DDos攻击

1 概述 hping3是一个强大的命令行工具&#xff0c;用于生成、发送和解析TCP/IP协议的数据包。它是开源的网络安全工具&#xff0c;由Salvatore Sanfilippo开发&#xff0c;主要应用于网络审计、安全测试和故障排查等领域。hping3不仅可以作为普通的网络连通性检测工具&#xf…

壁纸小程序Vue3(首页布局)

1.创建一个公共目录common来存放css和images App.vue中引用 <style lang"scss"> /*每个页面公共css */ import common/style/common-style.scss; </style> 2.渲染轮播图 <template><view class"homeLayout"><vi…

苍穹外卖04 (新增内表的外键id获取,多表分页查询,多表批量删除,修改先查在改内表外键id用主表的,起售时包含了“停售”状态的外关联表)

1. 新增套餐 1 需求分析和设计 业务规则&#xff1a; 套餐名称唯一 套餐必须属于某个分类 套餐必须包含菜品 名称、分类、价格、图片为必填项 添加菜品窗口需要根据分类类型来展示菜品 新增的套餐默认为停售状态 2 代码实现 1 根据分类id查询菜品 DishControllerGetMa…

手机有线投屏到直播姬pc端教程

1 打开哔哩哔哩直播姬客户端并登录(按下图进行操作) 2 手机用usb数据线连接电脑(若跳出安装驱动的弹窗点击确定或允许),usb的连接方式为仅充电(手机差异要求为仅充电),不同品牌手机要求可能不一样,根据实际的来 3 在投屏过程中不要更改usb的连接方式(不然电脑会死机需要重启) …

SAP 学习笔记 - 系统移行业务 - Migration cockpit工具 - 移行Material(品目)

本章开始&#xff0c;来研究研究移行工具 Migration cockpit。 理论啥的先放一边&#xff0c;来先做一个简单的实例&#xff0c;以对 Migration cockpit 有个大概的印象。 这里就先做一个移行品目的例子。 1&#xff0c;LTMC 启动Migration cockpit工具 默认给我启动了 IE &a…

C++11入门手册第二节,学完直接上手Qt(共两节)

C++多线程 #include <thread>:C++多线程库 #include <mutex>:C++互斥量库 #include <future>:C++异步库 多线程介绍 线程的创建 void entry_1() { }以普通函数作为线程入口函数:void entry_2(int val) { }​std::thread my_thread_1(entry_1);std::thr…

【b站李炎恢】Vue.js Element UI 下 | 十天技能课堂 | 更新中... | 李炎恢

课程地址&#xff1a;【Vue.js Element UI | 十天技能课堂 | 更新中... | 李炎恢】 https://www.bilibili.com/video/BV1U54y127GB/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 备注&#xff1a;虽然标题声明还在更新中&#xff0c;但是看一些常用…

npm软件包管理器

npm软件包管理器 一.npm 使用步骤二.npm安装所有依赖三.npm全局软件包-nodemon pm 简介链接&#xff1a; 软件包管理器&#xff0c;用于下载和管理 Node.js 环境中的软件包 一.npm 使用步骤 1.初始化清单文件&#xff1a; npm init -y &#xff08;得到 package.json 文件&am…

Django DRF视图

文章目录 一、DRF类视图介绍APIViewGenericAPIView类ViewSet类ModelViewSet类重写方法 二、Request与ResponseRequestResponse 参考 一、DRF类视图介绍 在DRF框架中提供了众多的通用视图基类与扩展类&#xff0c;以简化视图的编写。 • View&#xff1a;Django默认的视图基类&…

RocketMQ(版本4.9.4)+RocketMQ_Dashbord环境搭建(生产者、消费者的前置环境搭建)

一、官方网站下载 RocketMQ源码包 https://rocketmq.apache.org/zh/docs/4.x/introduction/02quickstart 二、把rocketMQ上传到Linux环境下解压&#xff0c;编译&#xff0c;执行以下命令&#xff08;需要提前装jdk和maven并配置好环境变量&#xff09; unzip rocketmq-all-4…

计算机网络-从输入网址到访问网站的全过程

当我们在浏览器中输入一个网址并按下回车键时&#xff0c;会发生一系列复杂的过程&#xff0c;最终使我们能够看到网页的内容。以下是这个过程的详细步骤&#xff1a; 客户端&#xff1a;首先&#xff0c;用户在浏览器中键入网址&#xff0c;然后浏览器会根据这个网址生成一个H…

基于PHP的新闻管理系统(用户发布版)

有需要请加文章底部Q哦 可远程调试 基于PHP的新闻管理系统(用户发布版) 一 介绍 此新闻管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。本新闻管理系统采用用户发布新闻&#xff0c;管理员审核后展示模式。 技术栈&am…

区间预测 | Matlab实现带有置信区间的GRNN广义回归神经网络时间序列未来趋势预测

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 Matlab实现带有置信区间的GRNN广义回归神经网络时间序列未来趋势预测 带有置信区间的GRNN(广义回归神经网络)时间序列未来趋势预测结合了广义回归神经网络(GRNN)的预测能力和置信区间的统计度量,以提供对未来…

C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测效果一览基本介绍模型描述程序…

DevSecOps安全工具链介绍

目录 一、概述 二、安全工具链在平台中的定位 2.1 概述 2.2 分层定位 2.2.1 不同阶段的安全工具 2.2.2 安全工具金字塔 2.3 安全流水线集成概览 2.3.1 概述 2.3.2 标准流水线集成安全工具链概览图 三、安全工具链分类 3.1 概述 3.2 威胁建模类 3.2.1 威胁建模的概念…

SQL | SQL 3小时快速入门学习笔记

【【数据库】SQL 3小时快速入门 #数据库教程 #SQL教程 #MySQL教程 #database#Python连接数据库】 课程链接 一、SQL 1.资料库管理系统&#xff08;Database Management System&#xff0c;简称DBMS&#xff09; 是整理资料的软件。其主要功能包括数据的存储、检索、更新和删除…

Matlab中的脚本和函数

Matlab中的脚本和函数 文章目录 Matlab中的脚本和函数脚本创建脚本代码注释函数创建函数局部函数嵌套函数私有函数匿名函数补充知识函数句柄测试环境:Win11 + Matlab R2021a 脚本 ​ Matlab脚本是最简单的程序文件类型。它们可用于自动执行一系列 Matlab 命令,如命令行重复执…