机器学习/数据分析案例---糖尿病预测

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

前言

  • 这是一篇数据分析/机器学习很好的入门案例,对糖尿病的影响进行预测和分析
  • 通过随机森林预测,平均准确率和召回率都不错
  • 不足:没有对特性进行特征提取,算法没有运用多个

文章目录

  • 1、导入数据
  • 2、数据预处理
  • 3、数据分析
    • 相关性分析
  • 5、模型创建
    • 1、数据集划分
    • 2、模型的创建
    • 模型预测
  • 6、模型评估
  • 7、特征重要性展示
  • 8、总结

1、导入数据

python">import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt data = pd.read_excel('dia.xls')
data
卡号性别年龄高密度脂蛋白胆固醇低密度脂蛋白胆固醇极低密度脂蛋白胆固醇甘油三酯总胆固醇脉搏舒张压高血压史尿素氮尿酸肌酐体重检查结果是否糖尿病
0180544210381.252.991.070.645.31838304.99243.35010
1180544220311.151.990.840.503.98856304.72391.04710
2180544230271.292.210.690.604.19736105.87325.75110
3180544240330.932.010.660.843.60836002.40203.24020
4180544250361.172.830.830.734.83856704.09236.84300
...................................................
1001202611821861.583.811.111.676.50927308.60406.29311
1002202611920671.484.561.312.597.35768604.00262.55931
1003202612011671.302.900.841.615.041037504.70393.69831
1004202612130461.212.310.671.344.19788403.80219.25121
1005202612370361.122.801.153.595.0710211305.70462.46711

1006 rows × 16 columns

2、数据预处理

python"># 查看数据信息
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1006 entries, 0 to 1005
Data columns (total 16 columns):#   Column      Non-Null Count  Dtype  
---  ------      --------------  -----  0   卡号          1006 non-null   int64  1   性别          1006 non-null   int64  2   年龄          1006 non-null   int64  3   高密度脂蛋白胆固醇   1006 non-null   float644   低密度脂蛋白胆固醇   1006 non-null   float645   极低密度脂蛋白胆固醇  1006 non-null   float646   甘油三酯        1006 non-null   float647   总胆固醇        1006 non-null   float648   脉搏          1006 non-null   int64  9   舒张压         1006 non-null   int64  10  高血压史        1006 non-null   int64  11  尿素氮         1006 non-null   float6412  尿酸          1006 non-null   float6413  肌酐          1006 non-null   int64  14  体重检查结果      1006 non-null   int64  15  是否糖尿病       1006 non-null   int64  
dtypes: float64(7), int64(9)
memory usage: 125.9 KB
python"># 查看缺失值
data.isnull().sum()
卡号            0
性别            0
年龄            0
高密度脂蛋白胆固醇     0
低密度脂蛋白胆固醇     0
极低密度脂蛋白胆固醇    0
甘油三酯          0
总胆固醇          0
脉搏            0
舒张压           0
高血压史          0
尿素氮           0
尿酸            0
肌酐            0
体重检查结果        0
是否糖尿病         0
dtype: int64

绘制纸箱图

python"># 通过绘制箱型图,判断是否存在异常值
import seaborn as sns 
#设置字体
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]  # 显示中文
plt.rcParams['axes.unicode_minus'] = False		# 显示负号feature_name = {'性别': '性别','年龄': '年龄','高密度脂蛋白胆固醇': '高密度脂蛋白胆固醇','低密度脂蛋白胆固醇': '低密度脂蛋白胆固醇','极低密度脂蛋白胆固醇': '极低密度脂蛋白胆固醇','甘油三酯': '甘油三酯','总胆固醇': '总胆固醇','脉搏': '脉搏','舒张压': '舒张压','高血压史': '高血压史','尿素氮': '尿素氮','肌酐': '肌酐','体重检查结果': '体重检查结果','是否糖尿病': '是否糖尿病'
}plt.figure(figsize=(20, 20))for i, (col, col_name) in enumerate(feature_name.items(), 1):plt.subplot(4, 4, i)sns.boxplot(y=data[col])plt.title(f'{col_name}的纸箱图', fontsize=14)plt.ylabel('数值', fontsize=12)plt.grid(axis='y', linestyle='--', alpha=0.7)plt.tight_layout()
plt.show()

