赞
踩
基于决策树预测是否患有乳腺癌
1)能够使用R语言基础数据结构与使用流程。
2)能够使用R进行基础的数据统计描述分析。
3)能够使用R进行高级的数据分布图绘制。
4) 能够使用R建立决策树分类模型。
5) 能够计算出决策树和随机森林分类模型的指标并评价。
决策树算法是非常常用的分类算法,其分类思路清晰,简单易懂。同时也是集成学习和随机森林算法的基础。对于决策树算法,其输入是带有标签的数据,输出是一棵决策树。其非叶节点代表的是逻辑判断;叶节点代表的是分类的子集。决策树算法原理为通过训练集数据形成if-then的判断结构。从树的根节点到叶节点的每一条路径构成一个判断规则。我们需要选择合适的特征作为判断节点,可以快速的分类,减少决策树的深度。
在决策树中,目前比较常用的有ID3算法,C4.5算法和Cart算法。不同算法的区别在于选择特征作为判断节点时的数据纯度函数不同。本次实验采用ID3算法。R中的基础包rpart,可进行决策树构建分析。这里基于breast-cancer.data文件,针对irradiat构建决策树模型。
数据集下载地址:https://archive.ics.uci.edu/ml/datasets/Breast+Cancer
该数据集包括286个实例和10列特征,具体的属性
代码示例:
#安装需要使用的包
install.packages(“rpart”) #决策树分析
install.packages(“caret”) #评价模型
install.packages(“rpart.plot”) #绘图
有时提示下载安装出错,可以尝试更换不同的镜像网站:
install.packages(“rpart”,repo="https://mirrors.tuna.tsinghua.edu.cn/CRAN"site) #比如清华镜像网站
载入本案例需要使用的包:
代码示例:
#载入需要使用的包
rm(list=ls())
library(caret)
library(rpart)
library(rpart.plot)
代码示例:
#导入数据
data <- read.table("breast-cancer.data",sep = ",",stringsAsFactors = TRUE,na.strings = "?")
names(data)<- c("irradiat","age","menopause","tumor_size","inv_nodes",
"node_caps","deg_malig","breast","breast_quad","irradiat")#重命名
进行建模前,需要对自变量进行描述性统计分析,分析变量的分布特征,并对数据格式进行处理。
代码示例:
#数据初步统计与处理
colSums(is.na(data)) #检验空值
data$deg_malig <- as.factor(data$deg_malig ) #设为分类变量
data$lane<-as.factor(data$lane) #设为分类变量
summary(data) #数据描述性统计分析
结果:
进行卡方检验:
原假设:irradiat 和 Class 没有任何关联
替代假设: irradiat 和 Class 有任何关联
代码示例:
chisq.test(table(data$irradiat,data$Class))
Pearson's Chi-squared test with Yates' continuity correction
data: table(data$irradiat, data$Class)
X-squared = 9.7806, df = 1, p-value = 0.001764
卡方检验的p值是0.001764,小于0.05,拒绝原假设,认为irradiat 和 Class 有任何关联
将数据分类训练集与测试集,然后以为因变量(irradiat),构建决策树模型:
代码示例:
#划分训练集、测试集
set.seed(150)
ind<-sample(2,nrow(data),replace=T,prob=c(0.7,0.3))
train<-data[ind==1,]
test<-data[ind==2,]
#建立决策树模型
#离散分类(method="class"),分类规则为信息增益(split="information"),交叉验证次数(minsplit)为10次,剪枝率(cp)为0.01
rpart<-rpart(irradiat~.,train,method="class",parms=list(split="information"), control=rpart.control(xval=10,minsplit=10,cp=0.01))
print(rpart)
printcp(rpart)
结果:
结果解释:使用printcp()函数输出模型的复杂性参数(complexity parameter, cp)。该参数可以作为控制树规模的惩罚因子,cp值越大,分裂规模(nsplit)越小,输出参数(rel error)指示了当前分类模型树与空树之间的平均偏差比值。xerror是通过使用交叉验证得到的相对误差,xstd是相对误差的标准差。
将决策树模型可视化:
代码示例:
#决策树结构图
prp(rpart)
结果:
最终获得如图所示的决策树,分类规则使用的变量有8个:inv-nodes,age,tumer_size,node_caps,breast,breast_quad,deg_malig,Class
将决策树模型可视化:
代码示例:
#决策树规则解释
asRules(rpart)
结果:
对前二条规则进行解读:
① inv_nodes=0-2,15-17,
age=40-49,60-69
tumor_size=25-29,30-34,35-39,45-49,5-9,50-54,45-49,5-9,
乳腺癌(irradiat)为yes;
②inv_nodes=0-2,15-17
age=40-49,60-69
tumor_size=25-29,30-34,35-39,45-49,5-9,50-54,
node_caps=no
breast_quad=left_up,right_low
deg_malig=2,3
乳腺癌(irradiat)为yes;
决策模型结果测试集精度测试:
代码示例:
#混淆矩阵
pre.rpart<-predict(rpart,test,type="class")
confusionMatrix(pre.rpart,test$irradiat)
结果:
使用测试集对模型效果进行检验,获取预测结果的混淆矩阵。预测的精确率为75.28%,Sensitivity 为 0.7973 ,Specificity为0.5333,指标表现一般。
本实验基于决策树预测是否患有乳腺癌,成功预测并评价了决策树模型,但是总体情况并不理想,预测的精确率为75.28%,Sensitivity 为 0.7973 ,Specificity为0.5333,指标表现一般。我们应该如何提高决策树的预测正确率是需要值得讨论和研究的。
决策树存在一定的过拟合,过拟合是特征维度过多,模型过于复杂,参数过多,训练数据过少,噪声过多,导致拟合的函数完美的预测训练集,但对新数据的测试集预测结果差。 过度的拟合了训练数据,而没有考虑到泛化能力。我们应该如何避免过拟合问题?首先,rpart()函数可用于生成决策树。print(dtree)和summary(dtree)可用于观测所得模型,此时所得的树可能过大,需要剪枝。可以考虑对决策树进行剪枝。通过 prune 函数对该决策树进行适当的剪枝,防止过拟合,使得树能够较好地反映数据内在的规律并在实际应用中有意义。
可以采用随机森林算法预测。随机森林是一种常用的集成学习算法,基分类器为决策树。该算法的随机性体现在两个方面:①数据集的随机选取:从原始的数据集中采取有放回的抽样,构造子数据集,子数据集的数据量是和原始数据集相同的。不同子数据集的元素可以重复,同一个子数据集中的元素也可以重复。②待选特征的随机选取:与数据集的随机选取类似,随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,之后再在随机选取的特征中选取最优的特征。随机森林由于采用了集成算法,本身精度比大多数单个算法要好,所以准确性高。同时,由于两个随机性的引入,使得随机森林不容易陷入过拟合问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。