R语言实现--分类法在医学诊断中的应用_r语言分词 医学字典_blacklee123的博客-程序员秘密

技术标签: R learning  

1.引言

随着统计科学的日益发展,其对其他学科的渗透作用日益增强,数据分析方法在医学、生物学、社会学等各个学科中得到了广泛的应用,本文试图对收集到的某个临床医学数据运用决策树、神经网络、支持向量机、随机森林等各种现代分类方法进行分析,以佐证数据挖掘对其他学科的重要意义;另一方面,就各种现代分类方法的实际效果进行对比。

笔者从网上收集到关于某个脊椎病变的临床医学数据,该数据集为真实公开的非人造数据,公布地址为:http://archive.ics.uci.edu/ml/datasets/Vertebral+Column。该数据集记录了病人的骨盆和形状位置特征,分别为盆腔炎的发病率,骨盆倾斜,腰椎前凸角度,骶骨倾斜,骨盆半径和品位滑脱(pelvic incidence, pelvic tilt, lumbar lordosis angle,sacral slope,pelvic radius and grade of spondylolisthesis),均为连续型变量。因变量为分类变量,用于甄别病人正常与不正常(Normal &Abnormal)。全数据集共包含310个样本,信息完整,无缺失值。

>weka2C<-read.csv("F:\\column_2C_weka.csv",header=TRUE)

>summary(weka2C)

2.现代分类方法分析

通过对数据集的观察,前210位病人均被检测为不正常(Abnormal),后100位病人被检测为正常(Normal)。为方便对模型效果进行评价并对不同的模型进行对比,本文将从两个群体中各随机抽取一半的样本作为训练集,另一半作为测试集。

>set.seed(2)

>samp<-c(sample(1:210,105),sample(211:310,50))

2.1 决策树算法

决策树是一种逼近离散函数值的典型分类算法,对于非离散变量,将连续型数据离散化同样可以进行决策树分析。决策树的本质是利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。以下就运用决策树算法对原始临床数据进行分析。

>library(rpart)

>weka2C.rp<-rpart(class2~.,weka2C[samp,])

>plot(weka2C.rp,branch=1,margin=0.2,main="ClassificationTree")

>text(weka2C.rp,col="blue")

通过Plot函数可绘出训练的决策树模型。

                            



<spanstyle="mso-bidi-font-family: Calibri; mso-bidi-theme-font:minor-latin;" p=""

>tabe(weka2C$class2[-samp],predict(weka2C.rp,weka2C[-samp,],type="class"))





>table(weka2C$class2[samp],predict(weka2C.rp,weka2C[samp,],type="class"))

通过的得到的决策树模型对测试集和训练集进行分类得到以下结果,测试集判错率为0.18709,训练集的判错率为0.10322。

2.2 bagging

Bagging利用了自助法(bootstrap)放回抽样。它对训练样本做许多次(比如k次)放回抽样,每次抽取和样本量同样的观测值,于是产生k个不同的样本。然后,对每个样本生成一个决策树。这样,每个树都对一个新的观测值产生一个预测,由这些树的分类结果的多数(“投票”)产生bagging的分类。

>library(adabag)

>ibrary(rpart)

>weka.bag=bagging(class2~.,data=weka2C[samp,],mfinal=25,control=rpart.control(maxdepth=5))

>weka.pred=predict.bagging(weka.bag,newdata=weka2C[-samp,])

>weka.pred[-1]

>weka.predt=predict.bagging(weka.bag,newdata=weka2C[samp,])

>weka.predt[-1]

最终得到bagging分类结果,其测试集判错率为0.15484,训练集判错率为0.09032。



同时我们可以得到分类过程中变量的重要性,可看出,品位滑脱(grade of spondylolisthesis)是最重要的影响变量。

>barplot(weka.bag$importance)



2.3 Adaboost

Adaboost是一种迭代分类算法,不断地通过加权再抽样改进分类器,每一次迭代时都针对前一个分类器对某些观测值的误分缺陷加以修正,通常是在(放回)抽取样本时对那些误分的观测值增加权重(相当于对正确分类的减少权重),这样就形成一个新的分类器进入下一轮迭代。在每轮迭代时都对这一轮产生的分类器给出错误率,最终结果由各个阶段的分类器的按照错误率加权投票产生。

以下通过Adaboost对临床数据集进行分析:

>library(mlbench)

>library(adabag)

>library(rpart)