在这里插入图片描述

参考值(正常)

  • 高密度脂蛋白胆固醇:0.83-1.96 mmol/L
  • 总胆固醇(TC)或(CHOL)参考范围:3~5.2 mmol/L
  • 甘油三酯(TG) 参考范围:0~1.7 mmol/L
  • 低密度脂蛋白(LDL-C)参考范围:0~3.12 mmol/L

分析(查阅一点资料决定的)

  • 低密度脂蛋白胆固醇,高于8的去除
  • 极低密度脂蛋白胆固醇,高于8的去除
  • 甘油三酯,高于40去除
  • 总胆固醇,高于12的删除
  • 肌酐,800(>790)的删除
  • 尿素氮,>15删除

写代码运行发现
发现全部删去了,这里假设以上情况均属于偶然,均存在,因为生病情况受到影响因素很复杂

分析

  • 影响特征的大量数均分布在中位数附件,比较平均于对称

3、数据分析

python"># 统计分析
data.describe()
卡号性别年龄高密度脂蛋白胆固醇低密度脂蛋白胆固醇极低密度脂蛋白胆固醇甘油三酯总胆固醇脉搏舒张压高血压史尿素氮尿酸肌酐体重检查结果是否糖尿病
count1.006000e+031006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.000000
mean1.838279e+070.59841050.2882701.1522012.7074750.9983111.8967204.85762480.81908576.8866800.1739565.562684339.34542764.1063621.6093440.444334
std6.745088e+050.49046416.9214870.3134260.8480700.7158912.4214031.02997312.54227012.7631730.3792601.64634284.56984629.3384370.7723270.497139
min1.805442e+070.00000020.0000000.4200000.8400000.1400000.3500002.41000041.00000045.0000000.0000002.210000140.80000030.0000000.0000000.000000
25%1.807007e+070.00000037.2500000.9200002.1000000.6800000.8800004.20000072.00000067.0000000.0000004.450000280.85000051.2500001.0000000.000000
50%1.807036e+071.00000050.0000001.1200002.6800000.8500001.3350004.78500079.00000076.0000000.0000005.340000333.00000062.0000002.0000000.000000
75%1.809726e+071.00000060.0000001.3200003.2200001.0900002.0875005.38000088.00000085.0000000.0000006.367500394.00000072.0000002.0000001.000000
max2.026124e+071.00000093.0000002.5000007.98000011.26000045.84000012.610000135.000000119.0000001.00000018.640000679.000000799.0000003.0000001.000000

主要是老年人居多

相关性分析

注意:seaborn绘制热力图的时候,版本需要与matplotlib版本配对,matplotlib版本需要在3.8.0以下

python"># 相关性分析
import seaborn as sns data.drop(columns=['卡号'], inplace=True)plt.figure(figsize=(20, 15))   
sns.heatmap(data.corr(),annot=True)plt.show()


在这里插入图片描述

除了高密度脂蛋白胆固醇外,其他均成正相关

5、模型创建

1、数据集划分

python">from sklearn.model_selection import train_test_split
# 划分特征值和目标值
X = data.drop(['是否糖尿病', '高密度脂蛋白胆固醇'], axis=1)  # 高密度脂蛋白胆固醇: 与目标值负相关
y = data['是否糖尿病']X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

2、模型的创建

python">from sklearn.tree import DecisionTreeClassifier# 创建模型与训练
model = DecisionTreeClassifier()
model.fit(X_train, y_train)

模型预测

python">y_pred = model.predict(X_test)

6、模型评估

python">from sklearn.metrics import classification_reportreporter = classification_report(y_test, y_pred)
print(reporter)
              precision    recall  f1-score   support0       0.81      0.78      0.80       1201       0.70      0.73      0.71        82accuracy                           0.76       202macro avg       0.75      0.76      0.76       202
weighted avg       0.76      0.76      0.76       202

准确率、召回率、f1得分很高,模型效果极好

7、特征重要性展示

python">feature_importances = model.feature_importances_
features_rf = pd.DataFrame({'特征': X.columns, '重要度': feature_importances})
features_rf.sort_values(by='重要度', ascending=False, inplace=True)
plt.figure(figsize=(6, 5))
sns.barplot(x='重要度', y='特征', data=features_rf)
plt.xlabel('重要度')
plt.ylabel('特征')
plt.title('随机森林特征图')
plt.show()


