《Keras深度学习:入门、实战与进阶》之印第安人糖尿病诊断

news2024/12/25 9:22:31

本文摘自《Keras深度学习:入门、实战与进阶》。
在这里插入图片描述

1、数据理解

本节使用Pima Indians糖尿病发病情况数据集。该数据集最初来自国家糖尿病/消化/肾脏疾病研究所。数据集的目标是基于数据集中包含的某些诊断测量来诊断性的预测患者是否患有糖尿病。数据集由多个医学预测变量和一个目标变量Outcome。预测变量包括患者的怀孕次数、BMI、胰岛素水平、年龄等。数据集各变量描述如下:
 Pregnancies:怀孕次数。
 Glucose:葡萄糖。
 BloodPressure:血压(mm Hg)。
 SkinThickness:皮层厚度(mm)。
 Insulin:胰岛素 2小时血清胰岛素(mu U / ml )。
 BMI:体重指数(体重/身高)^2。
 DiabetesPedigreeFunction:糖尿病谱系功能 。
 Age:年龄(岁)。
 Outcome:类标变量(0或1,糖尿病为1或非糖尿病为0)。
将数据集导入到R中,并查看数据结构。

> pima <- read.csv('../data/pima-indians-diabetes.csv',header = FALSE)
> str(pima)
'data.frame':	768 obs. of  9 variables:
 $ V1: int  6 1 8 1 0 5 3 10 2 8 ...
 $ V2: int  148 85 183 89 137 116 78 115 197 125 ...
 $ V3: int  72 66 64 66 40 74 50 0 70 96 ...
 $ V4: int  35 29 0 23 35 0 32 0 45 0 ...
 $ V5: int  0 0 0 94 168 0 88 0 543 0 ...
 $ V6: num  33.6 26.6 23.3 28.1 43.1 25.6 31 35.3 30.5 0 ...
 $ V7: num  0.627 0.351 0.672 0.167 2.288 ...
 $ V8: int  50 31 32 21 33 30 26 29 53 54 ...
 $ V9: int  1 0 1 0 1 0 1 0 1 1 ...

数据集共有768行9列,由于所有变量都是数值的,因此可以直接作为神经网络的输入和输出使用。对数据集进行描述统计分析的结果所示。

> # 添加列名称
> column_names <- c('Pregnancies','Glucose','BloodPressure','SkinThickness',
+                  'Insulin','BMI','DiabetesPedigreeFunction','Age','Outcome')
> colnames(pima) <- column_names
> # 对数据进行描述统计分析
> library(skimr)
> skimmed <- skim(pima)
> skimmed

在这里插入图片描述
从上图可知,pima无数据缺失,前8个变量的尺度(数据范围)不一致,需要在建模前对输入变量进行标准化处理,输出变量Outcome中类别为1的占比为34.9%,属于相对平衡,在建模前不需要进行类失衡处理。
利用cor()函数计算Outcome与其他变量的相关系数,并对结果进行可视化,如下图所示。

> # 计算相关系数
> corr <- cor(pima[,-9],pima$Outcome)
> corr <- data.frame('X' = rownames(corr),
+                    'Outcome' = round(corr,3))
> # 对相关系数绘制柱状图
> library(ggplot2)
> ggplot(corr,aes(x=reorder(X,Outcome),y=Outcome,fill = I('tomato4'))) +
+   geom_bar(stat="identity") +
+   geom_text(aes(label=Outcome),vjust=1,color="white",size = 5,fontface = "bold")

在这里插入图片描述
Outcome(是否患糖尿病)与Glucose(葡糖糖)的相关性最高,相关系数为0.467;其次是BMI(体重指数),相关系数为0.293。

2、印第安人糖尿病数据预处理

在对数据进行标准化前,先将数据分为两部分,80%作为训练集,剩余的20%作为测试集。

> # 数据分区
> set.seed(1234)
> library(caret)
> index <- createDataPartition(pima$Outcome,p = 0.8,list = FALSE)
> train <- pima[index,] # 训练集
> test <- pima[-index,] # 测试集
> train_x <- as.matrix(train[,-9])    # 训练集的输入变量
> train_y <- as.matrix(train[,9])    # 训练集的输出变量
> test_x <- as.matrix(test[,-9])    # 测试集的输入变量
> test_y <- as.matrix(test[,9])    # 测试集的输出变量

从描述统计分析结果可知,输入变量中的各列数据范围差异比较大。在建模前,需先对数据集进行标准化处理。此案例使用scale()函数进行Z-Score标准化,处理后的训练集输入变量各列数据符合标准正态分布,即均值为0,标准差为1。

> # 对训练集的输入变量进行标准化处理
> train_x_scale <- scale(train_x)

接着使用从训练集标准化后得到的各列均值和标准差对测试集数据进行数据处理。

