Python糖尿病数据分析:深度学习、逻辑回归、K近邻、决策树、随机森林、支持向量机及模型优化训练评估选择

news/2025/2/23 20:13:22/文章来源:https://www.cnblogs.com/tecdat/p/18732726

 全文链接:https://tecdat.cn/?p=39864

原文出处:拓端数据部落公众号

分析师:Weilong Zhang

本研究旨在利用机器学习和深度学习模型对糖尿病数据进行分析和预测。通过对糖尿病数据集的读取、预处理、特征分析,运用多种机器学习算法如逻辑回归、K近邻、决策树、随机森林、支持向量机以及前馈神经网络等进行模型训练和评估。比较不同模型在训练集和测试集上的准确率等指标,分析各模型的性能特点,最终为糖尿病的预测提供有效的模型选择和参考依据。

关键词

糖尿病预测;机器学习;深度学习;模型评估

一、引言

糖尿病作为一种常见的慢性疾病,对全球公共卫生造成了巨大的负担。准确地预测糖尿病的发生对于早期干预和治疗具有重要意义。机器学习和深度学习技术在医学数据的分析和预测方面展现出了强大的能力。本研究将运用多种机器学习和深度学习算法对糖尿病数据集进行处理和分析,构建能够准确预测糖尿病的模型。

二、数据获取与预处理

2.1 数据获取

从特定路径读取糖尿病数据集,该数据集包含了多个特征,如怀孕次数(Pregnancies)、血糖值(Glucose)、血压(BloodPressure)、皮肤厚度(SkinThickness)、胰岛素水平(Insulin)、身体质量指数(BMI)、糖尿病家族遗传函数(DiabetesPedigreeFunction)、年龄(Age)以及是否患有糖尿病的结果(Outcome)等信息。

 

2.2 数据检查

通过查看数据集的形状,可以得知数据集包含768条记录和9个特征。

df.shape

检查数据集中是否存在缺失值,结果显示该数据集中没有缺失值。

df.isnull().sum()

 

查看数据集的信息,了解各特征的数据类型,其中大部分特征为整数类型,BMI和DiabetesPedigreeFunction为浮点数类型。

df.info()

 

2.3 统计分析

对数据集进行描述性统计分析,获取各特征的统计量,如计数、均值、标准差、最小值、25%分位数、50%分位数、75%分位数和最大值等。

df.describe()

 

统计患有糖尿病和未患有糖尿病的患者数量,结果显示未患有糖尿病的患者有500人,患有糖尿病的患者有268人,占比分别为65%和35%。

对数据按是否患有糖尿病进行分组,计算各特征的均值。结果表明,糖尿病患者的所有特征均值普遍高于非糖尿病患者,特别是血糖和胰岛素水平,糖尿病患者的值明显更高。

绘制相关系数热图,分析各特征之间的相关性,发现所有特征之间存在中等程度的相关性。

三、数据准备

将数据集的特征和标签进行分离,特征数据存储在变量x中,标签数据存储在变量y中。

 
  1.  
    x = df.drop(columns='Outcome', axis = 1)
  2.  
    y = df['Outcome']
 

 

对特征数据进行标准化处理,使用StandardScaler将数据转换为均值为0,标准差为1的标准正态分布。

 
  1.  
    scalar = StandardScaler()
  2.  
    scalar.fit(x)
  3.  
     
 

 

将标准化后的数据划分为训练集和测试集,测试集占比为20%,并设置随机种子为2,以确保结果的可重复性。

四、机器学习模型训练与评估

4.1 逻辑回归模型

使用逻辑回归模型对训练数据进行训练,并对训练集和测试集进行预测。逻辑回归模型在训练集上的准确率为79%,在测试集上的准确率为76%。

 
  1.  
    lr = LogisticRegression()
  2.  
    lr = lr.fit(train_x, train_y)
 

 

4.2 K近邻模型

构建K近邻模型,设置邻居数量为50,对训练数据进行训练和预测。K近邻模型在训练集上的准确率为77%,在测试集上的准确率为73%。

 

4.3 决策树模型

