本章目的:基于一组预测变量预测一个分类结果

(如:根据关键词、图像、来源等判断一份邮件是否是病毒邮件)

本章用到的package:

#rpart rpart.plot party 实现决策树模型及其可视化
#randomForest包拟合随机森林
#e1071包构造支持向量机
#基本函数glm实现逻辑回归

library(rpart)
library(rpart.plot)
library(party)
library(randomForest)
library(e1071)

 本章数据来源:UCI机器学习数据库中威斯康星州乳腺癌数据

目的:根据组织细胞针抽吸活检所反映的特征,来判断备件沿着是否患有乳腺癌 

#数据准备

loc <- "http://archive.ics.uci.edu/ml/machine-learning-databases/"
ds <- 'breast-cancer-wisconsin/breast-cancer-wisconsin.data'
url <- paste(loc,ds,sep="")
breast <- read.table(url,sep=",",header=FALSE,na.strings="?")
names(breast) <- c("ID","clumpThickness","sizeUniformity",
                   "shapeUniformity","maginalAshesion",
                   "singleEpithelialCellSize","bareNuclei",
                   "blandChromatin","normalNucleoli","mitosis","class")

df <- breast[-1]  #去掉ID列
df$class <- factor(df$class,levels = c(2,4),
                   labels = c("benign","malignant")) #良性 恶性
str(df)
set.seed(1234)
#从699行中随机取489行用做训练集df.train,train为提取的行数号
train <- sample(nrow(df),0.7*nrow(df)) 
str(train)
df.train <- df[train,]
df.validate <- df[-train,]
table(df.train$class)
table(df.validate$class)

17.2 逻辑回归

#使用glm()进行逻辑回归
fit.logit <- glm(class~.,data = df.train,family = binomial())
summary(fit.logit)
prob <- predict(fit.logit,newdata =df.validate, type = "response" )
logit.pred <- factor(prob>0.5,levels = c(FALSE,TRUE),
                     labels = c("benign","malignant"))
logit.perf <- table(df.validate$class,logit.pred,
                    dnn = c("actual","predicted"))
logit.perf

17.3 决策树

17.3.1 经典决策树

#使用rpart()函数创建分类决策树
library(rpart)
set.seed(1234)
#生成树
dtree <- rpart(class~.,data=df.train,method = "class",
               parms = list(split="information"))
dtree$cptable

#CP                       nsplit    rel error          xerror             xstd            
#1 0.81764706      0          1.00000000     1.0000000    0.06194645
#2 0.04117647      1          0.18235294     0.1823529    0.03169642
#3 0.01764706      3          0.10000000     0.1588235    0.02970979
#4 0.01000000      4          0.08235294     0.1235294    0.02637116

plotcp(dtree)

#根据复杂度参数减掉最不重要的枝
#依据dtree$cptable可以发现xerror最小值为0.1235294,对应xstd为0.02637116
#则最优的树为xerror在0.124±0.0264(0.0976,0.1504)之间,且值最小的树(对应nsplit=4 CP=0.01的树)
dtree.pruned <- prune(dtree,cp=0.01)
library(rpart.plot)
rpart.plot::prp(dtree.pruned,type=2,extra = 104,
                fallen.leaves = TRUE,main="决策树")

#extra = 104可画出每一类的概率以及每个节点处的样本占比

#从树的顶端开始,若满足条件,则从左枝往下,否则从右枝往下,该终端节点(nsplit+1)即为这一观测点所属类别

rpart.plot::prp(dtree.pruned,type=2,extra = 104,
                fallen.leaves = FALSE,main="决策树")  #左图

#将传统推断树结果展现形式变成条件推断树
library(partykit)
plot(as.party(dtree.pruned))                                  #右图

dtree.pred <- predict(dtree.pruned,newdata = df.validate,type = "class")
dtree.pref <- table(df.validate$class,dtree.pred,
                    dnn=c("actual","predicted"))
dtree.pref

#                      predicted                 
#  actual          benign    malignant 
#  benign         129         10             
#  malignant     2             69

17.3.2 条件推断树 传统决策树的一种变体

library(party)
fit.ctree <- party::ctree(class~.,data=df.train)
plot(fit.ctree,main="条件推断树")
#值得注意的是,对于条件推断树来说,剪枝不是必需的, 其生成过程相对更自动化一些。
#另外, party 包也提供了许多图像参数。每个节点中的阴影区域代表这个节点对应的恶性肿瘤比例


ctree.pred <- predict(fit.ctree,newdata = df.validate,type = "response")
ctree.pref <- table(df.validate$class,ctree.pred,
                    dnn=c("actual","predicted"))
dtree.pref

