首页 > 编程语言 >Python预测体重变化:决策树、tf神经网络、随机森林、梯度提升树、线性回归可视化分析吸烟与健康调查数据

Python预测体重变化:决策树、tf神经网络、随机森林、梯度提升树、线性回归可视化分析吸烟与健康调查数据

时间:2024-07-03 19:09:49浏览次数:22  
标签:Python 模型 1971 吸烟 体重 tf 变化 决策树

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

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

在当今的数据驱动时代,机器学习算法已成为解析复杂数据集、揭示隐藏模式及预测未来趋势的重要工具。特别是在医疗健康领域,这些算法的应用极大地提升了我们对疾病预防、诊断及治疗方案的理解与制定能力。本文旨在通过Python中的决策树、神经网络及随机森林等经典机器学习算法,对吸烟、体重变化与健康数据进行可视化分析,以期发现它们之间的潜在关系,为公共卫生政策制定、个性化健康管理提供科学依据。

吸烟与体重变化作为影响人类健康的重要因素,长期以来一直受到医学界和社会各界的广泛关注。吸烟不仅与多种癌症、心血管疾病等直接相关,还可能通过影响食欲、代谢率等机制间接导致体重变化。而体重的显著变化,无论是增加还是减少,都可能对个体的整体健康状况产生深远影响。因此,深入探讨这三者之间的关系,对于制定有效的健康干预措施具有重要意义。

数据

调查旨在研究第一次全国健康与营养调查评估的临床、营养和行为因素与随后的发病率、死亡率和住院率之间的关系。

第一次全国健康与营养调查所评估的临床、营养和行为因素与随后的发病率、死亡率和医院使用率之间的关系,以及风险因素、功能限制和入院治疗的变化。

image.png

变量的详细解释:

  1. age: 年龄,表示被调查者在进行调查时的年龄。年龄是评估健康状况和预测未来健康风险的重要因素。
  2. sex: 性别,通常表示为男性或女性。性别在健康研究中是一个重要的变量,因为男性和女性在健康风险、疾病表现和响应治疗方面可能存在差异。
  3. race: 种族,指的是被调查者的种族背景。种族可能会影响健康状况、健康行为和获取医疗资源的途径。然而,需要注意的是,种族是一个复杂且敏感的概念,其定义和分类可能因文化和历史背景而异。
  4. education.code: 教育程度代码,表示被调查者的教育水平。教育程度可能与健康素养、健康行为和健康状况有关。这个变量通常通过分类代码来表示不同的教育水平(如小学、初中、高中、大学等)。
  5. smokeintensity: 吸烟强度,表示被调查者吸烟的频率或量。这个变量可能以每天吸烟的支数、包数或其他度量单位来表示。吸烟是许多健康问题的风险因素,因此了解吸烟强度对于评估健康风险非常重要。
  6. smokeyrs: 吸烟年数,表示被调查者吸烟的年数。这个变量与吸烟强度一起,提供了关于吸烟历史和潜在健康风险的额外信息。
  7. exercise: 体育锻炼情况,可能表示被调查者是否进行规律的体育锻炼以及锻炼的频率和强度。体育锻炼对于维持健康和预防疾病至关重要。
  8. active: 日常活动水平,可能表示被调查者在日常生活中的活动量或能量消耗水平。这个变量与体育锻炼不同,它更侧重于日常生活中的非锻炼性活动。
  9. wt71: 1971年的体重,表示被调查者在1971年时的体重。体重是评估健康状况和肥胖风险的重要指标。
  10. wt82_71: 从1971年到1982年的体重变化(或1982年相对于1971年的体重),表示被调查者在这段时间内体重的变化情况。体重变化是评估健康状况变化的重要指标之一。

针对调查的数据集进行可视化分析和临床分析,结合机器学习、深度学习技术,可以深入探索健康与营养因素、行为模式与后续健康状况之间的关系。

1. 基本统计与可视化分析

首先,我将加载并查看提供的数据集,以便更好地理解其结构和内容。这将帮助我进行后续的数据分析和可视化。让我们开始吧。

数据集已成功加载。

a. 人口统计学特征分析

  • 年龄与性别分布:绘制年龄-性别分布图,了解样本的基本构成。
  • 种族与教育水平:分析不同种族间的教育水平差异,探讨其对健康的影响。
   
# 绘制年龄与性别分布图
plt.figure(figsize=(12, 6))
sns.histplot(data=data, x='age', hue='sex', multiple='stack', stat='count', common_norm=False, palette=colors[:2])
plt.title('年龄与性别分布图')
plt.xlabel('年龄')
plt.ylabel('人数')
plt.legend(title='性别', labels=['女性', '男性'])
plt.show()

image.png

接下来,我将分析不同种族间的教育水平差异。

image.png