> col_means_train <- attr(train_x_scale, "scaled:center") 
> col_stddevs_train <- attr(train_x_scale, "scaled:scale")
> test_x_scale <- scale(test_x, 
+                  center = col_means_train, 
+                  scale = col_stddevs_train)

3、印第安人糖尿病诊断建模

在这个例子中,使用三层完全连接的网络结构,使用ReLU作为前两层的激活函数,使用sigmoid作为输出层的激活函数。第一个隐藏层有12个神经元,使用8个输入变量;第二个隐藏层由8个神经元,最后输出层有1个神经元来预测数据结果(是否患有糖尿病)。
在模型编译时,本例使用对数损失函数(二进制交叉熵)作为模型的损失函数,使用Adam作为优化器。由于这是一个分类问题,本例将采用分类准确度作为度量模型的标准。代码如下:

 library(keras) 
> # 构建模型函数
> build_model <- function() {
+   
+   model <- keras_model_sequential() %>%
+     layer_dense(units = 12, activation = "relu",
+                 input_shape = c(8)) %>%
+     layer_dense(units = 8, activation = "relu") %>%
+     layer_dense(units = 1,activation = 'sigmoid')
+   
+   model %>% compile(
+     loss = "binary_crossentropy",
+     optimizer = 'adam',
+     metrics = "accuracy")
+   model
+ }

在这个示例中,epochs参数为200,batch_size参数为10,且我们设置一个回调函数,如果经过20次训练周期后验证集的损失函数没有明显改善,将自动停止训练。

> # 设置回调函数的停止条件
> early_stop <- callback_early_stopping(monitor = "val_loss", 
+                                       patience = 20,
+                                       restore_best_weights = TRUE)
> # 训练模型
> mlp_model <- build_model()
> history <- mlp_model %>% fit(
+   train_x_scale,
+   train_y,
+   epochs = 150,
+   batch_size = 10,
+   validation_split = 0.2,
+   verbose = 2,
+   callbacks = early_stop
+ )
Train on 492 samples, validate on 123 samples
Epoch 1/150
492/492 - 3s - loss: 0.6586 - accuracy: 0.6199 - val_loss: 0.6220 - val_accuracy: 0.6098
……
Epoch 51/150
492/492 - 1s - loss: 0.4017 - accuracy: 0.8211 - val_loss: 0.4330 - val_accuracy: 0.8130

在这里插入图片描述
在经过51个训练周期后,模型停止了训练。因为回调函数参数restore_best_weights设置为TRUE, 则将会获得val_loss最小(epochs=31)的模型权重值。

> # 查看val_loss最小值的周期
> which.min(history$metrics$val_loss)
[1] 31
> # 查看val_loss最小值
> min(history$metrics$val_loss)
[1] 0.4188787

最后,利用训练好的模型对测试样本进行预测,并查看混淆矩阵。

> outcome.pred <- mlp_model %>% 
+   predict_classes(test_x_scale)
> (t <- table('actual' = test_y,
+         'forecast' = outcome.pred))
      forecast
actual  0  1
     0 84  7
     1 23 39

从混淆矩阵结果可知,在153个测试样本中,有7位非糖尿病患者被误预测为糖尿病患者,有23位糖尿病患者被误预测为非糖尿病患者。

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

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

相关文章

python+django大学生成绩综合考评系统pycharm项目

开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCharm 通常 一个Django model 对应一张数据表&#xff0c;model是以类的形式表现的 实现了ORM 对象…

Unity SRP自定义渲染管线学习2.2: 合批(Batching) SRP Batcher

接下来我们要来学习下自定义渲染管线中的合批&#xff0c;这一节主要学习SRP Batcher 每一次的Draw Call都需要CPU和GPU之间的通信&#xff0c;如果有大量的数据需要从CPU发送到GPU中&#xff0c;那GPU就可能因为等待数据而浪费时间&#xff0c;而CPU会因为忙于发送数据导致无…

第五章:Windows server加域

加入AD域&#xff1a;教学视频&#xff1a;https://www.bilibili.com/video/BV1xM4y1D7oL/?spm_id_from333.999.0.0首先我们选择一个干净的&#xff0c;也就是新建的没动过的Windows server虚拟机。我们将DNS改成域的ip地址&#xff0c;还要保证它们之间能ping的通&#xff0c…

详细解读ChatGPT:如何调用ChatGPT的API接口到官方例子的说明以及GitHub上的源码应用

文章目录1. 解读ChatGPT1.1 词语解释1.2 功能解读2. GitHub上ChatGPT的应用源码3. 调用ChatGPT的API4. 官方例子说明5. 集成ChatGPT自ChatGPT出来到如今&#xff0c;始终走在火热的道路上&#xff0c;如今日活用户破亿&#xff0c;他为何有如此大的魅力&#xff0c;深受广大用户…

opencv保存图片

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

SIGIR22:User-controllable Recommendation Against Filter Bubbles