在这里插入图片描述

8、总结

  1. 环境:seaborn绘制热力图的时候,版本需要与matplotlib版本配对,matplotlib版本需要在3.8.0以下
  2. 随机森林:可以决解多重共线性问题
  3. 进一步熟悉了数据分析的过程
  4. 不足:算法的扩展性、数据特征提取没有做

http://www.ppmy.cn/news/1518934.html

相关文章

Datawhale X 李宏毅苹果书 AI夏令营-深度学入门task2:线性模型

1.线性模型 把输入的特征 x 乘上一个权重&#xff0c;再加上一个偏置就得到预测的结果&#xff0c;这样的模型称为线性模型&#xff08;linear model&#xff09; 2.分段线性模型 线性模型也许过于简单&#xff0c;x1 跟 y 可能中间有比较复杂的关系。线性模型有很大的限制&…

Python-MNE-源空间和正模型07:修复BEM和头表面

有时在创建BEM模型时&#xff0c;由于可能出现的一系列问题(例如&#xff0c;表面之间的交叉)&#xff0c;表面需要手动校正。在这里&#xff0c;我们将看到如何通过将表面导出到3D建模程序blender&#xff0c;编辑它们&#xff0c;并重新导入它们来实现这一点。我们还将给出一…

网络安全售前入门05安全服务——渗透测试服务方案

目录 1.服务概述 2.测试内容 2.1网络层安全 ​​​​​​​2.2系统层安全 ​​​​​​​2.3应用层安全 3.测试范围 4.漏洞分级 5.渗透用例 6.测试风险 6.1风险说明 ​​​​​​​6.2风险规避 ​​​​​​​​​​​​​6.3数据备份 7.服务输出 1.服务概述 渗透…

从0到DevOps(1)-初步了解DevOps和容器

DevOps从提出以来陆续成为行业普遍实践&#xff0c;目前是数字化生产普遍不可或缺的信息底座。本系列文章旨在系统性的阐述与认识DevOps, 了解企业实践里DevOps的实际面貌。 什么是DevOps? DevOps 是一套实践、工具和文化理念&#xff0c;为实现用户不断的软件功能和可用性要…

使用Python写贪吃蛇游戏

贪吃蛇游戏是一款经典的小游戏&#xff0c;玩家通过控制蛇的移动来吃食物&#xff0c;蛇的身体会随着吃到的食物越来越多而变长。本文将介绍如何使用Python来创建一个简单的贪吃蛇游戏。 代码解析 1. 设置窗口 首先&#xff0c;我们需要设置游戏窗口。使用 turtle.Screen() 创…

streamlit+wordcloud使用pyinstaller打包遇到的一些坑

说明 相比常规的python程序打包&#xff0c;streamlit应用打包需要额外加一层壳&#xff0c;常规app.py应用运行直接使用 python app.py就可以运行程序了&#xff0c;但streamlit应用是需要通过streamlit命令来运行 streamlit app.py所以使用常规的pyinstaller app.py打包是…

(备份)常用ASCII 8*8 点阵 以及查询显示字符的点阵

图片 #include "driver/spi_master.h" #include "driver/gpio.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "string.h" #include "driver/i2c.h" #include "esp_rom_sys.h"…

Java分布式架构知识体系及知识体系图

Java分布式架构整体知识体系是一个庞大而复杂的领域&#xff0c;它涵盖了多个方面&#xff0c;旨在帮助开发者构建高性能、高可用、可扩展的分布式系统。以下是对Java分布式架构整体知识体系的概述&#xff1a; 一、分布式理论基础 CAP理论&#xff1a; 一致性&#xff08;Con…

Java算法之Gnome 排序

简介 Gnome 排序&#xff0c;又称为双向插入排序或鸡尾酒排序&#xff0c;是一种改进的插入排序算法。它在每次迭代中不仅将最小的元素移动到前面&#xff0c;同时也将最大的元素移动到后面。这种排序算法在每次迭代中同时向两个方向进行移动&#xff0c;因此得名。 算法步骤…

如何开发针对不平衡分类的成本敏感神经网络 python

