查看: 6908|回复: 20

现代分类方法在医学诊断中的应用------基于R的实现

  [复制链接]
论坛徽章:
0
发表于 2012-4-19 23:14 | 显示全部楼层 |阅读模式
          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函数可绘出训练的决策树模型。
                              
>table(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
  
  
            
  
  
  
预测类别
  

  
  
测试集分类结果
  
  
  
训练集分类结果
  

    
真实类别
    
  
Abnormal
  
  
  
Normal
  
  
  
Abnormal
  
  
  
Normal
  

    
Abnormal
    
  
89
  
  
  
16
  
  
  
96
  
  
  
9
  

    
Normal
    
  
13
  
  
  
37
  
  
  
7
  
  
  
43
  
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
  
  
            
  
  
  
预测类别
  

  
  
测试集分类结果
  
  
  
训练集分类结果
  

    
真实类别
    
  
Abnormal
  
  
  
Normal
  
  
  
Abnormal
  
  
  
Normal
  

    
Abnormal
    
  
90
  
  
  
15
  
  
  
98
  
  
  
7
  

    
Normal
    
  
9
  
  
  
41
  
  
  
7
  
  
  
43
  
同时我们可以得到分类过程中变量的重要性,可看出,品位滑脱(grade of spondylolisthesis)是最重要的影响变量。
>barplot(weka.bag$importance)
3.png
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,训练集无判错。
  
  
            
  
  
  
预测类别
  

  
  
测试集分类结果
  
  
  
训练集分类结果
  

    
真实类别
    
  
Abnormal
  
  
  
Normal
  
  
  
Abnormal
  
  
  
Normal
  

    
Abnormal
    
  
93
  
  
  
12
  
  
  
105
  
  
  
0
  

    
Normal
    
  
10
  
  
  
40
  
  
  
0
  
  
  
50
  
Bagging类似,可以输出模型训练过程中得到的变量重要性,大致结果与Bagging类似,品位滑脱(grade of spondylolisthesis)是最重要的影响变量。
>barplot(weka.adab$importance)
ada.png

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
  
  
            
  
  
  
预测类别
  

  
  
测试集分类结果
  
  
  
训练集分类结果
  

    
真实类别
    
  
Abnormal
  
  
  
Normal
  
  
  
Abnormal
  
  
  
Normal
  

    
Abnormal
    
  
92
  
  
  
13
  
  
  
105
  
  
  
0
  

    
Normal
    
  
8
  
  
  
42
  
  
  
0
  
  
  
50
  
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
  
  
  
  
  
预测类别
  

    
真实类别
    
  
Abnormal
  
  
  
Normal
  

    
Abnormal
    
  
90
  
  
  
15
  

    
Normal
    
  
13
  
  
  
37
  
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
  
  
            
  
  
  
预测类别
  

  
  
测试集分类结果
  
  
  
训练集分类结果
  

    
真实类别
    
  
Abnormal
  
  
  
Normal
  
  
  
Abnormal
  
  
  
Normal
  

    
Abnormal
    
  
91
  
  
  
14
  
  
  
105
  
  
  
0
  

    
Normal
    
  
8
  
  
  
42
  
  
  
0
  
  
  
50
  
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。
  
  
            
  
  
  
预测类别
  

  
  
测试集分类结果
  
  
  
训练集分类结果
  

    
真实类别
    
  
Abnormal
  
  
  
Normal
  
  
  
Abnormal
  
  
  
Normal
  

    
Abnormal
    
  
91
  
  
  
14
  
  
  
101
  
  
  
4
  

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

  
  
测试集
  
  
  
训练集
  

    
决策树
    
  
0.18709
  
  
  
0.10322
  

    
Bagging
    
  
0.15484
  
  
  
0.09032
  

    
Adaboost
    
  
0.14193
  
  
  
0
  

    
神经网络
    
  
0.13548
  
  
  
0
  

    
K最近邻方法
    
  
0.18065
  
  
  
-
  

    
随机森林
    
  
0.14193
  
  
  
0
  

    
支持向量机
    
  
0.18065
  
  
  
0.13548
  
4.结语
通过不同的分类方法建立不同的脊椎病变诊断模型,其准确均达到了80%以上,对临床医学上的诊断具有一定的参考价值,在一定程度上可以通过盆腔炎的发病率,骨盆倾斜,腰椎前凸角度,骶骨倾斜,骨盆半径和品位滑脱程度等信息对病人进行诊断,证实了数据挖掘对其他学科的重要意义,数据科学时代即将到来。
另一方面,选择分类模型的过程中需要根据数据集情况尝试运用不同的分类方法,并用交叉验证的方法对模型进行检测,最后选择兼具准确性和稳定性的分类模型,以实现数据的较高利用价值。
回复

使用道具 举报

论坛徽章:
5
R研习者中级
日期:2012-04-29 00:26:34Oracle研习者初级
日期:2012-10-11 01:39:11SAS研习者初级
日期:2012-11-18 23:07:49SAS研习者初级
日期:2013-08-25 13:46:06SAS研习者初级
日期:2013-12-08 12:33:27
发表于 2012-4-20 00:30 | 显示全部楼层
中间那写非常稀疏的地方是什么情况。。。
回复 支持 反对

使用道具 举报

论坛徽章:
6
spss初级
日期:2012-10-11 16:17:06EBS财务徽章
日期:2013-05-09 13:13:47EBS制造徽章
日期:2013-05-09 13:15:37python徽章
日期:2013-05-09 13:21:16Oracle研习者高级
日期:2013-08-25 14:24:54树莓派
日期:2014-09-19 15:22:08
发表于 2012-4-20 00:45 | 显示全部楼层
格式乱了
回复 支持 反对

使用道具 举报

论坛徽章:
0
 楼主| 发表于 2012-4-20 10:00 | 显示全部楼层
clock1314 发表于 2012-4-20 00:30
中间那写非常稀疏的地方是什么情况。。。

一个观测值与预测值的比较.
回复 支持 反对

使用道具 举报

论坛徽章:
0
 楼主| 发表于 2012-4-20 10:01 | 显示全部楼层
cruiser 发表于 2012-4-20 00:45
格式乱了

发现表格都得以图片形式插入。
回复 支持 反对

使用道具 举报

论坛徽章:
6
spss初级
日期:2012-10-11 16:17:06EBS财务徽章
日期:2013-05-09 13:13:47EBS制造徽章
日期:2013-05-09 13:15:37python徽章
日期:2013-05-09 13:21:16Oracle研习者高级
日期:2013-08-25 14:24:54树莓派
日期:2014-09-19 15:22:08
发表于 2012-4-20 10:55 | 显示全部楼层
Au-Yeung 发表于 2012-4-20 10:01
发现表格都得以图片形式插入。

如果无法正确编辑,可以传pdf
回复 支持 反对

使用道具 举报

新浪微博达人勋 adh 实名认证
论坛徽章:
6
R研习者初级
日期:2012-07-18 17:56:36R研习者中级
日期:2013-01-11 14:59:01R研习者中级
日期:2013-06-13 19:02:32机器学习徽章
日期:2015-03-02 18:03:10linux徽章
日期:2016-05-12 12:18:10R研习者中级
日期:2017-12-07 16:03:53
发表于 2012-8-19 02:58 | 显示全部楼层
非常感谢Au-Yeung的分享。我借鉴这些方法在Kyphosis上做了相关对照。
回复 支持 反对

使用道具 举报

论坛徽章:
1
R研习者初级
日期:2012-07-18 17:56:36
发表于 2012-8-20 10:42 | 显示全部楼层
需要copy下来,慢慢吸收。
回复 支持 反对

使用道具 举报

论坛徽章:
0
发表于 2013-3-2 13:29 | 显示全部楼层
谢谢了。。。 我很赞成,继续努力吧
回复 支持 反对

使用道具 举报

新浪微博达人勋 txyw 未实名认证
论坛徽章:
0
发表于 2013-6-3 20:44 | 显示全部楼层
文件在哪?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

 

GMT+8, 2018-9-26 05:39 , Processed in 0.372773 second(s), 62 queries .