知足常乐|写给医生的人工智能体验课(三):利用SPSS、R、python建立简单的神经网络( 三 )

<-as.formula(paste("cancer~",paste(n[!n%in%"cancer"],collapse = "+")))
form
fit<-neuralnet(form,data = http://kandian.youth.cn/index/datatrain,hidden = c(3,2),act.fct="logistic",err.fct="ce",linear.output = FALSE)
plot(fit)
neuralnet是构建模型的函数 , 其中hidden = c(3,2)是建立两层隐藏层 , 第一层3个神经元 , 第二层2个神经元 。 act.fct是激活函数 , err.fct是损失函数 , 本案例为二分类输出 , 所以linear.output= FALSE , 可作图查看神经网络结构
知足常乐|写给医生的人工智能体验课(三):利用SPSS、R、python建立简单的神经网络3. 评估模型
#训练集
resulttrain<-compute(fit,datatrain[,1:10])
predtrain<-resulttrain$net.result
predtrain<-ifelse(predtrain>=0.5,1,0)
table(predtrain,datatrain$cancer)
#训练集总准确率:(180+17)/241=83% , 肺癌患者识别准确率17/(17+40)=30%
#测试集
resulttest<-compute(fit,datatest[,1:10])
predtest<-resulttest$net.result
predtest<-ifelse(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行所示 。
知足常乐|写给医生的人工智能体验课(三):利用SPSS、R、python建立简单的神经网络第5-8行代码对sex、BMI这些分类的数据做了哑变量处理 , 对年龄做了标准化 , 最后生成一个新的表格df
知足常乐|写给医生的人工智能体验课(三):利用SPSS、R、python建立简单的神经网络2. 拆分数据集和构建网络
sklearn这个模块是python专用于做机器学习的 , 类似于R里各个机器学习的包的集大成者 。 我们依然像SPSS和R那样 , 把训练集和测试集按照7:3的比例拆分 , 然后用sklearn中的MLPClassifier函数构建神经网络 。 相比R的neuralnet函数 , MLPClassifier函数能调节的参数更多 。 这次我们把激活函数改为relu , 隐藏层结构也进一步复杂 , 看看模型的预测性能有没有提升 。
知足常乐|写给医生的人工智能体验课(三):利用SPSS、R、python建立简单的神经网络3. 评估模型


推荐阅读