User-controllable Recommendation Against Filter Bubbles 摘要 推荐系统经常面临过滤气泡的问题&#xff1a;过度推荐基于用户特征以及历史交互的同质化项目。过滤气泡将会随着反馈循环增长&#xff0c;缩小了用户兴趣。现有的工作通常通过纳入诸如多样性和公平性等准确性之…

AcWing、第 90 场周赛:4806. 首字母大写、4807. 找数字、4808. 构造字符串(C++)

目录 4806. 首字母大写 题目描述&#xff1a; 实现代码&#xff1a; 4807. 找数字 题目描述&#xff1a; 实现代码&#xff1a; 回溯&#xff08;超时&#xff09;&#xff1a; 原理思路&#xff1a; 贪心&#xff1a; 原理思路&#xff1a; 4808. 构造字符串 问题…

53. 最大子数组和

文章目录题目描述暴力法动态规划法分治法参考文献题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&…

JavaScript中数组常用的方法

文章目录前言常用数组方法1、 join( )2、push&#xff08;&#xff09;与 pop&#xff08;&#xff09;3、shift&#xff08;&#xff09;与 unshift&#xff08;&#xff09;4、sort&#xff08;&#xff09;5、reverse&#xff08;&#xff09;6、slice&#xff08;&#xff…

代码随想录算法训练营第二十七天 | 93.复原IP地址,78.子集,90.子集II

一、参考资料复原IP地址题目链接/文章讲解&#xff1a;https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1XP4y1U73i/子集题目链接/文章讲解&#xff1a;https://programmercarl.com/0078.…

乐观锁、雪花算法、MyBatis-Plus多数据源

乐观锁、雪花算法、MyBatis-Plus多数据源e>雪花算法2、乐观锁a>场景b>乐观锁与悲观锁c>模拟修改冲突d>乐观锁实现流程e>Mybatis-Plus实现乐观锁七、通用枚举a>数据库表添加字段sexb>创建通用枚举类型c>配置扫描通用枚举d>测试九、多数据源1、创建…

电子学会2022年12月青少年软件编程(图形化)等级考试试卷(二级)答案解析

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;二级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1. 一个骰子&#xff0c;从3个不同角度看过去的点数如图所示&#xff0c;请问5的对面是什么点数&#xff1f;&#xff08; &#xff09; …

数据库(单表查询)

素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 varchar(10) NOT NUL…

【C语言技能树】程序环境和预处理

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

一文掌握,单机Redis、哨兵和Redis Cluster的搭建,建议收藏

本篇文章讲述了 Redis 单机环境、主备、哨兵 Sentinel 模式以及 Redis Cluster 集群模式下的操作步骤&#xff0c;关于这些操作我们没必要死记硬背&#xff0c;只需要总结下来&#xff0c;下次使用直接拿出来就好。建议当作操作手册收藏。安装单实例 Redis编译Redis1.下载Redis…

小白都能学会的红帽(RedHat8)RHEL8系统安装实战

文章目录前言一. 实验环境二. 安装虚拟机三. 安装操作系统四. 系统安装成功后的操作总结前言 本文是应一位大佬的提议&#xff0c;建议我写写红帽系列&#xff0c;centos8已经不维护了&#xff0c;centos7 维护到2024年6月30日&#xff0c; 也就是明年的事情了&#xff0c;所以…

【Flutter入门到进阶】Dart基础篇---基于对比Java学习Dart

1 Dart语言特性 1.1 简介 1.1.1 说明 2011年10月&#xff0c;在丹麦召开的 GOTO 大会上&#xff0c;Google 发布了一种新的编程语言 Dart 。如同 Kotlin 和 Swift 的出现&#xff0c;分别是为了解决 Java 和 Objective-C 在编写应用程序的一些实际问题一样&#xff0c;Dart 的…

算法笔记(二)—— 认识N(logN)的排序算法

递归行为的时间复杂度估算 整个递归过程是一棵多叉树&#xff0c;递归过程相当于利用栈做了一次后序遍历。 对于master公式&#xff0c;T(N)表明母问题的规模为N&#xff0c;T(N/b)表明每次子问题的规模&#xff0c;a为调用次数&#xff0c;加号后面表明&#xff0c;除去调用之…

八股初始:RocketMQ

一、消息队列介绍 消息队列是什么 对于 MQ 来说&#xff0c;其实不管是 RocketMQ、Kafka 还是其他消息队列&#xff0c;它们的本质都是&#xff1a;一发一存一消费。 将 MQ 掰开了揉碎了来看&#xff0c;都是「一发一存一消费」&#xff0c;再直白点就是一个「转发器」。生产…

记一次上环境获取资源失败的案例

代码结构以及资源位置 测试代码 RestController RequestMapping("/json") public class JsonController {GetMapping("/user/1")public String queryUserInfo() throws Exception {// 如果使用全路径, 必须使用/开头String path JsonController.class.ge…