>weka.adab=boosting(class2~.,data=weka2C[samp,],mfinal=15,control=rpart.control(maxdepth=5)

>weka.pred<-predict.boosting(weka.adab,newdata=weka2C[-samp,])

>weka.pred[-1]

>weka.predt<-predict.boosting(weka.adab,newdata=weka2C[samp,])

>weka.predt[-1]

得到模型对数据集的分类情况,测试集的判错率为0.14193,训练集无判错。



与Bagging类似,可以输出模型训练过程中得到的变量重要性,大致结果与Bagging类似,品位滑脱(grade of spondylolisthesis)是最重要的影响变量。

>barplot(weka.adab$importance)

2.4 神经网络算法

人工神经网络(ArtificialNeural Networks)是对自然的神经网络的模仿;它可以有效地解决很复杂的有大量互相相关变量的回归和分类问题,我们同样可以用之建立脊椎病变临床数据集的分类模型。

>library(nnet)

>weka.nn1=nnet(class2~.,data=weka2C,subset=samp,size=10,rang=0.1,decay=5e-4,maxit=1000)

>table(weka2C$class2[-samp],predict(weka.nn1,weka2C[-samp,],type="class"))

>table(weka2C$class2[samp],predict(weka.nn1,weka2C[samp,],type="class"))

类似的,利用训练得到的神经网络模型对数据集重新进行分类,测试集判错率为0.13548。



2.5 k最近邻方法

K最近邻方法是经典的分类算法,其基本算法思想为以待测样本的k个最近距离的样本点的所属类别进行投票决定待分类样本点的类别。

>library(kknn)

>weka.knn<-kknn(class2~.,k=20,weka2C[samp,],weka2C[-samp,],distance=1,kernel="triangular")

>summary(weka.knn)

>fit<-fitted(weka.knn)

>table(weka2C[-samp,]$class2,fit)

用k最邻近方法得到的预测类别结果显示判错率为0.18065。



2.6 随机森林方法

在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。随机森林的重要优点是可以解决多变量样本不足的问题,尽管此次临床数据样本足够,可依然可以尝试用随机森林进行分类。

>library(randomForest)

>weka.rf=randomForest(class2~.,data=weka2C[samp,],importance=TRUE,proximity=TRUE)

>rf.pre<-

>table(weka2C[-samp,]$class2,predict(weka.rf,weka2C[-samp,]))

>table(weka2C[samp,]$class2,predict(weka.rf,weka2C[samp,])

通过得到的随机森林模型对测试集和训练集进行分类,测试集判错率为0.14193。



2.7 支持向量机

支持向量机是另一种现代分类方法,用支持向量机脊椎病变临床数据集进行分析基于R的实现代码如下:

>library(class)

>library(e1071)

>model<-svm(class2~.,data=weka2C[samp,],kernal="sigmoid")

>table(pred.train<-fitted(model),weka2C[samp,]$class2)

>table(predict(model,weka2C[-samp,-7]),weka2C[-samp,]$class2)

用得到模型对数据集进行分类,测试集判错率为0.18065,训练集判错率为0.13548。



3.现代分类方法效果对比

为对以上的现代分类方法分类效果进行评价,重新对各个模型的预测情况进行整合。从每个模型的分类效果可以看出,Adaboost、神经网络和随机森林分类效果相对较好,测试集的准确率达到了85%以上。决策树、K最邻近方法、支持向量机的分类效果最差,但准确率也达到了80%以上,具有应用的价值。



4.结语

通过不同的分类方法建立不同的脊椎病变诊断模型,其准确均达到了80%以上,对临床医学上的诊断具有一定的参考价值,在一定程度上可以通过盆腔炎的发病率,骨盆倾斜,腰椎前凸角度,骶骨倾斜,骨盆半径和品位滑脱程度等信息对病人进行诊断,证实了数据挖掘对其他学科的重要意义,数据科学时代即将到来。

另一方面,选择分类模型的过程中需要根据数据集情况尝试运用不同的分类方法,并用交叉验证的方法对模型进行检测,最后选择兼具准确性和稳定性的分类模型,以实现数据的最高利用价值。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/blacklee123/article/details/18088977

智能推荐

Linux内核:驱动程序_驱动中内核桥_阿拉沙发的博客-程序员秘密

本文译自Linux.orgDevynCJohnson的系列文章《Linux内核》,本篇链接:http://www.linux.org/threads/the-linux-kernel-drivers.4205/,转载请注明出处及原作者。 在上一篇文章Linux内核:源代码中我们探讨了源代码的组成结构以及各个部分的功能,今天我们来介绍一下Linux的驱动。驱动是使内核能够与硬件或协议进行通信或控制的程

HTML5学习(二)---音频_退休的程序员的博客-程序员秘密

参考html5教程地址:http://www.w3school.com.cn/html5/html_5_audio.asp 标签的属性属性值描述 autoplay 属性" href="http://www.w3school.com.cn/html5/att_audio_autoplay.asp">autoplayautoplay如果出现该属性,则音频在就绪后马上播放

51_剑指offer_java_数组中的逆序对_Longtermevolution的博客-程序员秘密

目录题目描述测试用例题目考点解题思路参考解题归并排序题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如数组{7, 5, 6, 4}中,一共存在5个逆序对,分别是(7, 6)、(7, 5)、(7, 4)、(6, 4)、(5, 4)。测试用例功能测试(输入未经排序的...

go语言-空结构体/ chan struct{}_西京刀客的博客-程序员秘密

chan struct{}通过消息来共享数据是golang的一种设计哲学,channel则是这种哲理的体现。

Vue中引入Echarts_洛一一珞的博客-程序员秘密

1、npm安装Echartsnpm install echarts --save运行程序报错卸载并降低Echarts版本npm install [email protected] --save2、应用&lt;!-- 容器 --&gt;&lt;div style="width:30%;height:10%" ref="chart"&gt;&lt;/div&gt;&lt;script&gt;let Echarts = require("echarts/lib/echarts");.

Objective-c:数据类型_Hierarch_Lee的博客-程序员秘密

OC的数值类型,主要分为2种:typedef类型和对象类型;以常用数据类型为例,C和OC数值类型的对比如下:NSValue数值对象,用于复杂数据类型的对象化封装,如结构体;NSValue 对一般数据的初始化NSRect rect = NSMakeRect(0, 0, 20, 20);// 对象化封装NSValue *value = [ NSValue valueWithBytes:&re

随便推点

西门子1200PLC控制加KPT1200触摸屏,污水处理厂自控项目实例,含一台200SMART200加触摸屏泵站程序画面_「已注销」的博客-程序员秘密

西门子1200PLC控制加KPT1200触摸屏,污水处理厂自控项目实例,含一台200SMART200加触摸屏泵站程序画面。应用包括:西门子触摸屏KTP1200,485通讯,PID控制等等。改建成已运行项目,所有应用均经过实际验证。内涵全套电气控制图纸。

Oracle---nvl 函数_自强不息zqbx的博客-程序员秘密

一NVL函数是一个空值转换函数NVL(表达式1,表达式2)如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值。该函数的目的是把一个空值(null)转换成一个实际的值。其表达式的值可以是数字型、字符型和日期型。但是表达式1和表达式2的数据类型必须为同一个类型。对数字型: NVL( comm,0);对字符型 NVL( TO_CHAR(comm), 'N

基于条件随机场的命名实体识别_lilong117194的博客-程序员秘密

我们知道HMM将分词作为字标注问题来解决,其中有两条独立性假设:一个是输出观察值之间严格独立,二是状态的转移过程中当前状态只与前一个状态有关(一阶马尔可夫型)。...

SQL Server 2005各版本区别_双鱼星星的博客-程序员秘密

SQL2005 分五个版本,如下所列, 1.Enterprise(企业版), 2.Development(开发版), 3.Workgroup,(工作群版) 4.Standard,(标准版) 5.Express.(简易版) 这几个版本,我们究竟应该使用哪一版呢? 这是许多初学SQL2005的人最常问的问题。 我简单的比较一下 Enterprise, Developme

IntellJ IDEA的安装及配置_一只盒子的博客-程序员秘密

IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。IntellJ IDEA 安装1. 首先点击下面链接进入官网http://www.jetbrains.com/2. 进入后就可以直接看到一个IJ的图标直接点击3. 然后再点DOWNLOAD4.

curl模拟GET/POST请求、ab压力测试_curl 压测_liuyh73的博客-程序员秘密

curl在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具。 常见参数介绍:-A/--user-agent &amp;amp;lt;string&amp;amp;gt; 设置用户代理发送给服务器-b/--cookie &amp;amp;lt;name=string/file&amp;amp;gt; ...