如何开发针对不平衡分类的成本敏感神经网络 深度学习神经网络是一类灵活的机器学习算法&#xff0c;可以在各种问题上表现良好。 神经网络使用误差反向传播算法进行训练&#xff0c;该算法涉及计算模型在训练数据集上产生的误差&#xff0c;并根据这些误差的比例更新模型权重…

240831-Qwen2-VL-7B/2B部署测试

A. 运行效果 B. 配置部署 如果可以执行下面就执行下面&#xff1a; pip install githttps://github.com/huggingface/transformers accelerate否则分开执行 git clone https://github.com/huggingface/transformers cd transformers pip install . accelerate随后&#xff0…

k8s-pod 实战一 (创建pod,启动命令,参数,pod故障排除,拉取命令)

1. 创建一个Pod Pod 是 Kubernetes 中最小的部署单元。它可以包含一个或多个容器。下面是一个简单的 YAML 文件,用于创建一个包含 Nginx 容器的 Pod。 示例 YAML 文件 (nginx-pod.yaml) apiVersion: v1 kind: Pod metadata:name: nginx-pod spec:containers:- name: nginx-…

STM32(八):定时器——输入捕获实验

目录 输入捕获模式测频率&#xff1a; 结构图&#xff1a; 步骤&#xff1a; 部分函数详解&#xff1a; 源码&#xff1a; PWMI模式测频率占空比&#xff1a; 结构图&#xff1a; ​编辑 举例说明 源码&#xff1a; 输入捕获模式测频率&#xff1a; 结构图&#xf…

C#中List集合使用Remove方法详解——List使用Remove方法需要注意的坑?

目录 一、基本使用 1、简单类型的例子 2、复杂类型的例子 二、思考 三、深度解析 四、正确的使用方式 1、重写 Equals 和 GetHashCode 2、使用 LINQ 的 FirstOrDefault 方法 五、性能考虑 六、注意事项 总结 在C#中&#xff0c;List<T> 是一个常用的数据结构&…

第四章 Java核心类库 第三节 集合框架

1. 集合框架概述与结构 首先&#xff0c;我们来简单了解一下Java集合框架的概述和结构。 集合框架的定义&#xff1a;Java集合框架是一组用来存储和操作数据集合的接口和类。它提供了一种统一的标准方法来操作不同的数据集合&#xff0c;极大简化了编程任务。 集合框架的结构…

我的电脑/资源管理器里无法显示新硬盘?

前情提要 我新&#xff01;买了一个京东京造的SATA3硬盘&#xff0c;一个绿联的SATA3转USB读取 现在我的电脑里只能显示我本地的C盘和D盘&#xff0c;不能显示这个接入的SATA盘。 系统环境&#xff1a;windows11 问题描述 在我的电脑里&#xff0c;只能看到我原本的C和D&…

互联网平台大模型网络架构设计

字节跳动&#xff1a;大模型网络实践分享 自2019年起&#xff0c;字节跳动公司便开始着手白盒项目。2020年&#xff0c;推出了首款接入交换机——25G型号&#xff0c;随后逐步实现软硬件的自主研发。在当前一代产品中&#xff0c;已经实现了100G接入、25.6T400G互联&#xff0c…

扩展——双向搜索

1. 基本概念 单向搜索&#xff1a;传统的搜索算法&#xff08;如广度优先搜索 BFS、深度优先搜索 DFS&#xff09;通常从起点开始&#xff0c;逐步扩展搜索到目标节点。搜索的时间复杂度与图的大小和结构有关。 双向搜索&#xff1a;双向搜索则同时从起点和终点进行搜索&#…

分享8个Python自动化实战脚本!

1. Python自动化实战脚本 1.1 网络自动化 网络上有丰富的信息资源&#xff0c;Python可以帮我们自动化获取这些信息。 爬虫简介&#xff1a;爬虫是一种自动提取网页信息的程序。Python有许多优秀的爬虫库&#xff0c;如requests和BeautifulSoup。 案例&#xff1a;使用Pytho…

软件测试学习笔记丨静态测试与代码审计 SonarQube

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32049 一&#xff0c;SonarQube 平台搭建 1.1&#xff0c; 介绍 Sonar 是一个用于代码质量管理的开放平台。通过插件机制&#xff0c;Sonar 可以集成不同的测试工具、代码分析工具&#xff…