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

根据神经网络模型,本文模型设置3层神经网络隐藏层,每个隐藏层分别有2,4,6,8,10个隐藏单元数,使用两组模型,第一组是不使用权衰减,第二组是使用权衰减。文中分两大部分,一是对target2进行预测模型验证和对target进行预测和模型验证。因变量target2取值为0和1,target取值取值0,1,2,3,4。

二、对二元因变量target2进行预测和模型验证

1、数据导入与清理

导入分析包:

library(RSNNS)
library(dplyr)
library(sampling)
library(caret)

set.seed(123456)

导入heart_learning数据集,并将分类变量pain,ekg,slope,thal转换为因子变量

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数据集,并将分类变量pain,ekg,slope,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和heart_test的变量类型

str(heart_learning)
str(heart_test)

将数据集heart_learning按因变量target的取值排序后,再按取值分层抽样,抽样的结果保存在变量

train_sample中,每次抽取70%的数据。

heart_learning<-heart_learning[order(heart_learning$target),]
train_sample<-strata(heart_learning,stratanames = ('target'),size = round(0.7*table(heart_learning$target)),method = 'srswor')

将因子变量转换为哑变量,并拟合到heart_learning数据集中,并去掉多余变量。

dmy<-dummyVars(~pain+ekg+slope+thal,heart_learning,fullRank = TRUE)
heart_learning<-cbind(heart_learning,predict(dmy,heart_learning)) %>% select(-c(pain,ekg,slope,thal)) %>% select(-c(target,target2),everything())

head(heart_learning)

查看数据集heart_learning,加入到哑变量后模型去掉两个因变量target和target2后,共有18个自变量。

对自变量数据进行标准化

center<-apply(heart_learning[,1:18],2,mean)
scale<-apply(heart_learning[,1:18],2,sd)
heart_learning[,1:18]<-scale(heart_learning[,1:18],center=center,scale=scale)

取出抽样后的数据,并保存在变量heart_train中

heart_train<-heart_learning[train_sample$ID_unit,]

未抽取的数据保存在heart_valid,用以选出分类准确率最高的模型。

heart_valid<-heart_learning[-train_sample$ID_unit,]

2、模型训练,数据拟合,选出用于数据预测和验证的具体模型

设置初始数据框,将模型结果保存在该变量中,初始为250*5的数据框,每列的列名为

'size1','size2','size3','cdecay','accuclass',分别代表:第一隐藏层的单元数,第二隐藏层的单元数,第三隐藏层的单元数,前面三列分别取值为2,4,6,8,10,第四列cdecay为权衰减常数,取值为0或0.005,第五列accuclass为模型分类的准确率,而分类准确率由下面的表达式定义,(length(which(class1==heart_valid$target2)))/length(heart_valid$target2)。target2取两个值0和1,prob得到预测取值为1类型的概率,表达式class<-1*(prob>0.5)得到如果概率大于0.5即认为该类别的就是1类别。

mlp()用于建立多层感知器模型,分别用到了两组模型不用权衰减和使用权衰减,下面是主程序。

result.target2<-as.data.frame(matrix(0,nrow=5*5*5,ncol=5))
colnames(result.target2)<-c('size1','size2','size3','cdecay','accuclass')

index<-0

mlp_models<-list()
for(size1 in seq(2,10,2))
  for(size2 in seq(2,10,2))
    for(size3 in seq(2,10,2)){
      print(paste0('size1=',size1,'size2=',size2,'size3=',size3))
      mlp_model_nodecay<-mlp(heart_train[,1:18],heart_train$target2,
                 size=c(size1,size2,size3),
                 inputsTest = heart_valid[,1:18],
                 targetsTest = heart_valid$target2,
                 maxit = 300,
                 learnFuncParams = c(0.1))
    mlp_model_decay<-mlp(heart_train[,1:18],heart_train$target2,
                         size=c(size1,size2,size3),
                         inputsTest = heart_valid[,1:18],
                         targetsTest = heart_valid$target2,
                         maxit = 300,
                         learnFunc='BackpropWeightDecay',
                         learnFuncParams = c(0.1,0.005))
  
  prob1 <- mlp_model_nodecay$fittedTestValues
  class1<-1*(prob1>0.5)
  prob2 <- mlp_model_decay$fittedTestValues
  class2<-1*(prob2>0.5)
  mlp_models<-c(mlp_models,list(mlp_model_nodecay),list(mlp_model_decay))
  index<-index+1
  result.target2[index,1]<-size1
  result.target2[index,2]<-size2
  result.target2[index,3]<-size3
  result.target2[index,4]<-0
  result.target2[index,5]<-(length(which(class1==heart_valid$target2)))/length(heart_valid$target2)
  index<-index+1
  result.target2[index,1]<-size1
  result.target2[index,2]<-size2
  result.target2[index,3]<-size3
  result.target2[index,4]<-0.005
  result.target2[index,5]<-(length(which(class2==heart_valid$target2)))/length(heart_valid$target2)
}

