基于API 的疾病预测系统数据导入研究
2021-03-25邵荣强龚庆悦
邵荣强,陈 燕,龚庆悦
(1.南京中医药大学人工智能与信息技术学院,江苏南京 210023;2.宜兴市第二人民医院信息科,江苏宜兴 214221)
0 引言
自现代医学诞生以来,由于医学的发展极大地延长了人类的平均寿命,其研究一直吸引着大家的广泛关注,研究者希望通过研究揭示人体的运行规律,对其发病趋势进行预测。但是人体是一个十分复杂的系统,生理、心理和社会因素综合交织在一起使对疾病的预测研究变得非常困难。
机器学习可以通过从历史的行为和数据中分析、学习并找到更好的设计模式,可以解放很多复杂的工作。因此,机器学习已被广泛运用于各生产和科研领域[1-2]。随着大数据时代的到来,医学领域中的海量数据引起了许多学者的关注。机器学习方法,如:神经网络、支持向量机、决策树等方法被广泛应用于疾病预测领域[3-6],它们处理复杂及其大量数据上表现出的优势,解决了许多传统方法的局限性[7-10]。随着新的算法不断出现及各类超参数、业务参数的不断改进,疾病预测模型的准确率和召回率等指标也越来越高[11-13]。因此,相应的疾病预测模型也需要重新训练,模型重建周期也变得越来越短,需要通过提高训练效率以适应模型重建的快节奏。
1 相关工作
为提高疾病预测模型重建效率,近年来一些学者[14-18]针对算法和超参数选择进行研究,但随着研究的深入,训练效率改进越来越逼近天花板;也有学者[19-20]通过研究机器学习的云服务提高训练效率,但医学数据传到外部服务器则不可避免地面临患者隐私泄露问题;还有学者[21]通过海杜普分布式文件系统(Hadoop Distributed File System HDFS)等提升硬件性能的方式提高机器学习效率,但这种方式受到了投入上的限制。
以上方法均未针对数据导入这一环节进行效率提升研究,而数据导入在模型训练过程中不仅是不可避免的流程,而且过程复杂而繁琐,极容易出错。许多研究人员[22-24]采用手工方式导入数据,首先从数据库查询原始医疗数据,再通过数据库管理软件将数据导出为csv 和txt 文件,然后将文件拷贝或通过网络传输到机器学习的服务器。本文采用了程序接口(Application Programming Inter⁃face,API)方式导入数据,优势如下:
(1)API 方式导入数据不受记录数的限制,效率更高。随着医疗信息化的发展,医疗数据也越来越大,通过txt 或csv 文件导入医疗数据让每次操作的数据量受到限制,当数据的记录数超过1 048 576 时,这两种文件类型都无法支持。如果数据集通过人工多次以文件为载体导入,则进一步降低了导出效率。API 方式导入数据不受记录数限制,当收到数据请求,API 服务器可以根据数据量的大小自动分批封装和传送,整个过程无需人工介入,效率更高。
(2)API 导入方式采用轻量级的JSON 格式,出错概率更低。数据集通过文件导入时,受到不同字符编码方式、数据类型等环境因素的影响,导入过程时有失败,同时操作人员对数据集采用人工方式进行文件的复制与传输也进一步加大了数据出错概率。API 导入方式采用轻量级的JSON 格式,JSON 使用完全独立于编程语言的文本格式存储和表示数据,导入时出错概率更低。
(3)API 导入方式降低了审计复杂性。直接通过数据库查询输出为txt 或csv 文件,虽然可以通过数据库日志对操作的动作和导出数据的范围进行审计,但操作过程复杂。API 导入方式可以自动在其服务器中保存调用信息,如:调用数据的人员、时间和所调用数据的范围等,结构化的调用信息更有利于调用的审计。
本研究的创新之处:使用API 的方式导入数据,而不是传统的txt 或csv 等文件导入方式,以提高数据导入效率,突破文件格式对数据量的限制,避免因字符编码方式或数据类型等因素引起的意外错误,降低审计复杂性并提高数据安全性。
2 API 数据导入设计
为提高数据获取效率,本研究的临床数据集不再以文件为载体进行导入导出,而是以API 接口的方式进行数据传输。试点医院的临床信息系统(Clinical Information Sys⁃tem,CIS)是通过C#开发的,而疾病预测服务器所用的语言是Python,因此它们之间的数据交互需要跨编程语言。而目前最常用的跨编程语言的远程调用技术是WebSer⁃vice[25]。根据应用场景不同又可分为安全性要求较高的简单对象访问协议(Simple Object Access Protocol,SOAP)服务[26]和轻量级、易访问、可扩展性为特征的表述性状态转移(Representational State Transfer,RESTful)服务[27]。
本文研究中对数据库的访问需要有权限控制及审计,因此数据库前置机则采用了SOAP WebService 架构。SOAP 是交换数据的一种协议规范,是一种基于可扩展标记语言(Extensible Markup Language,XML)的协议,它用于在Web 上交换固化和结构化信息[28]。从网络和安全角度看,它有着隔离数据库服务器的作用,同时可以在前置机上记录详细的访问日志并用于审计。
布置在隔离区(Demilitarized Zone,DMZ)的微服务RESTful 服务器用于对外发布细颗粒度JSON 数据,需要达到轻便、简单的效果,故此服务器采用了基于RESTful WebService 的微服务架构。RESTful 是一种网络应用程序的设计风格和开发方式,可以使用XML 格式定义或JSON格式定义。RESTful 适用于业务数据交互接口的场景,实现第三方调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。如图1 所示,由客户端向疾病预测服务器发起疾病预测模型请求,数据申请路径是:疾病预测服务器、RESTful API 服务器、SOAP API 前置机、训练/预测Data 集,数据返回路径则是从训练/预测Data、SOAP API前置机、RESTful API 服务器、疾病预测服务器,后者完成训练后保存疾病预测模型。
Fig.1 Disease prediction data flow Diagram图1 疾病预测数据流图
3 系统开发与实现
根据API 数据导入设计,疾病预测系统的API 数据导入涉及SOAP API 服务和RESTful API 服务实现。
3.1 SOAP API 服务实现
医疗数据涉及患者隐私,从安全角度而言,第三方应用不能直接对数据库进行操作,而且调用数据的条件受到严格限制,同时调用的动作需要记录在日志中,以备将来审计。因此,数据库前置机采用了SOAP WebService 架构。
通过SOAP 这个严格定义的信息交换协议,在Web Service 中将远程调用与返回封装成机器可读的格式化数据[29]。SOAP 数据使用XML 数据格式并定义了一整套适合医学的标签,以描述调用的出错信息、返回值、参数和远程过程等[30],所有数据均需按照发布的参数要求进行调用,从而保障医疗数据调用的权限与数据范围。考虑到数据安全性需求增长,本研究增加了对Web 服务描述语言(Web Service Description Language,WSDL)的支持。WSDL也遵循XML 格式,用来描述哪个服务器提供什么服务,如何找到它,以及该服务使用怎样的接口规范[31]。因此,使用Web Service 的过程可转换成获得该服务的WSDL 描述,根据WSDL 构造一条格式化的SOAP 请求并发送给服务器,然后接收一条同样SOAP 格式的应答,最后根据先前的WSDL 解码数据。请求和应答使用HTTP 或HTTPS 协议传输,发送请求使用POST 方法[32]。
SOAP WebService 的整个实现流程如图2 所示。①RESTful API 服务器需要调用一个数据服务,以通用描述发现和集成注册服务器(Universal Description Discovery and Integration Registry,UDDI Registry)询问哪个服务器可以提供该服务;②UDDI Registry 返回了一个消息,提示SOAP API 服务器能提供这样的数据服务;③RESTful API服务器访问SOAP API 服务器,询问确切的调用方法;④SOAP API 服务器得到RESTful API 服务器提出的请求后,将一个WSDL 描述的XML 文档返回给RESTful API 服务器,在文档中记录其能提供的各类方法接口;⑤RESTful API 服务器了解到这些后,将这些XML 的接口方法封装成为HTTP 请求,发给SOAP API 服务器,这些封装方式采用标准的SOAP 方式,实质是满足HTTP/HTTPS 协议的一些SOAP 的报文消息[33];⑥SOAP API 服务器回应的也是HTTP/HTTPS 协议的SOAP 包,这样双方的请求—响应完全畅通。
Fig.2 SOAP WebService图2 SOAP WebService
3.2 RESTful API 服务实现
考虑到疾病预测系统将来可能推广到各病种预测,为保障RESTful API 是一个通用的、可重用的架构模式,本文RESTful API 研究遵循模型—视图—控制器模式(Model View Controller,MVC),如图3 所示。它是用一种业务数据、逻辑、界面显示分离的方法组织代码,将疾病预测业务逻辑封装到一个部件里,在改进和个性化定制界面及用户交互的同时,业务逻辑不需要重新编写[34]。它将软件系统分为3 个基本部分[34]:
(1)模型(Model)。负责存储医院信息系统的医疗数据、封装应用程序状态和应用程序功能、响应状态查询和通知视图改变。
(2)视图(View)。将医疗信息输出给用户,用于模型解释、模型请求更新、给控制器发送用户输入,以及允许控制器选择视图。在研究中输出为JSON 格式的数据,经解析和格式化后可以视图形式呈现。
(3)控制器(Controller)。处理用户输入信息,负责定义应用程序行为、用户动作映射或模型更新和选择响应的视图。从url 读取相关参数,控制用户输入,并向模型发送数据,是RESTful API 中处理用户交互的部分。
Fig.3 MVC architecture of RESTful API图3 RESTful API 的MVC 体系结构
MVC 在具体开发时的应用如下:
(1)本研究项目对应一个application 文件夹,RESTful API 对应application 下的一个api 目录,其包含MVC 架构,API 有多个controller 和model,controller 保存疾病预测业务的逻辑,将疾病预测数据保存在model 中。
(2)为做好版本控制,在controller 中建v1 目录,用于控制疾病预测系统的各版本,在v1 下创建UserPermission.php 控制器,负责管理与用户交互控制。
(3)在model 下创建DataService.php,与医疗数据增删改查相关操作均通过model 完成。
(4)控制层和model 层建好后,就可以建立路由规则。在目录route 下进行配置,配置的url 及相关参数即是客户端调用数据的规范。
疾病预测服务器在调用医疗数据时,通过url 进行访问,route 解析配置中的参数,产生input events 事件,通过View 调用相应controller 中的方法,后者使用对应model 中的统一数据调用函数访问SOAP 的服务,获取数据后将XML 格式转换成JSON 格式并返回给url 调用方。
4 系统测试与结果分析
本文通过多个不同记录数的数据集测试API 接口从数据库向疾病预测服务器导入数据的速度。SOAP API 服务器和RESTful API 服务器的硬件配置均为16 核的双处理器和16G 内存的虚拟机。测试用的数据集均是16 个字段,一个循环共做100 个数据集导入测试。第一个数据集有1 000 条记录,第二个数据集有2 000 条记录,以1 000条递增,循环100 次,最后一次导入数据集为100 000 条记录。根据数据集的记录数与耗时画成散点图,如图4 所示,耗时从1.214 0s 到40.431 5s 不等。在导出并导入第42 个数据集时,服务器自动启动CPU 四核运行,CPU 会将处理任务分成4 份分别交给4 个核心处理,处理速度也大幅提高;在导出并导入第62 个数据集时,服务器自动启动CPU 十六核运行,处理速度是最初的近16 倍;为保证实验的可重复性,循环测试实验共做了10 次,绘制的图形大体一致。可以看出,通过API 导入医疗数据,在10 万条数据以内,随着数据量的增大,所耗时间并不是线性增长,系统会根据任务量自动分配硬件资源以保障导入速率。取每次循环中最后一个数据集(100 000 条记录的数据集)的导入时间,10 次平均耗时6.705s。对比文件导入方式,数据库仅将100 000 条记录的数据集导出到csv 文件,10 次测试平均用时358.213s。经计算,前者速度是后者的53 倍以上。10 次实验通过API 接口共导入1 000 个数据集,无一出错,也体现了API 导入数据的稳定性。通过API 调用1 000 个数据集的动作与调用数据的范围均可自动记录于数据库中。
Fig.4 Time consuming scatter diagram of API importing dataset图4 API 导入数据集耗时散点图
5 结语
随着信息技术在医疗领域的广泛应用,医疗数据的质与量将不断提升,疾病预测模型也需要用更多、更新、质量更高的数据进行不断优化。为简化医疗数据导入步骤并提高导入效率,本文使用API 的方式导入数据,而不是传统的txt 或csv 等文件导入方式。研究结果表明,基于SOAP 和RESTful API 微服务的数据导入方式,提高了数据导入速度,避免了因字符编码方式引起的意外错误,降低了审计的复杂度,并提高了数据安全性。
同时,本文还存在一些不足:整个研究尚未经过上百万条数据的考验,随着数据量的进一步增大,通过API 接口方式导入数据的优势是进一步扩大还是减小,有待验证;随着应用的推广,业务的多并发也是一项新的挑战。本研究实施周期偏短,希望通过系统的持续性改进,以促进机器学习在疾病预测中发挥更大作用。