#                 predicted                          
#   actual             benign    malignant  
#   benign           129          10              
#   malignant       2             69

17.4 随机森林

随机森林算法的实质是基于决策树的分类器集成算法,其中每一棵树都依赖于一个随机向量,随机森林的所有向量都是独立同分布的。随机森林就是对数据集的列变量和行观测进行随机化,生成多个分类数,最终将分类树结果进行汇总。

随机森林相比于神经网络,降低了运算量的同时也提高了预测精度,而且该算法对多元共线性不敏感以及对缺失数据和非平衡数据比较稳健,可以很好地适应多达几千个解释变量数据集。

随机森林的一个明显缺点是分类方法难以理解和表达。另外,我们需要存储整个随机森林以对新样本单元分类。

library(randomForest)
set.seed(1234)
#基于经典决策树的随机森林 默认生成500棵树 importance用于计算模型变量的重要性
fit.forest <- randomForest(class~.,data = df.train,
                           importance=TRUE,na.action = na.roughfix)

#na.action=na.roughfix参数可以将数值变量中的缺失值替换成对应列的中位数;类别变量中的缺失值替换成对应列的众数类
fit.forest

importance(fit.forest,type = 2)
#type可以是1,也可以是2,用于判别计算变量重要性的方法,
#1表示使用精度平均较少值作为度量标准;2表示采用节点不纯度的平均减少值最为度量标准值越大说明变量的重要性越强

forest.pred <- predict(fit.forest,newdata = df.validate)
forest.pref <- table(df.validate$class,forest.pred,
                    dnn=c("actual","predicted"))
forest.pref

17.5 支持向量机

#支持向量机(SVM)旨在在多维空间找到一个能将全部样本单元分成两类的最优平面的过程。在R中SVM可以通过kernlab包的ksvm()函数和e1071包中的svm()函数实现,前者功能更强大,后者相对简单。

library(e1071)
set.seed(1234)
fit.svm <- e1071::svm(class~.,data=df.train)
fit.svm
svm.pred <- predict(fit.svm,newdata = na.omit(df.validate))

#svm函数默认在生成模型前对每个变量标准化,在预测新样本单元时不允许有缺失值出现
svm.pref <- table(na.omit(df.validate)$class,svm.pred,
                     dnn=c("actual","predicted"))
svm.pref

#选择调和参数
set.seed(1234)
#对不同的gamma和cost拟合一个带RBF核的SVM模型
tuned <- tune.svm(class~.,data = df.train,
                  gamma = 10^(-6:1),cost=10^(-10:10))
tuned
#- best parameters:
#  gamma cost
#  0.1   10
fit.svm1 <- e1071::svm(class~.,data=df.train,gamma=0.1,cost=10)
svm.pred1 <- predict(fit.svm1,newdata = na.omit(df.validate))

#svm在预测新样本单元时不允许有缺失值出现
svm.pref1 <- table(na.omit(df.validate)$class,svm.pred1,
                  dnn=c("actual","predicted"))
svm.pref1

17.6 选择预测效果最好的解

#预测准确性度量:敏感度sensitivity 特异性specificity 正例命中率positive predictive power 负例命中率negative predictive power 准确率accuracy

#评估二分类准确性 构建代码
performance <- function(table,n=2){
  if(!all(dim(table)==c(2,2)))
    stop("must be a 2*2 table")
  tn=table[1,1] #提取负类正确 良性被判断为良性
  fp=table[1,2] #提取负类错误 恶性被判断为良性
  fn=table[2,1] #提取正类错误 良性被判断为恶性
  tp=table[2,2] #提取正类正确 恶性被判断为恶性
  sensitivity=tp/(tp+fn)
  specificity=tn/(tn+fp)
  ppp=tp/(tp+fp)
  npp=tn/(tn+fn)
  hitrate=(tp+tn)/(tp+fn+fp+fn)
  result <- paste("sensitivity=",round(sensitivity,n),
                  "\nspecificity=",round(specificity,n),
                  "\npositive predictive power=",round(ppp,n),
                  "\nnegative predictive power=",round(npp,n),
                  "\naccuracy=",round(hitrate,n),"\n",sep="")
  cat(result)
}

#对本章提到的五个分类器进行性能比较
performance(logit.pref)
performance(dtree.pref)
performance(ctree.pref)
performance(forest.pref)
performance(svm.pref)

#本案例本次结果逻辑回归表现最佳