上面函数分别用到了两组模型不用权衰减和使用权衰减,权衰减常数为0和0.005,index用于设置size1,size2,size3不同取值的编号,参数不同的取值代表不同的模型。函数运行将得到结果集result.target2。

head(result.target2)

运行得到:

head(result.target2)
  size1 size2 size3 cdecay accuclass
1     2     2     2  0.000 0.5483871
2     2     2     2  0.005 0.5483871
3     2     2     4  0.000 0.8064516
4     2     2     4  0.005 0.5483871
5     2     2     6  0.000 0.5483871
6     2     2     6  0.005 0.5483871

从上面得到的结果集result.target2第五列选取出分类准确率最高的模型对应的参数。

which.max(result.target2[,5])

[1] 57

分类准确率最高的参数为由第57行显示。

result.target2[which.max(result.target2[,5])]

运行将得到模型的参数为size1=4,size2=2,size3=4,不使用权衰减,分类准确率最高为0.8387.

result.target2[which.max(result.target2[,5]),]
   size1 size2 size3 cdecay accuclass
57     4     2     8      0 0.8387097

取出该参数对于的模型:因为列表结构和result.target2数据框的行是一一对应的。

mlp_model<-mlp_models[[which.max(result.target2[,5])]]

mlp_model

上图为该模型的细节。

3、将上面得到的准确率最高的感知器模型用于测试数据集的预测和验证。

将测试数据集heart_test进行上面步骤的数据清理和标准化

heart_test<-cbind(heart_test,predict(dmy,heart_test)) %>% select(-c(pain,ekg,slope,thal)) %>% 
  select(-c(target,target2),everything())

heart_test[,1:18]<-scale(heart_test[,1:18],center=center,scale=scale)

将上面得到的最佳模型mlp_model进行测试数据集的预测,预测的结果为响应概率

prob_test<-predict(mlp_model,heart_test[,1:18],type='response')

对概率预测的结果得到了分类预测的结果class.test,即为感知器模型得到最终预测结果。
class.test<-1*(prob_test>0.5)

查看模型结果预测值和真实的列联表
table(heart_test$target2,class.test)

运行得到:

三、对多值分类变量target进行预测和模型验证

因为因变量target是分类多值因变量,在模型训练之前需要对因变量进行转换,

y_train<-decodeClassLabels(heart_train$target)
y_valid<-decodeClassLabels(heart_valid$target)

另外需要注意的是预测类别在多值分类变量的情况下应为:

class.test<-apply(prob.test,1,which.max)-1在二值因变量情况下为class.test<-1*(prob_test>0.5),

其他预测这两种因变量的步骤和程序相似,不再这里详细讲述。

下面是程序:

index<-0
y_train<-decodeClassLabels(heart_train$target)
y_valid<-decodeClassLabels(heart_valid$target)
result.target<-as.data.frame(matrix(0,nrow=5*5*5,ncol=5))
colnames(result.target)<-c('size1','size2','size3','cdecay','accuclass')
mlp.models<-list()
for(size1 in seq(2,10,2))
  for(size2 in seq(2,10,2))
    for(size3 in seq(2,10,2)){
  print(paste0('size1=',size1,'size2=',size2,'size3=',size3))
  mlp.model.nodecay<-mlp(heart_train[,1:18],y_train,
                 size=c(size1,size2,size3),
                 inputsTest = heart_valid[,1:18],
                 targetsTest = y_valid,
                 maxit = 300,
                 learnFuncParams = c(0.1))
  mlp.model.decay<-mlp(heart_train[,1:18],y_train,
                 size=c(size1,size2,size3),
                 inputsTest = heart_valid[,1:18],
                 targetsTest = y_valid,
                 maxit = 300,
                 learnFunc='BackpropWeightDecay',
                 learnFuncParams = c(0.1,0.005))
  prob3<-mlp.model.nodecay$fittedTestValues
  class3<-apply(prob3,1,which.max)-1
  prob4<-mlp.model.nodecay$fittedTestValues
  class4<-apply(prob4,1,which.max)-1
  mlp.models<-c(mlp.models,list(mlp.model.nodecay),list(mlp.model.decay))
  index<-index+1
  result.target[index,1]<-size1
  result.target[index,2]<-size2
  result.target[index,3]<-size3
  result.target[index,4]<-0
  result.target[index,5]<-(length(which(class3 == heart_valid$target)))/length(heart_valid$target)
  index<-index+1
  result.target[index,1]<-size1
  result.target[index,2]<-size2
  result.target[index,3]<-size3
  result.target[index,4]<-0.005
  result.target[index,5]<-(length(which(class4 == heart_valid$target)))/length(heart_valid$target)
}
mlp.model<-mlp.models[[which.max(result.target[,5])]]
prob.test <- predict(mlp.model,heart_test[,1:18],type='response')
class.test<-apply(prob.test,1,which.max)-1
table(heart_test$target,class.tset)

