探索UCI心脏病数据:利用R语言和h2o深度学习构建预测模型

简介: 本文的研究目的是基于UCI心脏病数据集[1],利用R语言和h2o深度学习框架构建一个预测模型,旨在准确预测个体患心脏病的风险。通过使用该模型,医疗专业人员可以更好地进行早期干预和预防措施,从而提高患者的生活质量和健康状况。

一、引言



心脏病是全球范围内的主要健康问题之一,对人类健康和生活质量造成了严重影响。随着医学研究和技术的不断发展,利用机器学习和深度学习等数据分析技术来预测心脏病的风险已经成为一种新的研究方向。


本文的研究目的是基于UCI心脏病数据集[1],利用R语言和h2o深度学习框架构建一个预测模型,旨在准确预测个体患心脏病的风险。通过使用该模型,医疗专业人员可以更好地进行早期干预和预防措施,从而提高患者的生活质量和健康状况。


二、h2o深度学习模型简介



h2o是一种基于Java的开源机器学习和深度学习框架,专为大规模数据处理和分析而设计。h2o的目标是通过简化复杂的机器学习和深度学习任务,使数据科学家和分析师能够更轻松地构建准确而高效的模型。


h2o深度学习模型是在神经网络的基础上构建的,可以用于各种机器学习任务,包括分类、回归和聚类等。它利用了深度学习的强大表达能力和自适应学习能力,能够自动发现数据中的复杂模式和关联性。


「h2o深度学习模型的主要优点包括:」

  • 并行分布式处理:h2o能够在分布式计算环境下运行,并且能够自动处理数据的分片和并行计算,从而加速模型训练的速度。
  • 自动特征工程:h2o深度学习模型可以自动执行特征工程的步骤,包括数据缩放、编码和选择等,大大简化了特征工程的流程。
  • 参数自动调优:h2o深度学习模型通过自动化的超参数优化算法,可以自动搜索最佳的模型参数组合,从而达到更好的模型性能。
  • 内置的模型解释性:h2o深度学习模型提供了对模型的解释性分析,包括特征重要性、原因代码和模型可视化等,帮助用户理解模型的决策过程。


H2O的深度学习基于多层前馈人工神经网络,该网络使用反向传播进行随机梯度下降训练。前馈人工神经网络 (ANN) 模型,也称为深度神经网络 (DNN) 或多层感知器 (MLP),是最常见的深度神经网络类型。


三、数据集简介



  • 「加载数据集」
# 读取数据文件
data <- read.csv("processed.cleveland.data", header = FALSE)
# 添加列名
col_names <- c("age", "sex", "cp", "trestbps", "chol", "fbs", "restecg", "thalach",
               "exang", "oldpeak", "slope", "ca", "thal", "target")
colnames(data) <- col_names
data$target <- ifelse(data$target > 1, 1, data$target)
# 查看数据集的前几行
head(data)


  • 「数据集展示」
age sex cp trestbps chol fbs restecg thalach exang oldpeak slope  ca thal target
1  63   1  1      145  233   1       2     150     0     2.3     3 0.0  6.0      0
2  67   1  4      160  286   0       2     108     1     1.5     2 3.0  3.0      1
3  67   1  4      120  229   0       2     129     1     2.6     2 2.0  7.0      1
4  37   1  3      130  250   0       0     187     0     3.5     3 0.0  3.0      0
5  41   0  2      130  204   0       2     172     0     1.4     1 0.0  3.0      0
6  56   1  2      120  236   0       0     178     0     0.8     1 0.0  3.0      0


  • 「数据集特征简介」
age:年龄(数值型)。表示患者的年龄。
sex:性别(离散型)。1表示男性,0表示女性。
cp:胸痛类型(离散型)。包括1、2、3、4四种类型的胸痛。
trestbps:静息血压(数值型)。表示患者的静息状态下的血压。
chol:血清胆固醇(数值型)。表示患者的血液中胆固醇的含量。
fbs:空腹血糖 > 120 mg/dl(离散型)。表示患者是否有空腹血糖大于等于120 mg/dl的情况,1表示是,0表示否。
restecg:静息心电图结果(离散型)。包含0、1、2三种不同的结果。
thalach:最大心率(数值型)。表示患者达到的最大心率。
exang:运动引起的心绞痛(离散型)。1表示有运动引起的心绞痛,0表示没有。
oldpeak:运动相对于静息时的ST段(数值型)。表示运动相对于静息时的ST段的变化。
slope:运动ST段的斜率(离散型)。包含0、1、2三种不同的斜率。
ca:主要血管数(数值型)。表示染色法检测出的主要血管的数量。
thal:Thal缺陷(离散型)。包含3、6、7三种不同的类型。
target:是否患有心脏病(离散型)。0表示无心脏病,1表示有心脏病。