R语言实战-第十七章 R in action-chapter17相关推荐

  1. R语言实战笔记--第九章 方差分析

    R语言实战笔记–第九章 方差分析 标签(空格分隔): R语言 方差分析 术语 组间因子,组内因子,水平:组间因子和组同因子的区别是,组间因子对所有测试对象进行分组,而组内因子则把所有测试对象归为同一组 ...

  2. R语言实战 前三章 统计 数据框 经典画图

    目录 导论 案例1 stat 案例2 packages 第一章 R语言介绍 基本的操作命令 保存图片 第二章 创建数据集 2.1. 合并 2.2. 向量 2.2.1. 赋值 2.2.2. 删除 2.2 ...

  3. R语言实战第一,二章SQL版

    星辰大海 这是之前使用R语言完成的一道简单的数据统计题目链接: https://zhuanlan.zhihu.com/p/27092971 完成之后心理还是有点小得意的.但和答案一对比就发现问题了,自 ...

  4. R语言 数据挖掘:R语言实战 第六章 关联分析

    关注微信公共号:小程在线 关注CSDN博客:程志伟的博客 举例说明关联规则里面的核心概念--支持度.置信度.提升度 假设有10000个消费者,购买了1000个尿布,2000个啤酒,500个面包,这其中 ...

  5. 李倩星r语言实战_《基于R的统计分析与数据挖掘》教学大纲

    <基于 R 的统计分析与数据挖掘>课程教学大纲 课程代码: 090542009 课程英文名称: R Language and Data Mining 课程总学时: 32 讲课: 32 实验 ...

  6. R语言实战-第十八章 R处理缺失数据的高级方法

    第18章 处理缺失数据的高级方法 # 目的:识别缺失数据:检查导致数据缺失的原因:删除包含的缺失值的实例或用合理的数值代替(插补)缺失值 #主要包: mice包 #主要数据集:VIM包中的sleep数 ...

  7. R语言实战-读书笔记(第1 章 R语言介绍)

    *R语言实战所有学习笔记,如涉及侵权,请联系撤稿.* **标题号与书中标题号对应** R语言实战 第1章 R语言介绍     1.2 R的获取与安装         R可以在CRAN(Comprehe ...

  8. R语言实战笔记--第十五章 处理缺失数据

    R语言实战笔记–第十五章 处理缺失数据 标签(空格分隔): R语言 处理缺失数据 VIM mice 缺失值(NA),是导致我们计算错误的一大来源,处理缺失数据在实际的应用中有着较为重要的作用. 基本方 ...

  9. R语言实战笔记--第十二章 重抽样(置换检验)与自助法

    R语言实战笔记–第十二章 重抽样(置换检验)与自助法 标签(空格分隔): R语言 重抽样 自助法 置换检验 置换检验 双样本均值检验的时候,假设检验的方法就是,检查正态性.独立性.方差齐性,分别对应的 ...

最新文章

  1. linux7.4安装语言包,CentOS 7.4安装时报错最简单最直接的解决办法
  2. JAVA日期加减运算
  3. mysql C语言API接口及实例
  4. JAVA NIO之文件通道
  5. 设计模式---接口隔离模式之门面模式(Façade)
  6. 833系列——二叉排序树
  7. python基本知识、数据库、网络、编程等总结
  8. 使用pymc3可能遇到的问题及解决方法
  9. 快手与美团达成互联互通合作:美团将在快手上线小程序
  10. 扑克牌图片一张一张_扑克牌玩法 | 简单易上手的扑克游戏,重点是你没玩过!...
  11. 【LeetCode】【字符串】题号:*38. 外观数列
  12. 我用一根网线,制霸了宿舍的网络!
  13. [三分]求凹凸函数最值
  14. UVa 1645 Count
  15. 该为您的HTTPS安全证书续期了
  16. RabbitMQ:消费者ACK机制、生产者消息确认
  17. android chrome无法运行,Android 测试 Chrome 浏览器能正常启动 Chrome 浏览器,但是不能进行操作,求大神!!...
  18. 软件项目的测试计划和报告,如何撰写压力测试计划书与压力测试报告(一)
  19. 单片机反相器_AVR单片机在工业控制系统中的应用
  20. C语言实现二分法查找某个数字(超详细)

热门文章

  1. 实用拜占庭将军问题论文翻译
  2. 深度学习GPU服务器配置
  3. 成为wifi驱动工程师应该从什么开始学习
  4. 树结构使用实例---实现数组和树结构的转换
  5. 健康中原功能性农业 国稻种芯(河南)大健康产业成立生态集群
  6. 在独立进程中运行webview
  7. 奥特linux系统监控,奥特虾的复习笔记之《Linux高级运维》
  8. “操作无法完成,因为文件已在另一个程序中打开”怎么办?
  9. numpy,pytorch生成随机数,随机分布总结
  10. SVN历史版本删除 瘦身svn库