谭静仪,蔡灿,林爱华,董雪
(广州新华学院健康学院,广东 广州 510520)
《中国心血管健康与疾病报告2020》预测我国心血管疾病现患人数3.30亿,其中冠心病1139万[1]。近年来心血管疾病占我国居民疾病死亡构成的40%以上,且其患病率及死亡率仍处于上升阶段[1-3]。因此,心血管疾病的预防也被视为一项重要的工作。而通过数据挖掘方式来分析及预测不同个体特征发生心血管疾病的风险,对预防心血管疾病起到至关重要的作用[4-6]。在数据挖掘方法中,支持向量机算法(support vector machine,SVM)是一种按监督学习方式对数据进行二元分类的广义线性分类器[7]。SVM 算法的基本思想是:找到集合边缘上的若干数据,用这些点找出一个最优分割面(超平面),也就是能使支持向量和超平面最小距离的最大值,基本模型是定义在特征空间上的间隔最大的线性分类器[8-10]。SVM 算法是一种强大的分类和回归方法,适用于进行模式识别、分类以及回归分析,可用于处理文本分类、图像检测、人脸识别等问题[11-13],在医学领域对于疾病预测、临床诊断、医学影像识别、药物开发、医院信息系统等方面也有广泛的应用[14-17]。在SVM 算法的相关研究中,张峻铭等[18]建立了预测士兵是否适合成为精英士兵的SVM分类模型,其准确率接近90%,召回率达到100%。裴修侗等[19]提出一种利用优化的SVM 算法对糖尿病诊断进行辅助建模的方法,平均精度达到78%以上。刘宁[20]使用SVM 算法诊断哮喘准确率为82%,AUC 为0.83。基于此,本研究拟建立基于SVM 算法的冠心病分类预测模型,以期为预防心血管疾病提供帮助。
1.1 数据前处理 收集来自The National Health and Nutritional Examination Survey(NHANES)网站的数据集,共含783 个样本数据。本数据特征较多,为便于后续数据清洗过程中的特征提取、特征选择等工作,经专家咨询,剔除多余特征。
1.2 数据可视化分析 在Python 中使用heatmap 函数绘制特征相关关系的热力图,利用Pandas 和Matplotlib 库函数绘制冠心病(CAD)总体分布的条形图、按年龄分布的条形图和不同年龄段冠心病患病的饼图。
1.3 使用SVM 算法构建预测模型 首先采用get_dummies()编码方式处理非连续性分类数据,将原数据中经过独热编码的列删除,并拆分数据集和目标集合;然后按照0.75 和0.25 的比例拆分训练集(587 例),测试集(196 例);由于数据集合的不同特征之间数据相差大,对于SVM 算法会产生权重影响,因此做归一化处理数据;接下来使用默认参数建立SVM 模型;参数kernel='rbf',即选择高斯核。最后使用网格搜索寻找更好的模型参数,使用精确率、召回率、准确率、F1-score、混淆矩阵、ROC 曲线及AUC 面积7 方面性能评价指标来评判模型预测效果。其中,混淆矩阵是按类别显示预测结果与真实结果,包括了真阳性、真阴性、假阳性和假阴性数据频数的矩阵;ROC 曲线是以假阳性率为横坐标、真阳性率为纵坐标的曲线;ROC 曲线下面积大小为AUC值;精确率(precision)表示预测为正例的数据中实际为正例的比例;召回率(recall)表示实际为正例的数据中被预测为正例的比例;F1-score 是精确率和召回率的调和平均;准确度(accuracy)表示所有数据中被正确预测的比例。
2.1 样本数据特征描述 本数据共包含783 个样本数据,其中21 个与冠状动脉粥样硬化性心脏病有关的主要特征含义见表1。
表1 冠心病样本数据
2.2 特征相关性分析 特征相关关系的热力图显示,冠心病(CAD)和心衰(CHF)有中等强度的相关性(r=0.48),脑卒中(stroke)和冠心病有一定的正相关性,运动量(YDL)和冠心病、心衰、糖尿病、脑卒中均呈一定的负相关性。此外,蛋白质、脂肪、热量的摄入之间存在强相关,总胆固醇和低密度脂蛋白胆固醇有中等强度的相关,性别、年龄和热量摄入之间存在弱相关。是否是运动员与冠心病患病情况没有直接关系,见图1。
图1 特征相关关系热力图
2.3 样本中冠心病患病情况 样本中共含有118 例冠心病患者,见图2A;考察冠心病患者的年龄分布,发现病例主要集中在50~100岁,见图2B;不同年龄段心脏病患病比例饼图显示,年龄在75~100 岁老年人的患病率高于50~75 岁和25~50 岁的患病率,见图2C。
2.4 SVM 算法构建预测模型 本次用于冠心病预测的共783 个样本数据,计算量少,且为二分类问题,SVM 算法的计算复杂度和训练集中的样本数目成正比,计算复杂度低,足以支撑课题所需冠心病患者分类预测的运行。默认参数的SVM 模型,见图3,训练集分类准确率为85%,测试集分类准确率达84.6%,整体准确率为84.6%,并无过拟合。网格搜索优化后,此SVM 模型分类准确率为99%,见表2;ROC 曲线靠近左上角,AUC 面积远大于0.5,见图4,认为模型整体分类效果优秀。另外,此模型假阳数据仅有2例,假阴数据为0;模型对于冠心病数据与非冠心病数据的分类预测精确率、召回率均不低于90%,其中的冠心病数据精确率与的非冠心病数据召回率达到了100%,综合来看冠心病数据的等权重F1-score 为97%,非冠心病数据的F1-score 为99%,此模型对于冠心病和非冠心病样本数据的预测精确性高、覆盖面广。
图3 SVM 模型混淆矩阵
表2 网格搜索优化后SVM 模型分类指标文本报告
图4 SVM 模型ROC 曲线
SVM 算法具有3 大优点:①SVM 模型的分类效果好:算法复杂度由支持向量的个数决定,而不是由数据的维度决定的,因此可以“剔除”大量冗余样本,不太容易出现过度拟合的问题[21];②拥有较高的分准率:因为训练模型完全依赖于支持向量,所以纵使训练数据集里所有的非支持向量的点都被删除,重复训练过程,仍会得到完全相同的模型[22];③能解决复杂度高的分类问题:SVM 算法利用核函数克服了维数灾难和非线性可分的问题,向高维空间映射时没有增加计算的复杂度,可以解决非线性和高维的问题。
SVM 算法存在以下不足之处:①容易被泛化:当SVM 模型训练得出的支持向量数量比较少时,训练模型比较容易被泛化[23];②易敏感性:SVM 模型对参数的调节、核函数的选择和缺失数据敏感敏感[24];③对大规模的训练数据集不适用:由于SVM 算法需要借助二次规划来求解支持向量,求解二次规划将涉及样本个数m 的m 阶矩阵的计算,如m 数目很大,矩阵的计算和存储则需要消耗大量的运算时间和机器内存。
在本案例中,基于网格搜索优化的SVM 算法的冠心病分类预测模型体现出了极其优秀的分类效果,准确率达99%;对冠心病样本的识别能力也很强,F1-score 为97%。本项目中SVM 算法效果良好的主要原因是,案例样本数据质量高,且对特征进行了筛选;但是,案例数据的样本量较小、特征相对较多,对结果有负面影响。另外,本项目使用的数据集来自于美国,所以此模型用于国内冠心病数据的分类预测时可能会准确率下降,如果能收集到我国冠心病领域公开的高质量数据集,建立出的冠心病预测模型在国内会更有实际意义。