通过循环找到最优的随机种子,以获得最佳的决策树模型。决策树模型在训练集上的准确率达到了100%,但在测试集上的准确率为73%,存在一定的过拟合现象。

 

4.4 随机森林模型

构建随机森林模型,设置树的数量为500,并使用最优随机种子。随机森林模型在训练集上的准确率为100%,在测试集上的准确率为73%。

 
  1.  
    rf = RandomForestClassifier(n_estimators=500, random_state = best_random_state)
  2.  
    rf.fit(train_x, train_y)
  3.  
    rf_train_pred = rf.predict(train_x)
  4.  
    rf_test_pred = rf.predict(test_x)
  5.  
    print("Random Forest Training Accuracy: ", round(accuracy_score(train_y, rf_train_pred), 2)*100)
  6.  
    print("Random Forest Testing Accuracy: ", round(accuracy_score(test_y, rf_test_pred), 2)*100)
 

 

4.5 支持向量机模型

使用支持向量机模型,核函数选择线性核。支持向量机模型在训练集上的准确率为78.66%,在测试集上的准确率为77.27%。

 
  1.  
    classifier = SVC(kernel = 'linear')
  2.  
    classifier.fit(train_x, train_y)
  3.  
    print("SVM Training Accuracy: ", round(classifier.score(train_x, train_y)*100, 2))
  4.  
    print("SVM Testing Accuracy: ", round(classifier.score(test_x, test_y)*100, 2))
 

 

五、深度学习模型(前馈神经网络)

5.1 数据预处理

将标签数据进行独热编码,同时对训练集和测试集的特征数据进行标准化处理。

5.2 模型构建与训练

构建一个简单的前馈神经网络模型,包含两个隐藏层,每层有64个神经元,激活函数使用ReLU,输出层使用softmax激活函数。编译模型时,使用adam优化器,损失函数为交叉熵损失函数,评估指标为准确率。

history = model.fit(train_X, train_y, epochs=50, batch_size=32, validation_data=(test_X, test_y))

 

在训练过程中,发现模型存在过拟合现象,即训练集上的准确率较高,但测试集上的准确率较低。为了解决过拟合问题,使用正则化、Dropout和EarlyStopping等技术。

 

5.3 模型评估

经过优化后的模型,在训练集上的准确率为80.46%,在测试集上的准确率为75.32%,过拟合现象得到了一定程度的缓解。

六、模型应用与结果可视化

将训练好的随机森林模型保存,以便后续使用。对新的输入数据进行预测,判断该患者是否患有糖尿病。

绘制各特征按是否患有糖尿病的分布直方图,直观地展示不同特征在糖尿病患者和非糖尿病患者中的分布情况。









绘制随机森林模型在测试集上的混淆矩阵,计算精确率、召回率和F1值等指标,进一步评估模型的性能。

cf_matrix = confusion_matrix(test_y, rf_test_pred)

 

七、结论与展望

7.1 结论

本研究通过对糖尿病数据集的分析和处理,运用多种机器学习和深度学习模型进行了糖尿病的预测。从各模型的训练和测试结果来看,不同模型在准确率等指标上表现出了一定的差异。
深度学习模型(简单前馈神经网络)在未进行优化时,存在较严重的过拟合问题,训练集准确率较高但测试集准确率较低。经过采用正则化、Dropout和EarlyStopping等技术进行优化后,模型在训练集上的准确率为80.46%,测试集上的准确率为75.32%,过拟合现象得到了一定程度的缓解,表明这些优化技术对于提高深度学习模型的泛化能力具有重要作用。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用MyBatis框架时Mapper传参是否需要使用@Param注解

在使用MyBatis作为Java项目的ORM框架时,在Mapper接口中传递参数需要通过@Param注解指定参数名称,这样才能在Mapper接口对应的xml文件中引用到对应名称的参数。如果不在Mapper接口中明确使用@Param注解时将会报错:找不到指定名称的参数。 追根溯源,这要从MyBatis获取Mapper接…

关于在阿里云服务器上搭建简单的keepalived主备服务器时出现的问题