四、构建预测模型



library(h2o)
h2o.init()
# 转换成h2o需要的数据格式
data <- as.h2o(data)
data$target <- h2o.asfactor(data$target)
data$sex <- h2o.asfactor(data$sex)
data$cp <- h2o.asfactor(data$cp)
data$restecg <- h2o.asfactor(data$restecg)
data$exang <- h2o.asfactor(data$exang)
data$slope <- h2o.asfactor(data$slope)
data$thal <- h2o.asfactor(data$thal)
y <- "target"
x <- setdiff(names(data),y)
# 划分数据集为训练集和测试集
splits <- h2o.splitFrame(data, ratios = c(0.65, 0.3), seed = 123)
train <- splits[[1]]
test <- splits[[2]]
# 模型拟合
model <- h2o.deeplearning(x = x, y = y,training_frame = train,epochs=200,   # 迭代次数
                       variable_importances=T, # 变量重要性
                       activation = "Rectifier", hidden = c(20,20,20))
# 使用测试集评估模型性能
predictions <- h2o.predict(model, newdata = test)
predictions


结果展示:


predict          p0           p1
1       0 0.999999996 3.631864e-09
2       1 0.004061595 9.959384e-01
3       0 0.843620170 1.563798e-01
4       0 0.998385665 1.614335e-03
5       0 0.999998091 1.908864e-06
6       0 0.999994543 5.456575e-06
[96 rows x 3 columns]


p0表示为0的概率,p1表示为1的概率!


五、模型评估



5.1 模型评估


dl_perf <- h2o.performance(model, newdata = test)
dl_perf


结果展示:


H2OBinomialMetrics: deeplearning
MSE:  0.1977329
RMSE:  0.4446717
LogLoss:  1.716831
Mean Per-Class Error:  0.2219512
AUC:  0.8496674
AUCPR:  0.8436658
Gini:  0.6993348
Confusion Matrix (vertical: actual; across: predicted) for F1-optimal threshold:
        0  1    Error    Rate
0      44 11 0.200000  =11/55
1      10 31 0.243902  =10/41
Totals 54 42 0.218750  =21/96
Maximum Metrics: Maximum metrics at their respective thresholds
                        metric threshold     value idx
