1. 引言
阻塞性睡眠呼吸暂停(Obstructive Sleep Apnea, OSA)是一种由上呼吸道部分或完全塌陷引起的,导致在睡眠期间出现周期性通气减少或暂停、间歇性缺氧、高碳酸血症等的睡眠呼吸疾病,OSA可导致多种疾病的发生,如高血压、2型糖尿病、冠心病、心率失常、认知功能障碍等。其主要症状包括睡眠时打鼾、白天嗜睡、夜间觉醒等[1]。有研究表明[2],在美国30~70岁的人群中,患有轻度OSA的男性和女性分别为33.9%和17.4%,而患有中度或重度OSA的人群中,男性和女性的比例分别为13.0%和5.6%。随着人们对该疾病的认识,越来越多的人希望通过科学的手段了解自身是否患有OSA。诊断OSA的金标准为多导睡眠监测(polysomnography, PSG) [2],PSG可以获取到患者多项生理指标,包括脑电、眼电、心电、下颌肌电、鼻气流、呼吸努力、脉搏血氧、胸式呼吸、腹式呼吸等。由于OSA对健康存在的不利影响被越来越多的人所了解,使人们对PSG的需求也不断增多。然而,PSG检查因其耗时长、费用昂贵、专科医生稀缺、技师培训较为复杂、患者佩戴导联负荷重等诸多原因导致效率较低[3],且PSG多用于具有典型症状患者的确诊,对于某些不具有典型症状的患者以及大范围临床患者,往往难以做到高效的筛查。因此,高效且便捷地预测和筛查可能患有OSA的患者,成为当今研究人员所关注的重点。
近年来,随着人工智能技术在医疗领域的蓬勃发展,越来越多的研究人员使用机器学习算法建立预测模型,用于预测患者疾病情况[4]。目前已应用于糖尿病检测[5]、肾脏疾病预测[6]、胃癌淋巴结转移预测[7]、肺癌[8]等诸多疾病。在OSA预测方面,有研究人员通过建立人工智能模型学习OSA患者的面部特征,对有特殊面部特征的人群进行OSA疾病筛查[9]。还有学者通过建立机器学习算法模型根据鼾声大小、振幅等特征对患者是否患有OSA进行预测[10]。OSA的精确诊断依赖于详细的患者数据,本研究的主要研究内容在于使用Adaboost算法建立机器学习模型,实现对OSA的筛查和预测,希望对OSA的临床筛查带来便利,降低医疗成本与医护人员工作压力。
2. 模型原理
提升(boost)方法是一种常用于分类的机器学习算法,是通过迭代学习的方式一步步将“弱学习算法”迭代从而得到一个“基本分类器”,再将“基本分类器”进行组合而得到“强分类器”。Adaboost算法是最具代表性的提升算法之一[11]。Adaboost是提高被前一轮弱分类器错误分类样本的权值,而降低被正确分类样本的权值,由该过程得到一系列弱分类器,基于此,加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用;减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用,由此即可合成一个强分类器[12]。Adaboost算法步骤具体如下:
输入:训练数据集
,其中
,
;弱学习算法;
输出:最终分类器
。
(1) 初始化训练数据的权值分布
,
,
(2) 对
(a) 使用具有权值分布
的训练数据集学习,得到基本分类器
(b) 计算
在训练数据集上的分类误差率
(c) 计算
的系数
这里的对数是自然对数。
(d) 更新训练数据集的权值分布
,
这里
是规范化因子
它使
成为一个概率分布
(3) 构建基本分类器的线性组合
得到最终分类器
3. 数据分析
本研究以kaggle平台公开的睡眠数据进行处理,该数据包括性别、年龄、职业、睡眠质量、睡眠时间、压力水平、身体活动水平、BMI类别、心率、血压、每日步数,以及是否有睡眠呼吸暂停等多个变量。首先对数据进行统计分析,然后再进行异常值处理、特征编码、特征选择等。现对变量进行描述如表1所示。
Table 1. Variable descriptions
表1. 量描述
变量 |
变量类型 |
变量描述 |
gd |
分类型变量 |
性别 |
Age |
数值型变量 |
年龄 |
OP |
分类型变量 |
职业 |
S_Duration |
数值型变量 |
睡眠持续时间(小时) |
Sleep_q |
数值型变量 |
睡眠质量(量表:1~10) |
Physical |
数值型变量 |
身体活动水平(分钟/天) |
Stress |
数值型变量 |
压力水平(等级:1~10) |
BMI |
分类型变量 |
身体质量指数 |
Blood_p_l |
数值型变量 |
血压(舒张压) |
Blood_p_h |
数值型变量 |
血压(收缩压) |
Heart_r |
数值型变量 |
心率 |
Daily Steps |
数值型变量 |
每日步数 |
Sleep Disorder |
分类型变量 |
睡眠障碍 |
数据集包含374条数据,其中已删除ID列,没有患睡眠相关问题的记录一共有216条,占总数的58%,患睡眠障碍的记录一共有77条,占总数的21%,患睡眠呼吸暂停的记录一共有78条,占总数的21%。除ID外,共包含13个特征变量,其中数值型变量有9个,分类型变量有4个。图1为各数值型变量间的皮尔逊相关系数矩阵,该矩阵中颜色越深代表两项字段间相关性越大;反之,颜色越浅,表示两者间相关性越小。其值范围从−1到+1。+1表示完全正相关,−1表示完全负相关,而0表示没有线性关系。在该系数矩阵中,血压(舒张压)和血压(收缩压)之间相关系数较大,若将相关性较大的两个变量同时放入模型,则可能会引起多种问题的发生,如增加模型复杂度、导致该模型中“基学习器”泛化能力较差即产生过拟合现象、特征重要性评估失真、降低模型解释性等问题。因此,综合考虑到其各个变量间的独立性,本研究决定在建立模型之前删除血压(舒张压)变量,基于其余12项特征变量建立模型。
Figure 1. Matrix heat map of correlation coefficient of each variable
图1. 变量相关性系数矩阵热力图
3.1. 分类型变量数据分析
我们对分类型变量进行初步探索,针对性别、职业、身体质量指数进行数据分析。由图2可知,在该数据集中男性记录包含189条,占比51%,女性记录包含185条,占比49%,可知该数据集男女比例分布良好。观察BMI,其中超重记录包含148条,占总记录的40%,BMI正常的记录包含216条,占比58%,肥胖记录包含10条,占比2%。该数据集中大部分人处于超重或正常。查看图3为目标变量即睡眠障碍状况,发现219人没有睡眠问题,占比58.6%,存在睡眠问题的患者在失眠和呼吸暂停中占比较为均匀,分别为20.6%和20.9%。图4为职业变量占比柱状图,该变量共包含11个类型,其中医生、护士、工程师占比较高。
Figure 2. Gender and BIM ratio
图2. 性别和BIM占比
Figure 3. Proportion of sleep disorders
图3. 睡眠障碍状况占比
Figure 4. Occupation distribution ratio
图4. 职业分布状况占比
3.2. 连续型变量数据分析
图5是连续变量数据分布可视化与核密度估计(Kernel Density Estimation, KDE)曲线图,KDE是一种可以帮助理解数据的分布特征的非参数统计方法,它可以使我们直观地了解到数据的某些特点如中心趋势、峰度、偏斜度以及数据点的密集度等。该图形使用python中Seaborn中的函数并结合matplotlib进行绘制。由图5可知,年龄、睡眠时间、身体活动水平、压力水平分布较为均匀。睡眠质量评分主要分布在6~9分,心率主要分布于65~80之间,每日步数主要分布于5000~8000步,整体规律较为平衡。
Figure 5. Continuous variable data distribution visualization
图5. 连续型变量数据分布可视化图
4. 特征处理和模型特征选择
在建立模型并开始训练之前,首先要对数据进行一定的特征处理以及特征分析,原始数据往往会存在数据格式不一致、包含异常值或缺失值、数据分布不平衡等问题。对于该数据集,使用python中的Pandas库函数经isnull()函数验证可知,该数据集不存在缺失值,现对其他问题进行分析,希望可以为后续的模型建立提供帮助,并希望可以有效提升后续模型的准确性和泛化能力。在本研究中,前文进行数据分析时发现,血压收缩压和舒张压两者之间皮尔逊相关系数较大,不易同时作为特征进行模型训练,故本研究决定删除血压(舒张压)特征变量即Blood_p_l。
4.1. 异常值处理
为查看该数据集异常值的分布情况,本研究通过绘制箱线图的方法进行异常值检测。异常值是指在数据集中该值即异常值与其他观测值之间存在明显偏差,而箱线图则是用来展示数据分布情况的一种统计图表,它能够直观地显示出一组数据的统计特性,以及揭示是否存在异常值。图6为基于特征绘制的箱线图。由图6可知,大部分特征变量都不存在异常值,而存在异常值的变量,其异常值表现出显著偏离数据集主体的趋势。虽然出现异常值可能意味着出现测量误差,但是鉴于该特征变量即心率可能携带有关特定子群体或极端条件下的重要信息,因此本研究决定保留这些异常值。
Figure 6. Box plot
图6. 箱线图
4.2. 特征工程
独热编码多用于处理分类变量,它是一种将分类变量转换为数值变量的数据预处理方法。该种编码方式将分类变量中的类别转换为二进制向量,以便被机器学习算法理解和处理。在该数据集中需要进行独热编码的特征变量为性别、职业、BMI。本研究使用python中Scikit-Learn库的ColumnTransformer类对以上三种分类变量进行处理,并查看独热编码后各分类变量转换的数值结果。
4.3. 特征选择
特征处理完成后,需要对特征进行选择,将选择后的特征用于后续模型训练。本文采用的特征筛选方法是相关系数法,已根据上文中图1所示删除相关性较高的特征,避免多重共线性。此外,了解特征重要性是模型求解与训练前的重要步骤。特征重要性是指,在该数据集中每个特征对模型预测目标变量时的贡献度和重要程度,有助于模型理解其数据结构,发现每个特征所提供的价值,了解特征重要性可以帮助我们在后续的工作中提升模型的性能和泛化能力。图7为该数据集分类特征进行独热编码后的相关特征重要性图,它可以帮助我们理解各个特征变量在模型预测中的重要性,能够以视觉化的形式直观地反映出每个特征对于模型预测结果的影响力。并且可以提升模型的可解释性,对于类似本研究即针对睡眠疾病预测相关的医疗健康领域等涉及高风险决策的领域十分重要。
Figure 7. Feature importance
图7. 特征重要性图
5. 模型求解与验证
本研究选用Adaboost算法,构建了一个用于预测睡眠状况的机器学习模型,该模型可以探究不同特征对目标变量的影响,基于该算法所构建的分类器在处理非线性关系和高维数据方面较为出色,因此该模型可以很好地适用于我们的场景。我们以8:2的比例,将数据集划分为训练集和测试集,利用python3.9编写程序代码从划分的训练集中学习已建立的模型,通过反复迭代并优化模型参数,希望最小化训练误差。然后通过交叉验证的方式评估模型的泛化能力。在模型训练完成后,本研究为了验证模型的有效性和可靠性,在测试集进行验证。
5.1. 模型参数设置
在模型初始化阶段本研究设定了基础分类器为决策树,并且限制其深度为1以避免导致过拟合的发生,设置了该集成学习中弱学习器的数量为100即集成100个弱分类器,算法类型设置为“SAMME”,随机种子random_state设置为42。模型参数设置如表2所示。
Table 2. Parameter settings
表2. 模型参数设置
模型参数 |
值 |
estimator |
DecisionTreeClassifier (max_depth = 1) |
n_estimators |
100 |
algorithm |
‘SAMME’ |
random_state |
42 |
5.2. 模型评价方法
本研究关于评价模型的方法主要包括精准确率(Accuracy)、确率(Precision)、召回率(Recall)以及F1分数(F1-Score),为了直观地反应该模型关于各个类别的分类效果,本研究还提供了混淆矩阵,混淆矩阵可以帮助我们了解模型的真阳性(True Positives, TP)、假阳性(False Positives, FP)、真阴性(True Negatives, TN)和假阴性(False Negatives, FN)。表3为各评价方法的计算公式。
Table 3. Model evaluation method calculation formula
表3. 模型评价方法计算公式
评估指标 |
公式 |
Accuracy |
|
Precision |
|
Recall |
|
F1-Score |
|
其中Accuracy表示分类器正确分类的样本占总样本的比例。Precision表示在所有被分类器预测为正类的样本中,实际为正类的比例。Recall表示在所有实际为正类的样本中,被模型正确预测为正类的比例。F1-Score表示精确率和召回率的调和平均值。
6. 结果
本研究基于kaggle数据库,采用Adaboost算法建立了一种用于预测睡眠障碍的机器学习模型,旨在通过分析个体生理数据和生活习惯等指标,预测患睡眠障碍的情况。该模型于独立测试集中进行测试,其性能评估结果显示,准确率为0.9066、精确率为0.9055、召回率为0.9067、F1分数为0.9058。表4为该模型性能分类报告。由表4可知,该模型在所有类别上的平均预测准确率为0.91即91%,宏平均(Macro Avg)为精确率、召回率、F1分数的无权重平均值,分别为0.88、0.87和0.87,加权平均(weighted avg)为精确率、召回率、F1分数的加权平均值均为0.91,该模型在所有类别中的表现相对均衡,并且整体具有较好的性能。
Table 4. Classification report
表4. 分类报告
|
precision |
recall |
f1-score |
support |
正常 |
0.81 |
0.81 |
0.81 |
16 |
续表
失眠 |
0.95 |
0.98 |
0.97 |
43 |
呼吸暂停 |
0.87 |
0.81 |
0.84 |
16 |
全局性能指标: |
|
|
|
|
accuracy |
|
|
0.91 |
75 |
macro avg |
0.88 |
0.87 |
0.87 |
75 |
weighted avg |
0.91 |
0.91 |
0.91 |
75 |
图8为该模型的混淆矩阵图,混淆矩阵通过比较模型的预测类别与实际类别之间的对应关系,可以直观地反映出模型的性能。该混淆矩阵图对应本研究所建立模型的三分类问题,横坐标表示真实类别,纵坐标表示预测类别,主对角线元素表示在测试集中,实际实例中被正确分类的个数,即实际为no被预测为no的有13个,实际为insomnia被预测为insomnia的有42个,实际为osa被预测为osa的有13个,每行的其余两个元素均为实例被错误分类的个数。
Figure 8. Confusion Matrix
图8. 混淆矩阵
7. 结论
本研究建立的睡眠状况预测模型显示出了较为准确的分类效果,可以良好地反映出患者是否患有睡眠障碍、失眠或患呼吸暂停的状况。证明了模型在该领域的潜在应用价值,反映了Adaboost算法在处理医疗健康数据方面的潜力。实验结果表明,该预测模型对于失眠这一问题,分类器表现较为优越,做到了大多数的实例都被正确分类;而对于正常和睡眠暂停,虽然大部分实例也被正确分类,但仍有一定的误分类情况存在。在今后的研究中应提升对于这两个类别相关数据的优化,合理调节该模型相关特征重要性,以此提升模型的精细识别能力。此外,数据集样本量的限制和人口统计学特征可能会限制模型的泛化能力。因此在未来的研究中,希望能够将大规模数据集的建立与临床实践相结合,推动睡眠监测以及睡眠医学的进步,加快睡眠监测智能化、个性化、便携化的发展。
基金项目
上海市2021年度“科技创新行动计划”科学仪器和化学试剂项目申报指南/仪器共享配套操作与应用技术研究“大型多导睡眠监测仪模块拓展及共享配套应用技术研究”(21142203600)。
NOTES
*第一作者。
#通讯作者。