问题:在进行keepalived主备服务器配置时,仅配置了RID,状态,通讯端口,VRID,优先级,通告报文发送时间,密码认证部分,VIP。在启动服务时,发现两台设备均跳转状态为MASTER。原因:出现这问题的场景是在阿里VPS云服务器网络环境中,因为路由交换层禁用了ARP的广播限制,造…

子串分值

‌输入和初始化‌: 读取字符串 str,并从索引 1 开始存储(C++ 中字符串索引从 0 开始,但这里为了简化计算,从 1 开始)。 n 存储字符串的长度。 数组 l[i] 存储字符 str[i] 上一次出现的位置。 数组 r[i] 存储字符 str[i] 下一次出现的位置。 数组 p 用于临时存储每个字符最…

【专题】2024年新能源汽车市场年度竞争报告汇总PDF洞察(附原数据表)

原文链接: https://tecdat.cn/?p=39740 在当下快速变革的时代,新能源汽车市场正处于关键的发展十字路口。过去几年间,市场经历了一系列深刻的结构性调整,从市场份额的重新分配到消费者行为模式的显著转变,每一个变化都蕴含着巨大的市场信号。深入分析这些变化背后的数据逻…

pikachu靶场搭建教程

详细介绍了pikachu靶场的搭建,并且附有安装包需要的东西phpStudy: 链接: https://pan.baidu.com/s/1fJ-5TNtdDZGUf5FhTm245g 提取码:0278 pikachu-master: Github链接:Github 链接 链接: https://pan.baidu.com/s/1lDdlxNaa3YjhIEj-WWB3qw 提取码:0278打开 phpstudy ,…

2.17周报

一、本周内容总结本周主要进行了蓝桥和天梯的训练,训练了3场蓝桥、2场天梯,剩余时间的就是赛后补题 补题的过程也重新理清了很多知识,包括gcd和lcm的应用,多项式除法的过程等等 对于蓝桥和天梯的赛制,还重新背了下很多算法的板子,包括求最短路的多种方法,不同范围求组合…

来点树链剖分

树链剖分树链剖分学习笔记 引入 给你一棵树,先单点加,再路径求和,你觉得很简单,用树上差分解决了这个问题。 再给你一棵树,先路径加,再单点查询,你觉得很简单,用树上差分解决了这个问题。 又给你一棵树,上述操作都有,而且顺序不分先后,你发现树上差分不能解决这个问…

《轻松上手:LangChain 的安装与验证全流程》

在当今快速发展的技术领域,掌握新工具是提升工作效率的关键。今天,我将为大家详细介绍如何轻松安装 LangChain,并验证其是否成功安装,让你迅速开启探索这一强大工具的旅程。 首先,在命令行中运行以下命令来安装 LangChain: pip install langchain安装完成后,为了确保一切…

双向广搜 P1032 洛谷 [NOIP 2002 提高组] 字串变换

双向广搜 P1032 洛谷 [NOIP 2002 提高组] 字串变换 题目背景 本题不保证存在靠谱的多项式复杂度的做法。测试数据非常的水,各种做法都可以通过,不代表算法正确。因此本题题目和数据仅供参考。 本题为搜索题,本题不接受 hack 数据。关于此类题目的详细内容 题目描述 已知有两…

uniapp uview u-form表单校验:表单有值却校验不通过的问题

<u-form-item label="数量" required prop="num"><u-input v-model="form.num"></u-input> </u-form-item>检查校验不通过的字段值类型是什么,如果是非string类型,要在rules上指定值类型。原因:u-form的校验规则是值…

BUS设计中的DeadLock死锁问题

本文讨论一下 BUS 设计中的 DeadLock 死锁问题,或者叫做 Cyclic Dependency 循环依赖问题。其含义是指 A 的动作导致 B 的动作无法进行下去,同样 B 的动作导致 A 的动作无法进行下去,二者相互依赖,形成死锁。 1 AXI握手死锁 在学习 AXI 协议时,手册中提到了 AXI 握手死锁,…

字符串-str

字符串-str 1.1 特点需要加上引号,单引号与双引号都可以,包含了多行内容的时候还可以用三引号name = rock #报错,没有引号识别为变量名, name = "rock" print(name) name = kyle print(name) name = """rock #多行内容时使用三引号,区分三引…