当前位置:   article > 正文

python 三分类的哑编码_写给医生的人工智能体验课(三):利用SPSS、R、python建立简单的神经网络...

python library(caret)

之前我们介绍了人工智能和大数据的结合(详情请查看:写给医生的人工智能体验课(一):作为医生,怎么跟进人工智能不落伍?),深度学习的数学模型(详情请查看:写给医生的人工智能体验课(二):用比喻的方式形象讲解神经网络)。

该数据集来自医咖会之前的一篇SPSS教程(SPSS实例教程:二分类Logistic回归)。某呼吸内科医生拟探讨吸烟与肺癌发生之间的关系,开展了一项成组设计的病例对照研究。选择该科室内肺癌患者为病例组,选择医院内其它科室的非肺癌患者为对照组。通过查阅病历、问卷调查的方式收集了病例组和对照组的以下信息:性别、年龄、BMI、COPD病史和是否吸烟。

现在的任务是把344例的数据集拆分为训练集和测试集,建立一个简单的神经网络模型,看看模型的训练效果怎么样。

表1. 肺癌危险因素分析研究的变量与赋值

2f9875957973eb41789fb6def24b6d51.png

表2. 部分原始数据

6d02c1f2ecf7dd96909b6b8ff7fadbdd.png

一.SPSS建模

步骤如下

1.选择分析—神经网络—多层感知器

ff0d783321ca7f4dc6995d54a7c9630f.png

2.变量窗口:要预测的结局变量放在因变量窗口,其他的预测变量根据自身类型放在因子或协变量窗口。连续型变量进入网络时,如果做标准化预处理可能会使模型效果更好。

5e9eb77a374ce5a7067d59938322cd9d.png

3.分区窗口一般是训练样本占70%,检验样本30%。这里软件的翻译可能存在错误,训练、检验、坚持其实分别对应:训练集、验证集、测试集。训练集用于训练模型,找出最佳的权重和偏置。验证集用以确定模型超参数,选出最优模型。测试集仅用于对训练好的最优函数进行性能评估。本案例不存在外部验证集,不需要设置,检验集就等同于测试集。

5025440331f8684fb8eed1872429f11b.png

4.神经网络结构设置我们参照上一课,隐藏层设置1层,共3个神经单元。SPSS只能设置两个隐藏层。隐藏层激活函数选择S型(sigmoid),因为输出是二分类的结果,选择softmax函数会更好。怎么设置网络隐藏层并不固定,更多的需要经验和反复尝试。

7fea84dc5835c299e493c58fff9d4fff.png

5.对于较大的数据集,联机或小批次会加快训练速度。SPSS分析的数据一般都没这么大,默认选项即可。梯度下降是寻找损失函数最小值点的方法,参考上节课内容。

90c85c0624c696be7f8676f2e2d1b8d6.png

6.输出:选择想要了解的内容,输出结果

21d68d9e13a94907a27651b80d53f95d.png

结果解读:个案处理摘要显示了有多少例训练集与检验集。网络信息显示每一层的基本信息。误差函数就是上节课提及的损失函数,这里默认的是交叉熵函数。

b57344a51a50afb63a9f91a6985ea2ef.png

79f13d2a23728b33a8b22f5612bfdde7.png

这张图是神经网络的结构图,因子型变量中的每个分类都是一个输入单元,偏差(偏置)被单独列出来,因为是二分类的模型,所以输出层有两个。神经元之间的连线是权重,线条的粗细代表联系的紧密程度

9f32e8f010dfc1709cb6934acc65c938.png

下表是模型的预测准确率,训练集有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中神经网络初始权重的设置是随机的,所以每次输出的预测结果会有不同。

f1138cf476eaee430824d2ea98ce2b11.png

二.R建模

主要分三部分: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,可作图查看神经网络结构

0bd125daf82ecbe4fdb33bd4a8ada74b.png

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建立的神经网络,这次的建模采用了两层隐藏层。由于模型的复杂度上升,训练集的准确率也得到了提升,然而测试集的准确率却下降了,这就是过拟合的表现。可见即使将模型结构进一步复杂化,神经网络对此类传统的医学表格数据预测性能并不怎么好。

三.python建模

长期关注医咖会的小伙伴应该对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行所示。

6d3cd69e3ecf6c530ff30b97da0be4c8.png

第5-8行代码对sex、BMI这些分类的数据做了哑变量处理,对年龄做了标准化,最后生成一个新的表格df

bb7b4b1084202148900b791099bad40d.png

2. 拆分数据集和构建网络

sklearn这个模块是python专用于做机器学习的,类似于R里各个机器学习的包的集大成者。我们依然像SPSS和R那样,把训练集和测试集按照7:3的比例拆分,然后用sklearn中的MLPClassifier函数构建神经网络。相比R的neuralnet函数,MLPClassifier函数能调节的参数更多。这次我们把激活函数改为relu,隐藏层结构也进一步复杂,看看模型的预测性能有没有提升。

8792e6c139a89928bbc1e28150b8f3bf.png

3. 评估模型

我们这次直接评估模型在测试集的效果,可以看到模型的总体准确率为(73+3)/104=73%;28例肺癌患者中,仅能准确识别3例,准确率为11%,比R的14%效果更差。可见模型结构进一步复杂后,过拟合的情况更明显。在机器学习领域,人们更常用精度、召回率、F1分数等评价模型性能,我们在下一篇文章再继续讲解。

848cfe65803f7979d90470a2120a00c6.png

我们再用logistic回归建模,得出在测试集中的总体准确率为72%,肺癌识别准确率为7%,预测效果略低于神经网络。

958009c4f34b4059a2d4722030f58866.png

总结:本篇文章运用三个软件对同一数据集进行神经网络建模,对于不同软件基础的朋友都能对建模有个大致了解。这种简单的神经网络也算是在人工智能的广义范畴内。但同时我们也可以看到,神经网络虽然听起来高大上,但它对于这种表格数据的预测效果也不见得就很突出,那它为什么还会如此受欢迎呢?下一节课我们将从表格数据转移到图像数据。

后续的内容如下

1. 基于scikit-learn识别导入的图像;

2. 基于tensorflow识别mnist手写数字;

3. 利用inception V3搭建自己的视觉识别模型;

4. 深度解读一篇内镜人工智能的文献。

医咖会最新上线专栏课程《缺失值的处理和常见研究类型的统计分析》!

讲解缺失数据的核心处理方法及SPSS操作,以及病例对照研究和RCT的统计分析思路。

使用电脑,打开医咖会,观看专栏视频:

https://www.mediecogroup.com/zhuanlan/courses/7

79d6bc5a1586e38c1a6c563c5f881fb7.png

关注医咖会,及时获取最新统计教程

点击左下角”,查看全部免费统计教程。或者使用电脑打开网址:http://www.mediecogroup.com/,分类查看全部统计教程

快加小咖个人微信(xys2019ykh),拉你进统计讨论群和众多热爱研究的小伙伴们一起交流学习。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/568550
推荐阅读
相关标签
  

闽ICP备14008679号