一、引言
心脏病是全球范围内的主要健康问题之一,对人类健康和生活质量造成了严重影响。随着医学研究和技术的不断发展,利用机器学习和深度学习等数据分析技术来预测心脏病的风险已经成为一种新的研究方向。
本文的研究目的是基于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)
5.3 模型的迭代过程
plot(model,col="blue")
模型的迭代过程呈现为一条对角直线时,表示模型的训练过程比较稳定且收敛良好。
在机器学习中,迭代过程通常是指模型在每一轮迭代中根据训练数据进行参数调整和更新的过程。理想情况下,随着迭代次数的增加,模型的性能应该逐渐提高,并最终达到一个稳定的状态。
当迭代过程呈现为一条对角直线时,表示模型在训练过程中持续地取得进展并逐渐收敛到最佳状态。这是因为模型在每一次迭代中的改进都能够顺利地传递给下一次迭代,使得模型的性能稳步提升。
六、模型解释
6.1 变量重要性
h2o.varimp_plot(model)
6.2 部分依赖图(PDP)
h2o.partialPlot(model,test,"age")
6.3 ICE图
h2o.ice_plot(model,test,"age")
七、总结
在本次项目中,我们使用R语言和h2o深度学习框架构建了一个预测模型。主要步骤包括数据准备、模型训练和评估。
- 我们对原始数据进行了清洗和预处理,包括缺失值处理、异常值处理和特征选择等。然后,使用h2o包导入数据,并将其转换为h2o数据格式。
- 我们定义了一个深度学习模型,包括网络结构、激活函数和优化算法等。通过调整模型的超参数,如隐藏层节点数、学习率和迭代次数等,我们不断优化模型的性能。
- 在模型训练完成后,我们使用评价指标对模型进行了评估,包括均方误差(MSE),均方根误差(RMSE)和对数损失(LogLoss)等。通过这些指标,我们能够了解模型在训练数据上的预测性能。
- 我们根据评估结果对模型进行了总结和分析,并提供了混淆矩阵和最大度量指标表等可视化工具来展示模型的分类结果和优势。
最后如果你对如何进行特征工程、特征筛选、模型优化等高级知识,请关注和私信我,我们一起讨论学习。原创不易,请多多关注、点赞和再看,非常感谢!
参考文献:
[1] Dua, D. & Graff, C. (2019). UCI Machine Learning Repository.
*「未经许可,不得以任何方式复制或抄袭本篇文章之部分或全部内容。版权所有,侵权必究。」