运行将得到:预测概率prob.test,预测分类结果class.test,真实值和预测值的列联表。

table(heart_test$target,class.tset)

运行得到:模型的预测值与真实值的列联表

table(heart_test$target,class.test)
   class.test
     0  1  3
  0 42  6  0
  1 11  4  2
  2  5  4  2
  3  2  5  4
  4  2  1  1

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

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

相关文章

javaWeb私人牙科诊所管理系统

一、摘要 随着科技的飞速发展&#xff0c;计算机已经广泛的应用于各个领域之中。在医学领域中&#xff0c;计算机主要应用于两个方面&#xff1a;一是医疗设备智能化&#xff0c;以硬件为主。另一种是病例信息管理系统&#xff08;HIS&#xff09;以软件建设为主&#xff0c;以…

MySQL 高级语句(一)

一、MySQL查询 1.1 排序 ASC 是按照升序进行排序的&#xff0c;是默认的排序方式&#xff0c;即可以省略&#xff1b; SELECT语句中如果没有指定具体的排序方式&#xff0c;则默认按ASC方式进行排序。 DESC是按降序方式进行排列。当然ORDER BY前面也可以使用 WHFRE 子句对查…

23.异步模式-生产者、消费者

1.与保护性暂停GuardedObject不同&#xff0c;不需要产生结果与消费结果的线程一一对应。 2.消费队列可以用来平衡生产和消费的线程资源。 3.生产者负责产生结果数据&#xff0c;不关心数据该如何处理&#xff0c;而消费者专心处理结果数据。 4.消息队列是有容量限制的&…

风险评估在网络安全领域的应用与实践

一、引言 在数字化浪潮席卷全球的今天&#xff0c;网络安全已成为企业运营和发展的核心问题。随着信息技术的快速发展&#xff0c;企业面临着日益复杂的网络安全威胁&#xff0c;如黑客攻击、数据泄露、恶意软件等。这些威胁不仅可能导致企业重要信息的丢失或泄露&#xff0c;…

2024 年 5 款适用于 Linux 的参考文献管理软件

时间是宝贵的&#xff0c;因此如果某款软件能让您摆脱必须执行的日常繁琐任务&#xff0c;那么它就会派上用场。 参考文献管理工具就是此类软件的典型代表&#xff0c;只需点击几下就能自动格式化引文。学生、教育工作者、作家、科学家和研究人员一定会发现它们非常有用。 在…

各城市宗族文化姓氏占比数据

各城市宗族文化姓氏占比数据 1、指标&#xff1a;省份代码、所属省份、城市代码、所属城市、第1大姓氏、第2大姓氏、第3大姓氏、宗族文化强度 2、方法说明&#xff1a; 根据2005年全国1%的人口调查数据计算。其中第1大姓氏第一大姓人口数/总人口数&#xff0c;宗族文化强度(…

华院计算荣获CSDN“创新企业”和“年度创新产品与解决方案”大奖

日前&#xff0c;全国最大的专业开发者社区CSDN发布“2023中国开发者影响力年度榜单”&#xff0c;华院计算凭借其卓越的认知智能引擎平台荣获“创新企业”和“年度创新产品与解决方案”两项大奖。 CSDN 以数据为基础&#xff0c;经过个人或企业提交资料、层层筛选、深入调研、…

详解:写作和赚钱的 4 个关系!看完你一定会忍不住想开始写!

飞书文档的加密很强&#xff0c;也没有和自家的豆包大模型融合&#xff0c;所以只能通过其他方式获取文档的内容。 &#xff08;1&#xff09;将飞书文档转换为PDF&#xff0c;要用到浏览器插件&#xff1a; GoFullPage - Full Page Screen Capture - Microsoft Edge Addons …

