Python预测体重变化:决策树、tf神经网络、随机森林、梯度提升树、线性回归可视化分析吸烟与健康调查数据
全文链接:https://tecdat.cn/?p=36648
原文出处:拓端数据部落公众号
在当今的数据驱动时代,机器学习算法已成为解析复杂数据集、揭示隐藏模式及预测未来趋势的重要工具。特别是在医疗健康领域,这些算法的应用极大地提升了我们对疾病预防、诊断及治疗方案的理解与制定能力。本文旨在通过Python中的决策树、神经网络及随机森林等经典机器学习算法,对吸烟、体重变化与健康数据进行可视化分析,以期发现它们之间的潜在关系,为公共卫生政策制定、个性化健康管理提供科学依据。
吸烟与体重变化作为影响人类健康的重要因素,长期以来一直受到医学界和社会各界的广泛关注。吸烟不仅与多种癌症、心血管疾病等直接相关,还可能通过影响食欲、代谢率等机制间接导致体重变化。而体重的显著变化,无论是增加还是减少,都可能对个体的整体健康状况产生深远影响。因此,深入探讨这三者之间的关系,对于制定有效的健康干预措施具有重要意义。
数据
调查旨在研究第一次全国健康与营养调查评估的临床、营养和行为因素与随后的发病率、死亡率和住院率之间的关系。
第一次全国健康与营养调查所评估的临床、营养和行为因素与随后的发病率、死亡率和医院使用率之间的关系,以及风险因素、功能限制和入院治疗的变化。
变量的详细解释:
- age: 年龄,表示被调查者在进行调查时的年龄。年龄是评估健康状况和预测未来健康风险的重要因素。
- sex: 性别,通常表示为男性或女性。性别在健康研究中是一个重要的变量,因为男性和女性在健康风险、疾病表现和响应治疗方面可能存在差异。
- race: 种族,指的是被调查者的种族背景。种族可能会影响健康状况、健康行为和获取医疗资源的途径。然而,需要注意的是,种族是一个复杂且敏感的概念,其定义和分类可能因文化和历史背景而异。
- education.code: 教育程度代码,表示被调查者的教育水平。教育程度可能与健康素养、健康行为和健康状况有关。这个变量通常通过分类代码来表示不同的教育水平(如小学、初中、高中、大学等)。
- smokeintensity: 吸烟强度,表示被调查者吸烟的频率或量。这个变量可能以每天吸烟的支数、包数或其他度量单位来表示。吸烟是许多健康问题的风险因素,因此了解吸烟强度对于评估健康风险非常重要。
- smokeyrs: 吸烟年数,表示被调查者吸烟的年数。这个变量与吸烟强度一起,提供了关于吸烟历史和潜在健康风险的额外信息。
- exercise: 体育锻炼情况,可能表示被调查者是否进行规律的体育锻炼以及锻炼的频率和强度。体育锻炼对于维持健康和预防疾病至关重要。
- active: 日常活动水平,可能表示被调查者在日常生活中的活动量或能量消耗水平。这个变量与体育锻炼不同,它更侧重于日常生活中的非锻炼性活动。
- wt71: 1971年的体重,表示被调查者在1971年时的体重。体重是评估健康状况和肥胖风险的重要指标。
- 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()
接下来,我将分析不同种族间的教育水平差异。
b. 行为习惯分析
- 吸烟习惯:使用条形图或饼图展示吸烟者与非吸烟者的比例,以及吸烟强度(
smokeintensity
)和吸烟年数(smokeyrs
)的分布。 - 体育活动:分析体育锻炼(
exercise
)和日常活动水平(active
)的分布,探讨其与健康的关系。
接下来,我将分析吸烟习惯,包括吸烟者与非吸烟者的比例,以及吸烟强度和吸烟年数的分布。
吸烟习惯的分析结果如下:
- 吸烟者与非吸烟者的比例:根据数据,有1566位吸烟者,没有非吸烟者。这表明在这个样本中,所有人都有吸烟习惯。
- 吸烟强度分布:由于样本中所有人都有吸烟习惯,因此吸烟强度的分布图显示了吸烟强度的分布情况。
- 吸烟年数分布:同样,由于样本中所有人都有吸烟习惯,吸烟年数的分布图也显示了吸烟年数的分布情况。
接下来,我将分析体育锻炼和日常活动水平的分布。
- 体育锻炼分布图显示了样本中不同体育锻炼水平的分布情况。
- 日常活动水平分布图展示了样本中不同日常活动水平的分布情况。
c. 体重变化与健康
- 体重变化:利用折线图或散点图展示从1971年(
wt71
)到1982年(wt82_71
)的体重变化,分析体重变化与后续健康问题的关联。
最后,我将分析从1971年到1982年的体重变化。
plt.title('1971年至1982年体重变化')
plt.xlabel('1971年体重')
plt.ylabel('1982年体重')
plt.show()
这个图表展示了样本中个体在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
根据随机森林模型的分析,我们得到了以下结果:
- 均方误差(Mean Squared Error, MSE) :约 259.78。
- 决定系数(R-squared, R²) :约 -0.024。
从图中可以看出,预测的体重与真实体重之间的关系。理想情况下,所有点应该靠近黑色虚线,这表示预测值与真实值非常接近。
根据随机森林模型的特征重要性分析,我们得到了以下结果:
- 年龄(
age
) :重要性最高,约为 0.423。 - 性别(
sex
) :重要性为 0.185。 - 种族(
race
) :重要性为 0.050。 - 教育水平(
education.code
) :重要性为 0.140。 - 体育锻炼(
exercise
) :重要性为 0.101。 - 日常活动水平(
active
) :重要性为 0.102。
从这些结果中可以看出,年龄是影响体重变化的最重要因素,其次是性别和教育水平。这些信息对于医生在评估患者的体重变化风险时可能非常有用。
梯度提升树模型
根据梯度提升树模型的分析,我们得到了以下结果:
- 均方误差(Mean Squared Error, MSE) :约 208.04。
- 决定系数(R-squared, R²) :约 0.180。
从图中可以看出,预测的体重与真实体重之间的关系。理想情况下,所有点应该靠近黑色虚线,这表示预测值与真实值非常接近。
决策树
根据决策树模型的分析,我们得到了以下结果:
- 均方误差(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。
我已经将决策树模型进行了可视化。从图中可以看到,树的各个节点显示了用于分割数据的特征和阈值,以及每个叶子节点的预测结果。
对决策树模型进行剪枝,以提高其泛化能力。剪枝可以通过设置决策树的最大深度或最小样本分割来实现。我将尝试使用不同的剪枝参数来优化模型,并可视化剪枝后的决策树。
# 使用网格搜索进行参数调优
grid_search = GridSearchCV(DecisionTreeRegressor(random_state=0), param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X_train, y_train)
通过对决策树模型进行剪枝,我们得到了以下最佳参数:
- 最大深度(
max_depth
) :10 - 最小样本分割(
min_samples_split
) :10 - 最小样本叶片(
min_samples_leaf
) :4
使用这些参数,我构建了剪枝后的决策树模型,并进行了可视化。从剪枝后的决策树中可以看出,树的复杂度有所降低,这有助于提高模型的泛化能力,减少过拟合的风险。
这是根据提供的数据构建的体重变化预测的决策树模型。该模型考虑了年龄、性别、种族、教育程度、锻炼习惯、活跃程度和1971年的体重等因素。
决策树的每个节点显示了用于分割数据的特征和阈值。叶子节点表示预测的体重变化值。
对决策树进行进一步的剪枝,并输出一些有价值的规则。这将涉及调整决策树的参数,如最大深度或最小样本分割数,以简化模型并提取关键规则。
以下是剪枝后的决策树模型中的一些关键规则:
-
如果年龄小于或等于56.5岁:
-
如果年龄小于或等于43.5岁:
-
如果1971年的体重小于或等于122.07磅:
- 预测的体重变化为4.26磅
-
如果1971年的体重大于122.07磅:
- 预测的体重变化为-9.00磅
-
-
如果1971年的体重小于或等于88.79磅:
- 预测的体重变化为2.66磅
-
如果1971年的体重大于88.79磅:
- 预测的体重变化为-0.85磅
-
-
如果1971年的体重小于或等于92.36磅:
-
如果年龄小于或等于67.5岁:
- 预测的体重变化为0.14磅
-
如果年龄大于67.5岁:
- 预测的体重变化为-6.40磅
-
-
如果性别为女性(sex <= 0.5):
- 预测的体重变化为-8.83磅
- 预测的体重变化为-21.28磅
这些规则提供了基于年龄、性别和1971年的体重来预测体重变化的指导。
线性回归
数据集已成功加载。接下来,我将进行以下步骤来构建和分析线性回归模型:
- 数据预处理:包括处理缺失值、编码分类变量(如有必要)以及标准化数值变量。
- 构建神经网络模型:使用年龄(age)、性别(sex)、种族(race)、教育程度(education.code)、锻炼(exercise)、活跃度(active)和1971年的体重(wt71)作为输入特征,1982年与1971年的体重变化(wt82_71)作为目标变量。
- 训练模型:使用数据集的一部分进行训练。
- 评估模型:使用数据集的另一部分进行测试,并评估模型的性能。
- 可视化结果:展示模型的预测结果和实际值,以及误差分布。
现在,我将开始进行数据预处理。
数据预处理完成,我们有1252个样本用于训练和314个样本用于测试。每个样本有7个特征。
线性回归模型的训练和测试均方误差(MSE)分别为58.62和49.91。这提供了模型性能的一个初步指标。
接下来,我将进行结果的可视化,包括模型的预测结果和误差分布。
分析结果
-
实际值 vs 预测值图:
- 在“训练数据:实际值 vs 预测值”图中,点大致围绕黑色虚线(即y=x线)分布,表明模型的预测与实际值大致相符。
- 在“测试数据:实际值 vs 预测值”图中,点也大致围绕黑色虚线分布,表明模型在未见过的数据上的表现也相对准确。
-
误差分布图:
- 误差分布图显示了训练误差和测试误差的分布情况。
- 训练误差和测试误差都呈现出近似正态分布的形态,这通常是一个好的迹象,表明模型没有系统性的偏差。
模型参数
由于我们使用的是线性回归模型,模型参数包括权重(coefficients)和截距(intercept)。下面列出了这些参数:
- 权重(Coefficients) :这些值表示每个特征对目标变量(体重变化)的影响。
- 截距(Intercept) :当所有特征值都为0时,模型预测的目标变量值。
让我们查看这些参数的具体值。
模型参数解释
-
权重(Coefficients) :
- 年龄: -1.96 — 年龄每增加一岁,预测的体重变化减少约1.96单位。
- 性别: -1.00 — 与女性相比,男性的预测体重变化减少约1.00单位。
- 种族: 0.08 — 某些种族可能与体重变化的小幅增加相关。
- 教育程度: 0.04 — 更高的教育程度可能与体重变化的小幅增加相关。
- 锻炼: 0.27 — 更多的锻炼可能与体重变化的增加相关。
- 活跃度: -0.30 — 更高的活跃度可能与体重变化的减少相关。
- 1971年的体重: -1.34 — 更高的初始体重可能与体重变化的减少相关。
-
截距(Intercept) : 2.56 — 当所有特征值都为0时,模型预测的体重变化为2.56单位。
tensorflow神经网络
构建了一个简单的神经网络模型,并使用Adam
优化器和mean_squared_error
作为损失函数进行编译。然后,我们使用model.fit
方法训练模型,并将训练过程中的历史记录存储在history
对象中。
在模型评估之后,我们使用matplotlib
绘制了训练和验证损失随训练周期(epoch)变化的曲线图。这有助于我们理解模型在训练过程中的表现,以及是否存在过拟合或欠拟合的情况。
# 评估模型
loss = model.evaluate(X_test, y_test, verbose=0)
print(f"Test Loss: {loss}")