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

在当今的数据驱动时代,机器学习算法已成为解析复杂数据集、揭示隐藏模式及预测未来趋势的重要工具。

由Kaizong Ye,Sherry Deng撰写

特别是在医疗健康领域,这些算法的应用极大地提升了我们对疾病预防、诊断及治疗方案的理解与制定能力。


本文旨在通过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. 人口统计学特征分析

  • 年龄与性别分布:绘制年龄-性别分布图,了解样本的基本构成。
  • 种族与教育水平:分析不同种族间的教育水平差异,探讨其对健康的影响。

自适应网页宽度的 Youku 视频

视频

CNN(卷积神经网络)模型以及R语言实现

探索见解

去bilibili观看

探索更多视频


视频

从决策树到随机森林:R语言信用卡违约分析信贷数据实例

探索见解

去bilibili观看

探索更多视频


视频

多元线性回归模型原理讲解与R语言实例

探索见解

去bilibili观看

探索更多视频


# 绘制年龄与性别分布图 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年的体重变化。


QQ截图20220302134203.png

TensorFlow、Keras的LSTM神经网络预测和异常检验股市价格时间序列数据可视化python实例附代码数据

阅读文章



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


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498