C#代码混淆器 ipaguard 的优势与使用

摘要 本文探讨了iOS开发的优势、费用以及软件开发方面的相关内容。通过分析iOS开发所采用的编程语言、开发环境、用户界面设计、应用审核流程以及应用领域等方面&#xff0c;展示了iOS开发的诸多优势和特点。虽然iOS开发具有高用户体验、统一的硬件和软件环境、良好的市场份额…

Java基础-网络编程

文章目录 1.网络相关概念1.网络通信2.网络3.IP地址4.域名和端口域名端口号 5.网络协议6.TCP和UDPTCP协议**UDP协议**TCP VS UDP 2.网络编程1.InetAddress1.基本介绍2.代码实例 2.Socket1.基本介绍 3.Tcp字节流编程1.客户端与服务器端的信息传输案例一代码实例案例二代码实例案例…

【前端面试3+1】02插槽、箭头函数与普通函数、重绘重排、【回文数】

一、对插槽的理解 1.定义及作用&#xff1a; 插槽是一种用于在组件中插入内容的特殊语法。它的作用是让父组件可以向子组件传递内容&#xff0c;从而实现组件的灵活性和复用性。 2.分类&#xff1a; 插槽可以分为具名插槽和作用域插槽。 2.1具名插槽&#xff1a; 具名插槽允许父…

RuoYi-Vue-Plus(sa-token)

一、介绍 官网&#xff1a; Sa-Tokenhttps://sa-token.cc/index.html 特性&#xff1a; 登录与权限认证&#xff1a;支持用户登录和细粒度权限认证。会话管理&#xff1a;提供会话创建、维护和销毁功能。单点登录&#xff1a;支持单点登录&#xff0c;简化多应用登录流程。OAu…

基于el-table实现行内增删改

实现效果&#xff1a; 核心代码&#xff1a; <el-table :data"items"style"width: 100%;margin-top: 16px"border:key"randomKey"><el-table-column label"计划名称"property"name"><template slot-scope&q…

雪里温柔,水边明秀,不及Java 抽象类 和 Object类

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

Linux环境基础开发工具使用——yum and vim

本篇将会介绍平时在Linux中开发常用到的一些工具&#xff0c;其中包括&#xff1a;软件包管理器 — yum&#xff0c;Liunx中的开发工具。具体的介绍了 yum 的相关操作以及 yum 源&#xff0c;同时还介绍了 windows与虚拟机如何进行的关联。然后对Liunx中的开发工具进行了详细的…

集合(下)Map集合的使用

文章目录 前言一、Map接口二、Map接口的实现类 1.HashMap类2.TreeMap类总结 前言 Map集合没有继承Collection接口&#xff0c;不能像List集合和Set集合那样直接使用Collection接口的方法。Map集合其自身通过以key到value的映射关系实现的集合&#xff0c;也有相应的许多方法。类…

超详细SpringMVC源码剖析

整体流程图 1.自定义视图(63~66) 视图解析过程 1.先到DispatcherServlet中央控制器, 根据视图解析的 优先级 执行对应的 视图解析器 Nullable protected View resolveViewName(String viewName, Nullable Map<String, Object> model,Locale locale, HttpServletReque…

【C语言】【Leetcode】70. 爬楼梯

文章目录 题目思路&#xff1a;简单递归 > 动态规划 题目 链接: link 思路&#xff1a;简单递归 > 动态规划 这题类似于斐波那契数列的算法&#xff0c;结果其实就是到达前一步和到达前两步的方法之和&#xff0c;一直递归到n1和n2时就行了&#xff0c;但是这种算法有个…

Fiddler抓包工具之fiddler的常用快捷键

一、常用三个快捷键 ctrlX :清空所有记录 CtrlF&#xff1a;查找 F12&#xff1a;启动或者停止抓包 使用 QuickExec Fiddler2 成了网页调试必备的工具&#xff0c;抓包看数据。Fiddler2自带命令行控制。 fiddler 命令行快捷键&#xff1a;ctrl q &#xff0c;然后 输入 help…

linux C:变量、运算符

linux C 文章目录 变量运算符 一、变量 [存储类型] 数据类型 标识符 值 标识符&#xff1a;由数字、字母、下划线组成的序列&#xff0c;不能以数字开头。 数据类型&#xff1a;基本数据类型构造类型 存储类型&#xff1a;auto static…