b. 行为习惯分析

  • 吸烟习惯:使用条形图或饼图展示吸烟者与非吸烟者的比例,以及吸烟强度(smokeintensity)和吸烟年数(smokeyrs)的分布。
  • 体育活动:分析体育锻炼(exercise)和日常活动水平(active)的分布,探讨其与健康的关系。

接下来,我将分析吸烟习惯,包括吸烟者与非吸烟者的比例,以及吸烟强度和吸烟年数的分布。

image.png

image.png

吸烟习惯的分析结果如下:

  • 吸烟者与非吸烟者的比例:根据数据,有1566位吸烟者,没有非吸烟者。这表明在这个样本中,所有人都有吸烟习惯。
  • 吸烟强度分布:由于样本中所有人都有吸烟习惯,因此吸烟强度的分布图显示了吸烟强度的分布情况。
  • 吸烟年数分布:同样,由于样本中所有人都有吸烟习惯,吸烟年数的分布图也显示了吸烟年数的分布情况。

接下来,我将分析体育锻炼和日常活动水平的分布。

image.png

image.png

  • 体育锻炼分布图显示了样本中不同体育锻炼水平的分布情况。
  • 日常活动水平分布图展示了样本中不同日常活动水平的分布情况。

c. 体重变化与健康

  • 体重变化:利用折线图或散点图展示从1971年(wt71)到1982年(wt82_71)的体重变化,分析体重变化与后续健康问题的关联。

最后,我将分析从1971年到1982年的体重变化。

   
plt.title('1971年至1982年体重变化')
plt.xlabel('1971年体重')
plt.ylabel('1982年体重')
plt.show()

image.png

这个图表展示了样本中个体在1971年和1982年的体重变化情况。每个点代表一个个体,横坐标表示1971年的体重,纵坐标表示1982年的体重。

随机森林体重变化预测模型

首先,我将使用随机森林模型,将年龄(age)、性别(sex)、种族(race)、教育水平(education.code)、体育锻炼(exercise)、日常活动水平(active)作为特征变量,1971年的体重(wt71)作为目标变量,来构建体重变化预测模型。

接下来,我将对结果进行可视化。

   
# 构建随机森林模型
rf_model = RandomForestRegressor(random_state=0)
rf_model.fit(X_train, y_train)


mse, r2

image.png

根据随机森林模型的分析,我们得到了以下结果:

  • 均方误差(Mean Squared Error, MSE) :约 259.78。
  • 决定系数(R-squared, R²) :约 -0.024。

从图中可以看出,预测的体重与真实体重之间的关系。理想情况下,所有点应该靠近黑色虚线,这表示预测值与真实值非常接近。

image.png

