R语言神经网路模型应用(1)

news2024/12/30 2:26:06

数据集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

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

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

相关文章

PC电脑技巧[笔记本通过网线访问设备CMW500]

笔记本局域网访问设备 现在我有一台CMW500,我要用笔记本去访问它,但是我发现没有路由器就是不能够访问,通过网线连接设备就是ping不通: 这里设置TCP/IPv4的IP地址如下,这时候就可以pin通了:

跟张良均老师学大数据人工智能——数据挖掘集训营开营

集训营特色&#xff1a; 知识点深入浅出&#xff0c;实现以学促用 以业务内容为主线&#xff0c;数据挖掘技能嵌入 多行业项目实战&#xff0c;全面提升职业素养 全程线上辅导&#xff0c;助力熟练掌握技能 惊喜优惠&#xff1a; 限时“六折”&#xff01; 师傅带练 方向…

VsCode中安装codeium 显示failed to start language server

一、在VsCode的SSH Remote插件中安装Codeium 失败&#xff1a; 1、在插件Remote Explore中的SSH安装Codeium插件后提示无法下载语言服务器&#xff0c;如下图所示 2、去Codeium的仓库中找到对应版本的语言服务器包下载&#xff0c;然后解压并拷贝到远程服务器Ubuntu中的如下目…

云手机:实现便携与安全的双赢

随着5G时代的到来&#xff0c;云手机在各大游戏、直播和新媒体营销中扮演越来越重要的角色。它不仅节约了成本&#xff0c;提高了效率&#xff0c;而且在边缘计算和云技术逐渐成熟的背景下&#xff0c;展现出了更大的发展机遇。 云手机的便携性如何&#xff1f; 云手机的便携性…

【jenkins+cmake+svn管理c++项目】创建一个项目

工作台点击"新建item",进入下图&#xff0c;选择Freestyle project,并输入项目名称&#xff0c; 点击确定之后进入项目配置页面&#xff0c;填写描述&#xff0c;然后在下边源码管理部分选择svn, 填写代码的url 上图的Credentials处填写svn的有效登录名和密码&#x…

5.1 物联网RK3399项目开发实录-Android开发之ADB使用(wulianjishu666)

物联网项目开发实例&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11VQMhHfIL9mZhNlls4wmjw?pwd0gfa 1. ADB 使用 1.1. 前言 ADB&#xff0c;全称 Android Debug Bridge&#xff0c;是 Android 的命令行调试工具&#xff0c;可以完成多种功能&#xff0c;如跟踪系…

DP:简单多状态模型

创作不易&#xff0c;感谢三连 多状态DP表示第i天的时候可能的状态不同&#xff0c;所以我们要去区分不同的状态。 一、打家劫舍&#xff08;1&#xff09; . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int rob(vector<int>& nums) {int n…

C++初步认识

一.开发环境 Dev-C是一个Windows环境下的一个适合于初学者使用的轻量级C/C 集成开发环境&#xff08;IDE&#xff09;&#xff0c;它是一款自由软件&#xff0c;遵守GPL许可协议分发源代码。 Dev-C 使用MingW64/TDM-GCC编译器&#xff0c;遵循C 11标准&#xff0c;同时兼容C98标…

jmeter二次开发发送java请求_保姆级教程!!!

一、引言 JMeter是Apache基金会开发的一款开源性能测试工具&#xff0c;广泛应用于软件性能测试领域。它能够模拟多线程并发用户对应用程序进行压力测试&#xff0c;以评估应用程序的性能和稳定性。然而&#xff0c;在实际使用过程中&#xff0c;用户可能会遇到需要发送Java请…

网上国网App启动鸿蒙原生应用开发,鸿蒙开发前景怎么样?

从华为宣布全面启动鸿蒙生态原生应用一来&#xff0c;各种各样的新闻就没有停过&#xff0c;如&#xff1a;阿里、京东、小红书……等大厂的加入&#xff0c;而这次他们又与一个国企大厂进行合作&#xff1a; 作为特大型国有重点骨干企业&#xff0c;国家电网承担着保障安全、经…

Python 全栈体系【四阶】(二十一)

第五章 深度学习 二、推荐系统 2. 协同过滤及实现 2.1 基于物品的协同过滤推荐技术(评分) 2.2 基于物品的协同过滤算法(Item_CF) 2.3 基于用户的协同过滤算法&#xff08;user-based collaboratIve filtering&#xff09; 2.4 基本原理 2.5 ICF 计算物品之间的相似度&#…

Set和Map数据结构

Set和Map数据结构理解 Set&#xff1a; 1、es6新的数据结构&#xff0c;类似数组&#xff0c;但成员唯一 2、实例属性&#xff1a;Set.prototype.size返回Set实例的成员总数 3、操作方法&#xff1a;add、delete、has、clear 4、遍历操作&#xff1a;forEach、keys、values、en…

求两个单链表的差集

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 但行前路&#xff0c;不负韶华&#…

搭建Hadoop HA

目录 前言 搭建前准备 搭建 前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构&#xff0c;它允许用户在不了解分布式底层细节的情况下开发分布式程序&#xff0c;充分利用集群的威力进行高速运算和存储。Hadoop主要解决大数据存储和大数据分析两大核心问题&…

机器学习(二)

线性模型: 离散转为连续的变换: 检查是否有“序”的变化&#xff0c;若有“序”&#xff0c;则连续化&#xff1b;否则&#xff0c;转化为k维向量 最小二乘解: 多元线性回归: 广义线性模型: 线性判别分析: 由于将样例投影到一条直线(低维空间)&#xff0c;因此也被视为一种&q…

excel统计分析——协方差分析基本原理

参考资料&#xff1a;生物统计学 方差分析中&#xff0c;要求除试验因素外的其他条件保持在相同水平上才能对实验结果的差异显著性进行比较&#xff0c;然而有些非试验因素很难或不可能人为控制&#xff0c;此时如果使用方差分析法推断处理其差异显著性&#xff0c;往往会导致错…

深度学习-数据归一化与Batch Normalization

文章目录 数据归一化与Batch Normalization一、经典机器学习的归一化算法1.经典机器学习归一化方法回顾1.1 0-1标准化方法1.2 Z-Score标准化 2.经典机器学习归一化算法在深度学习中的实践3.Z-Score数据归一化的局限3.1 Zero-Centered特性消失3.2 Zero-Centered Data的作用局限 …

【AI】使用Azure OpenAI创建自己的AI应用!

【AI】使用Azure OpenAI创建自己的AI应用! 目录 【AI】使用Azure OpenAI创建自己的AI应用!创建工作区模型介绍部署模型API参数计算Token使用Python SDK调用补全模型调用对话模型流式调用异步调用提示技巧生成对话分类推荐超级课程: Docker快速入门到精通Kubernetes入门到大师…

Golang-MAP源码学习、扩容机制等

前言 map是golang中常用的一个基本数据结构&#xff0c;继上篇的channel源码学习之后&#xff0c;本文学习map的源码相关。 基础知识点 此部分参考自 https://www.zhihu.com/tardis/zm/art/423008350?source_id1003 map的用法 通过make初始化分配容量&#xff0c;通过m[k…

鸿蒙操作系统-初识

HarmonyOS-初识 简述安装配置hello world1.创建项目2.目录解释3.构建页面4.真机运行 应用程序包共享包HARHSP 快速修复包 官方文档请参考&#xff1a;HarmonyOS 简述 1.定义&#xff1a;HarmonyOS是分布式操作系统&#xff0c;它旨在为不同类型的智能设备提供统一的操作系统&a…