赞
踩
之前我们介绍了人工智能和大数据的结合(详情请查看:写给医生的人工智能体验课(一):作为医生,怎么跟进人工智能不落伍?),深度学习的数学模型(详情请查看:写给医生的人工智能体验课(二):用比喻的方式形象讲解神经网络)。
该数据集来自医咖会之前的一篇SPSS教程(SPSS实例教程:二分类Logistic回归)。某呼吸内科医生拟探讨吸烟与肺癌发生之间的关系,开展了一项成组设计的病例对照研究。选择该科室内肺癌患者为病例组,选择医院内其它科室的非肺癌患者为对照组。通过查阅病历、问卷调查的方式收集了病例组和对照组的以下信息:性别、年龄、BMI、COPD病史和是否吸烟。
现在的任务是把344例的数据集拆分为训练集和测试集,建立一个简单的神经网络模型,看看模型的训练效果怎么样。
表1. 肺癌危险因素分析研究的变量与赋值
表2. 部分原始数据
步骤如下
1.选择分析—神经网络—多层感知器
2.变量窗口:要预测的结局变量放在因变量窗口,其他的预测变量根据自身类型放在因子或协变量窗口。连续型变量进入网络时,如果做标准化预处理可能会使模型效果更好。
3.分区窗口:一般是训练样本占70%,检验样本30%。这里软件的翻译可能存在错误,训练、检验、坚持其实分别对应:训练集、验证集、测试集。训练集用于训练模型,找出最佳的权重和偏置。验证集用以确定模型超参数,选出最优模型。测试集仅用于对训练好的最优函数进行性能评估。本案例不存在外部验证集,不需要设置,检验集就等同于测试集。
4.神经网络结构设置:我们参照上一课,隐藏层设置1层,共3个神经单元。SPSS只能设置两个隐藏层。隐藏层激活函数选择S型(sigmoid),因为输出是二分类的结果,选择softmax函数会更好。怎么设置网络隐藏层并不固定,更多的需要经验和反复尝试。
5.对于较大的数据集,联机或小批次会加快训练速度。SPSS分析的数据一般都没这么大,默认选项即可。梯度下降是寻找损失函数最小值点的方法,参考上节课内容。
6.输出:选择想要了解的内容,输出结果
结果解读:个案处理摘要显示了有多少例训练集与检验集。网络信息显示每一层的基本信息。误差函数就是上节课提及的损失函数,这里默认的是交叉熵函数。
这张图是神经网络的结构图,因子型变量中的每个分类都是一个输入单元,偏差(偏置)被单独列出来,因为是二分类的模型,所以输出层有两个。神经元之间的连线是权重,线条的粗细代表联系的紧密程度
下表是模型的预测准确率,训练集有173例非肺癌患者,模型成功预测了165例,准确率为95.4%;但是,模型仅仅能辨认出62例肺癌患者中的6例,准确率为9.7%;训练集总准确率为(165+6)/235=72.8%。同理,检验集的总准确率为80.7%,肺癌患者的准确率为13%。
由此可见,模型虽然表面上看总体准确率还可以,但是对于肺癌患者的预测能力很低,这种模型对临床应用没太大帮助,效果也不一定比传统的logistic回归好。大家有兴趣可以参考医咖会之前的SPSS教程:多项测量指标的ROC曲线分析,对比两种模型效果。
产生这个现象的原因可能有:1.样本不均衡,344例患者中肺癌患者数只有85例,远低于非肺癌患者;2.预测变量太少,或预测变量不能反映因变量。譬如如果造成患者是否患肺癌的最主要原因是某个基因的改变,但是数据集没有这个变量,那模型预测效果肯定不好;3.模型参数没有设置好。
正如大多数临床研究一样,原因1和2都是很难补救的,那下一步我们尝试用R和python建立更复杂的神经网络模型,看看预测效果有没有变好。值得注意的是,SPSS中神经网络初始权重的设置是随机的,所以每次输出的预测结果会有不同。
主要分三部分:1.数据预处理,包括标准化和哑变量处理;2.拆分数据集和构建网络;3.评估模型。这里对代码不做详细讲解,请大家用电脑跑一遍,会有更深刻的印象。为何要做数据标准化和哑变量处理,请查看医咖会既往教程。
1. 数据预处理
#加载包
library(caret)
library(MASS)
library(neuralnet)
#设置工作路径
setwd("F:/学习笔记")#代码和数据都在同一文件夹,输入自己的文件夹路径
#载入数据
datann
str(datann)
#对年龄进行Z-score标准化
datann$age
#对因子变量进行哑变量处理
dummies
datadmy
datadmy$age
#建立因变量
datadmy$cancer
table(datadmy$cancer)
2. 拆分数据集和构建网络
set.seed(123)
trainIndex
datatrain
datatest
#构建神经网络
n
form
form
fit
plot(fit)
neuralnet是构建模型的函数,其中hidden = c(3,2)是建立两层隐藏层,第一层3个神经元,第二层2个神经元。act.fct是激活函数,err.fct是损失函数,本案例为二分类输出,所以linear.output= FALSE,可作图查看神经网络结构
3. 评估模型
#训练集
resulttrain
predtrain
predtrain=0.5,1,0)
table(predtrain,datatrain$cancer)
#训练集总准确率:(180+17)/241=83%,肺癌患者识别准确率17/(17+40)=30%
#测试集
resulttest
predtest
predtest=0.5,1,0)
table(predtest,datatest$cancer)
#测试集总准确率:(71+4)/103=73%,肺癌患者识别准确率4/(24+4)+16=14%
不同于刚才SPSS建立的神经网络,这次的建模采用了两层隐藏层。由于模型的复杂度上升,训练集的准确率也得到了提升,然而测试集的准确率却下降了,这就是过拟合的表现。可见即使将模型结构进一步复杂化,神经网络对此类传统的医学表格数据预测性能并不怎么好。
长期关注医咖会的小伙伴应该对SPSS耳熟能详,甚至对R也精通,但对于python就可能有点陌生了,后者在医学统计领域流行程度不如R。R和python在机器学习领域都很擅长,用起来有很多相通的地方。但在深度学习领域里,因为python能更方便地调用诸如tensorflow、PyTorch等深度学习框架,所以python的优势更明显。
后面的python代码将用Jupyter Notebook展开,如果你还没有安装python环境,直接安装anconda就好了。如何安装和使用,网上有很多教程。和R一样,python建模也是三部分:1.数据预处理;2.拆分数据集和构建网络;3.评估模型。
运行的时候,请把ipynb代码文件和pythondata文件放在同一文件夹下。
1. 数据预处理
先载入numpy和pandas两个模块,它们的概念类似于R包。为了后续的哑变量设置方便一点,我把表格中的数字转化成了字符,如第4行所示。
第5-8行代码对sex、BMI这些分类的数据做了哑变量处理,对年龄做了标准化,最后生成一个新的表格df
2. 拆分数据集和构建网络
sklearn这个模块是python专用于做机器学习的,类似于R里各个机器学习的包的集大成者。我们依然像SPSS和R那样,把训练集和测试集按照7:3的比例拆分,然后用sklearn中的MLPClassifier函数构建神经网络。相比R的neuralnet函数,MLPClassifier函数能调节的参数更多。这次我们把激活函数改为relu,隐藏层结构也进一步复杂,看看模型的预测性能有没有提升。
3. 评估模型
我们这次直接评估模型在测试集的效果,可以看到模型的总体准确率为(73+3)/104=73%;28例肺癌患者中,仅能准确识别3例,准确率为11%,比R的14%效果更差。可见模型结构进一步复杂后,过拟合的情况更明显。在机器学习领域,人们更常用精度、召回率、F1分数等评价模型性能,我们在下一篇文章再继续讲解。
我们再用logistic回归建模,得出在测试集中的总体准确率为72%,肺癌识别准确率为7%,预测效果略低于神经网络。
总结:本篇文章运用三个软件对同一数据集进行神经网络建模,对于不同软件基础的朋友都能对建模有个大致了解。这种简单的神经网络也算是在人工智能的广义范畴内。但同时我们也可以看到,神经网络虽然听起来高大上,但它对于这种表格数据的预测效果也不见得就很突出,那它为什么还会如此受欢迎呢?下一节课我们将从表格数据转移到图像数据。
后续的内容如下:
1. 基于scikit-learn识别导入的图像;
2. 基于tensorflow识别mnist手写数字;
3. 利用inception V3搭建自己的视觉识别模型;
4. 深度解读一篇内镜人工智能的文献。
医咖会最新上线专栏课程《缺失值的处理和常见研究类型的统计分析》!
讲解缺失数据的核心处理方法及SPSS操作,以及病例对照研究和RCT的统计分析思路。
使用电脑,打开医咖会,观看专栏视频:
https://www.mediecogroup.com/zhuanlan/courses/7
关注医咖会,及时获取最新统计教程
点击左下角“”,查看全部免费统计教程。或者使用电脑打开网址:http://www.mediecogroup.com/,分类查看全部统计教程。
快加小咖个人微信(xys2019ykh),拉你进统计讨论群和众多热爱研究的小伙伴们一起交流学习。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。