根据随机森林模型的特征重要性分析,我们得到了以下结果:

  • 年龄(age :重要性最高,约为 0.423。
  • 性别(sex :重要性为 0.185。
  • 种族(race :重要性为 0.050。
  • 教育水平(education.code :重要性为 0.140。
  • 体育锻炼(exercise :重要性为 0.101。
  • 日常活动水平(active :重要性为 0.102。

从这些结果中可以看出,年龄是影响体重变化的最重要因素,其次是性别和教育水平。这些信息对于医生在评估患者的体重变化风险时可能非常有用。

梯度提升树模型

image.png

根据梯度提升树模型的分析,我们得到了以下结果:

  • 均方误差(Mean Squared Error, MSE) :约 208.04。
  • 决定系数(R-squared, R²) :约 0.180。

从图中可以看出,预测的体重与真实体重之间的关系。理想情况下,所有点应该靠近黑色虚线,这表示预测值与真实值非常接近。

决策树

image.png

根据决策树模型的分析,我们得到了以下结果:

  • 均方误差(Mean Squared Error, MSE) :约 345.14。
  • 决定系数(R-squared, R²) :约 -0.361。

从图中可以看出,预测的体重与真实体重之间的关系。理想情况下,所有点应该靠近黑色虚线,这表示预测值与真实值非常接近。

决策树模型的特征重要性如下:

  • 年龄(age :重要性为 0.439。
  • 性别(sex :重要性为 0.200。
  • 种族(race :重要性为 0.045。
  • 教育水平(education.code :重要性为 0.117。
  • 体育锻炼(exercise :重要性为 0.106。
  • 日常活动水平(active :重要性为 0.093。

image.png

我已经将决策树模型进行了可视化。从图中可以看到,树的各个节点显示了用于分割数据的特征和阈值,以及每个叶子节点的预测结果。

对决策树模型进行剪枝,以提高其泛化能力。剪枝可以通过设置决策树的最大深度或最小样本分割来实现。我将尝试使用不同的剪枝参数来优化模型,并可视化剪枝后的决策树。

   
# 使用网格搜索进行参数调优
grid_search = GridSearchCV(DecisionTreeRegressor(random_state=0), param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X_train, y_train)

image.png

通过对决策树模型进行剪枝,我们得到了以下最佳参数:

  • 最大深度(max_depth :10
  • 最小样本分割(min_samples_split :10
  • 最小样本叶片(min_samples_leaf :4

使用这些参数,我构建了剪枝后的决策树模型,并进行了可视化。从剪枝后的决策树中可以看出,树的复杂度有所降低,这有助于提高模型的泛化能力,减少过拟合的风险。

image.png

这是根据提供的数据构建的体重变化预测的决策树模型。该模型考虑了年龄、性别、种族、教育程度、锻炼习惯、活跃程度和1971年的体重等因素。

决策树的每个节点显示了用于分割数据的特征和阈值。叶子节点表示预测的体重变化值。

对决策树进行进一步的剪枝,并输出一些有价值的规则。这将涉及调整决策树的参数,如最大深度或最小样本分割数,以简化模型并提取关键规则。

以下是剪枝后的决策树模型中的一些关键规则:

  1. 如果年龄小于或等于56.5岁:

    • 如果年龄小于或等于43.5岁:

      • 如果1971年的体重小于或等于122.07磅:

        • 预测的体重变化为4.26磅
      • 如果1971年的体重大于122.07磅:

        • 预测的体重变化为-9.00磅
    • 如果1971年的体重小于或等于88.79磅:

      • 预测的体重变化为2.66磅
    • 如果1971年的体重大于88.79磅:

      • 预测的体重变化为-0.85磅
  2. 如果1971年的体重小于或等于92.36磅:

    • 如果年龄小于或等于67.5岁:

      • 预测的体重变化为0.14磅
    • 如果年龄大于67.5岁:

      • 预测的体重变化为-6.40磅
  3. 如果性别为女性(sex <= 0.5):

    • 预测的体重变化为-8.83磅
    • 预测的体重变化为-21.28磅

这些规则提供了基于年龄、性别和1971年的体重来预测体重变化的指导。

线性回归

数据集已成功加载。接下来,我将进行以下步骤来构建和分析线性回归模型:

  1. 数据预处理:包括处理缺失值、编码分类变量(如有必要)以及标准化数值变量。
  2. 构建神经网络模型:使用年龄(age)、性别(sex)、种族(race)、教育程度(education.code)、锻炼(exercise)、活跃度(active)和1971年的体重(wt71)作为输入特征,1982年与1971年的体重变化(wt82_71)作为目标变量。
  3. 训练模型:使用数据集的一部分进行训练。
  4. 评估模型:使用数据集的另一部分进行测试,并评估模型的性能。
  5. 可视化结果:展示模型的预测结果和实际值,以及误差分布。

现在,我将开始进行数据预处理。

数据预处理完成,我们有1252个样本用于训练和314个样本用于测试。每个样本有7个特征。

线性回归模型的训练和测试均方误差(MSE)分别为58.62和49.91。这提供了模型性能的一个初步指标。

接下来,我将进行结果的可视化,包括模型的预测结果和误差分布。

image.png

image.png

分析结果

  1. 实际值 vs 预测值图

    • 在“训练数据:实际值 vs 预测值”图中,点大致围绕黑色虚线(即y=x线)分布,表明模型的预测与实际值大致相符。
    • 在“测试数据:实际值 vs 预测值”图中,点也大致围绕黑色虚线分布,表明模型在未见过的数据上的表现也相对准确。
  2. 误差分布图

    • 误差分布图显示了训练误差和测试误差的分布情况。
    • 训练误差和测试误差都呈现出近似正态分布的形态,这通常是一个好的迹象,表明模型没有系统性的偏差。

模型参数

由于我们使用的是线性回归模型,模型参数包括权重(coefficients)和截距(intercept)。下面列出了这些参数:

  • 权重(Coefficients) :这些值表示每个特征对目标变量(体重变化)的影响。
  • 截距(Intercept) :当所有特征值都为0时,模型预测的目标变量值。

让我们查看这些参数的具体值。

模型参数解释

  1. 权重(Coefficients) :

    • 年龄: -1.96 — 年龄每增加一岁,预测的体重变化减少约1.96单位。
    • 性别: -1.00 — 与女性相比,男性的预测体重变化减少约1.00单位。
    • 种族: 0.08 — 某些种族可能与体重变化的小幅增加相关。
    • 教育程度: 0.04 — 更高的教育程度可能与体重变化的小幅增加相关。
    • 锻炼: 0.27 — 更多的锻炼可能与体重变化的增加相关。
    • 活跃度: -0.30 — 更高的活跃度可能与体重变化的减少相关。
    • 1971年的体重: -1.34 — 更高的初始体重可能与体重变化的减少相关。
  2. 截距(Intercept) : 2.56 — 当所有特征值都为0时,模型预测的体重变化为2.56单位。

tensorflow神经网络

构建了一个简单的神经网络模型,并使用Adam优化器和mean_squared_error作为损失函数进行编译。然后,我们使用model.fit方法训练模型,并将训练过程中的历史记录存储在history对象中。

image.png

在模型评估之后,我们使用matplotlib绘制了训练和验证损失随训练周期(epoch)变化的曲线图。这有助于我们理解模型在训练过程中的表现,以及是否存在过拟合或欠拟合的情况。

   
# 评估模型  
loss = model.evaluate(X_test, y_test, verbose=0)  
print(f"Test Loss: {loss}")  
  

image.png

image.png

from-product-led-growth-to-product-led-sales-thumb-1536x1536.jpg

标签:Python,模型,1971,吸烟,体重,tf,变化,决策树
From: https://www.cnblogs.com/tecdat/p/18282399

相关文章

  • 手把手教你如何用python写一个经典小游戏(仅需100行以内的代码)
    创作灵感小时候也就是大概十几年前的时候,智能触屏手机还未大量普及,移动网络还是2G,大部分人用的都是小灵通,里面只有几款经典的游戏,比如俄罗斯方块,贪吃蛇等。还记得以前自己玩的不亦乐乎。如今网络发展迅速,通讯设备越来越智能化,集成化,这些上世纪的经典游戏似乎早已淡忘人们的视......
  • 基于python语言的网页设计(手把手教你设计一个个人博客网站)
     总体的设计思路设计网页的思路涉及多个方面,从前端的页面结构和样式,到后端的数据处理和逻辑实现。1.确定网站的需求和功能首先要明确网站的功能需求,比如用户注册登录、博客文章发布和展示、评论系统等。2.选择技术栈选择适合的框架和工具。对于Python,常用的Web框架包括Fl......
  • 揭秘JWT:从CTF实战到Web开发,使用JWT令牌验证
    揭秘JWT:从CTF实战到Web开发,使用JWT令牌验证介绍JWT(JSONWebTokens)是一种开放标准(RFC7519),它定义了一种紧凑且自包含的方式,用于在网络上安全地传输信息。这种信息可以验证和信任,因为它是数字签名的。JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。「优点」:「无状态」:服......
  • python的String整理
    字符串常用方法方法描述参数说明使用示例capitalize()返回字符串的副本,将字符串的第一个字符转换为大写,其余字符转换为小写。无s='helloworld';s_capitalized=s.capitalize()casefold()返回字符串的副本,转换所有字符为小写,并且将所有特定于语言的大小写折叠为通用大......
  • 掌握 IPython 中的 %%bash 魔法命令:深入探索与实践
    IPython是一个强大的交互式Python解释器,它提供了丰富的功能来增强开发体验。其中一个非常实用的功能是IPython的“魔法命令”(magiccommands),这些命令以%%开头,用于执行特定的操作或改变IPython的行为。%%bash就是其中之一,它允许用户在IPython环境中执行Bash命......
  • 调用自定义模块出现ModuleNotFoundError
    产生问题的原因:IDE(pycharm)没有将自定义模块所在目录添加到工作目录中,导致在搜索目录中找不到要调用的模块。Python会在以下路径中搜索它想要寻找的模块:程序所在的文件夹标准库的安装路径操作系统环境变量PYTHONPATH所包含的路径解决方法1:在调用自定义模块前先将自定义模块/......
  • 【Python&网络通信】基于Bypy调用百度网盘api实现自动上传和下载网盘文件
    ​    网盘对于大家的生活工作可以说是息息相关,但是如果每天都重复去上传下载文件就会很浪费时间,所以有没有什么办法可以解放双手?那就是网盘接口,本文通过Bypy库实现百度网盘的自动上传和下载文件。原创作者:RS迷途小书童博客地址:https://blog.csdn.net/m0_56729804?t......
  • Python(netCDF4库)读取.nc文件(NetCDF气象数据文件)
    importnetCDF4asncimportnumpyasnpimportmatplotlib.pyplotaspltimportcartopy.crsasccrsdefplot_currents(file_path,variable_name,lon_name,lat_name):"""绘制洋流并保存为JPEG图片。参数:file_path(str):NetCDF文件路径。v......
  • 【每日一练】python列表
    1、输入一个整数列表,将列表中的元素按照逆序输出。list1=[5,4,5,6]list1.reverse()print(list1)[6,5,4,5]2、输入一个字符串列表,输出其中长度大于等于5的字符串,并且将它们转换为大写形式。list1=['hello','lol','ak47','aliang']foriinlist1:iflen(i)......
  • python编写使用xmlrpc上传wordpress网站文章的程序
    1、安装库        pipinstallpython-wordpress-xmlrpc,tkinter,xmlrpc,json2、发布文章url="http://域名/xmlrpc.php"username=用户名password=密码title=标题content=内容tags=标签categories=分类client=C......