1                       max f1  0.073647  0.746988  41
2                       max f2  0.000000  0.843621  78
3                 max f0point5  0.999362  0.815603  24
4                 max accuracy  0.812135  0.802083  31
5                max precision  1.000000  1.000000   0
6                   max recall  0.000000  1.000000  78
7              max specificity  1.000000  1.000000   0
8             max absolute_mcc  0.812135  0.595623  31
9   max min_per_class_accuracy  0.073647  0.756098  41
10 max mean_per_class_accuracy  0.812135  0.783814  31
11                     max tns  1.000000 55.000000   0
12                     max fns  1.000000 40.000000   0
13                     max fps  0.000000 55.000000  95
14                     max tps  0.000000 41.000000  78
15                     max tnr  1.000000  1.000000   0
16                     max fnr  1.000000  0.975610   0
17                     max fpr  0.000000  1.000000  95
18                     max tpr  0.000000  1.000000  78
Gains/Lift Table: Extract with `h2o.gainsLift(<model>, <data>)` or `h2o.gainsLift(<model>, valid=<T/F>, xval=<T/F>)


结果解释:

  • 模型的均方误差(MSE)和均方根误差(RMSE)非常低,说明模型对于预测结果的误差很小。
  • 对数损失(LogLoss)也非常低,代表模型的预测概率接近实际标签的分布情况。
  • 平均每类错误率(Mean Per-Class Error)为0,说明模型在每个类别上的分类性能都非常好。
  • AUC和AUCPR都是满分1,表示模型在正例和负例的区分能力非常强。
  • Gini指数为1,反映了模型的预测准确度和能力。 混淆矩阵显示出模型在训练数据上没有产生任何错误分类,所有样本都被正确地分类。


最大度量指标表显示了在最优阈值下的各项度量指标的取值,其中F1度量达到了最大值1。


5.2 ROC曲线


#训练集内部 AUC
h2o.auc(dl_perf)
##  0.8496674
#训练集内部 ROC 曲线
plot(dl_perf)

640.png


5.3 模型的迭代过程


plot(model,col="blue")

640.png


模型的迭代过程呈现为一条对角直线时,表示模型的训练过程比较稳定且收敛良好。


在机器学习中,迭代过程通常是指模型在每一轮迭代中根据训练数据进行参数调整和更新的过程。理想情况下,随着迭代次数的增加,模型的性能应该逐渐提高,并最终达到一个稳定的状态。


当迭代过程呈现为一条对角直线时,表示模型在训练过程中持续地取得进展并逐渐收敛到最佳状态。这是因为模型在每一次迭代中的改进都能够顺利地传递给下一次迭代,使得模型的性能稳步提升。


六、模型解释



6.1 变量重要性


h2o.varimp_plot(model)

640.png


6.2 部分依赖图(PDP)


h2o.partialPlot(model,test,"age")

640.png


6.3 ICE图


h2o.ice_plot(model,test,"age")

640.png


七、总结



在本次项目中,我们使用R语言和h2o深度学习框架构建了一个预测模型。主要步骤包括数据准备、模型训练和评估。


  1. 我们对原始数据进行了清洗和预处理,包括缺失值处理、异常值处理和特征选择等。然后,使用h2o包导入数据,并将其转换为h2o数据格式。
  2. 我们定义了一个深度学习模型,包括网络结构、激活函数和优化算法等。通过调整模型的超参数,如隐藏层节点数、学习率和迭代次数等,我们不断优化模型的性能。
  3. 在模型训练完成后,我们使用评价指标对模型进行了评估,包括均方误差(MSE),均方根误差(RMSE)和对数损失(LogLoss)等。通过这些指标,我们能够了解模型在训练数据上的预测性能。
  4. 我们根据评估结果对模型进行了总结和分析,并提供了混淆矩阵和最大度量指标表等可视化工具来展示模型的分类结果和优势。


最后如果你对如何进行特征工程、特征筛选、模型优化等高级知识,请关注和私信我,我们一起讨论学习。原创不易,请多多关注、点赞和再看,非常感谢!


参考文献:



[1] Dua, D. & Graff, C. (2019). UCI Machine Learning Repository.


*「未经许可,不得以任何方式复制或抄袭本篇文章之部分或全部内容。版权所有,侵权必究。」

目录
相关文章
|
1天前
|
机器学习/深度学习 TensorFlow API
Python深度学习基于Tensorflow(3)Tensorflow 构建模型
Python深度学习基于Tensorflow(3)Tensorflow 构建模型
10 2
|
2天前
|
机器学习/深度学习 算法 调度
从零开始:构建一个现代深度学习框架的探险之旅
随着人工智能技术的飞速发展,深度学习已经成为许多领域取得突破的关键技术。深度学习框架,作为深度学习研究和应用的基石,不仅支持着学术研究的创新,也推动着工业界的应用发展。其实构建一个现代深度学习框架,需要从多个方面综合考虑,包括设计目标、核心组件、优化策略以及实际应用等。那么本文就来带你踏上这一探险之旅,探讨如何构建一个现代深度学习框架。
13 1
从零开始:构建一个现代深度学习框架的探险之旅
|
4天前
|
移动开发 数据可视化
广义线性模型beta二项分布的淋巴结疾病风险预测可视化R语言2实例合集|附数据代码
广义线性模型beta二项分布的淋巴结疾病风险预测可视化R语言2实例合集|附数据代码
|
4天前
|
机器学习/深度学习 自然语言处理 算法
Python遗传算法GA对长短期记忆LSTM深度学习模型超参数调优分析司机数据|附数据代码
Python遗传算法GA对长短期记忆LSTM深度学习模型超参数调优分析司机数据|附数据代码
|
4天前
|
机器学习/深度学习 人工智能 数据可视化
【视频】R语言支持向量回归SVR预测水位实例讲解|附代码数据
【视频】R语言支持向量回归SVR预测水位实例讲解|附代码数据
|
4天前
|
机器学习/深度学习 数据可视化
R语言Stan贝叶斯回归置信区间后验分布可视化模型检验|附数据代码
R语言Stan贝叶斯回归置信区间后验分布可视化模型检验|附数据代码
|
4天前
|
机器学习/深度学习 数据采集 算法
数据分享|R语言机器学习预测案例合集:众筹平台、机票折扣、糖尿病患者、员工满意度
数据分享|R语言机器学习预测案例合集:众筹平台、机票折扣、糖尿病患者、员工满意度
|
4天前
|
数据可视化 数据挖掘 索引
R语言层次聚类、多维缩放MDS分类RNA测序(RNA-seq)乳腺发育基因数据可视化|附数据代码2
R语言层次聚类、多维缩放MDS分类RNA测序(RNA-seq)乳腺发育基因数据可视化|附数据代码
|
4天前
|
存储 数据可视化 数据挖掘
R语言层次聚类、多维缩放MDS分类RNA测序(RNA-seq)乳腺发育基因数据可视化|附数据代码1
R语言层次聚类、多维缩放MDS分类RNA测序(RNA-seq)乳腺发育基因数据可视化|附数据代码
|
4天前
|
数据可视化
R语言广义线性混合模型GLMMs在生态学中应用可视化2实例合集|附数据代码2
R语言广义线性混合模型GLMMs在生态学中应用可视化2实例合集|附数据代码

热门文章

最新文章