logit回归模型_R中⽐较⼏种不同分类模型的表现
然后的意思数据分析师常需要基于⼀组预测变量预测⼀个⼆分类问题,如根据个⼈信息和财务历史记录预测其是否会还贷等。
有监督学习领域中包含许多可⽤于分类的⽅法,如逻辑回归,决策树,随机森林,⽀持向量机,神经⽹络等。
本⽂主要介绍⽤R实现⼏种分类模型,采⽤相同的数据集,因此可以直接⽐较各个⽅法的结果,对于模型数学原理不做详细讨论。
主要内容
数据准备
逻辑回归
决策树分类
随机森林集成分类
⽀持向量机模型
评价分类准确性
1 数据准备
##安装必备程序包
pkgs"rpart","rpart.plot","party","randomForest","e1071")
install.packages(pkgs,depend=TRUE)
loc"archive.ics.uci.edu/ml/machine-learning-da
tabas/"
ds"breast-cancer-wisconsin/breast-cancer-wisconsin.data"
url" ")
##缺失值⽤?表⽰
breast",",header=FALSE,na.strings="?")
a"ID","clumpThickness","sizeUniformity","shapeUniformity","maginalAdhesion", "singleEpithelialCellSize","bareNuclei","blandChromation","normalNucleoli","mitos names(breast)df1]
df$class2,4),labels=c("benign","malignant"))
t.ed(1234)
train0.7*nrow(df))
table(df.validate$class)
显⽰前五条数据:
> df[1:5,]
clumpThickness sizeUniformity shapeUniformity maginalAdhesion singleEpithelialCellSize bareNuclei
1 5 1 1 1
2 1
2 5 4 4 5 7 10
3 3 1 1 1 2 2
4 6 8 8 1 3 4
5 4 1 1 3 2 1
blandChromation normalNucleoli mitosis class
1 3 1 1 benign
2 3 2 1 benign
3 3 1 1 benign
4 3 7 1 benign
5 3 1 1 benign
2 逻辑回归
逻辑回归是⼴义线性模型的⼀种,R中glm()可⽤于拟合逻辑回归问题,glm()函数⾃动将分类变量编码为相应的虚拟变量,本⽂中数据全部
为数值变量,因此不需要编码。
fit.logitsummary(fit.logit)
probtype="respon")
fit.logitsummary(fit.logit)
#predict()函数默认输出肿瘤为恶性的对数概率,指定参数type="respon"
#即可得到预测肿瘤为恶性的概率,概率⼤于0.5被分为恶性肿瘤,⼩于0.5良性
probtype="respon")
#⽣成混淆矩阵logit.pred,评估模型预测准确性
logit.pred.5,level=c(FALSE,TRUE),labels=c("begin","malignant"))
logit.perf$class,logit.pred,dnn=c("Actual","Predicted"))
logit.perf
回归结果以及预测效果如下:
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -12.4412 2.0547 -6.055 1.4e-09 ***
clumpThickness 0.7407 0.2262 3.275 0.00106 **
sizeUniformity -0.0320 0.3399 -0.094 0.92500
shapeUniformity 0.2073 0.3715 0.558 0.57680
maginalAdhesion 0.5194 0.1708 3.041 0.00236 **
singleEpithelialCellSize -0.3217 0.2613 -1.231 0.21831
bareNuclei 0.5851 0.1881 3.111 0.00187 **
blandChromation 0.8599 0.2923 2.942 0.00326 **
normalNucleoli 0.4036 0.1828 2.208 0.02725 *
mitosis 0.8923 0.3552 2.512 0.01200 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
吃什么对子宫好> logit.perf
Predicted
Actual begin malignant
benign 129 6
malignant 1 69
从混淆矩阵可以看出,模型正确识别了129个类别为良性的患者和69个类别为恶性的患者,且df.validate数据集有4个样本单元含有缺失值⽆法判断。
在验证集上,准确率为(129+69)/206=96.1%。
3 决策树
3.1 经典决策树
经典决策树以⼀个⼆元变量和⼀组预测变量为基础建⽴模型,具体算法如下:
(1)选定⼀个最佳预测变量将全部样本单元分为两类,实现两类中的纯度最⼤化(即⼀类中良性样本尽可能多,另⼀类中恶性尽可能多,纯度主要⽤信息熵和基尼系数表⽰)。如果预测变量连续,则选定⼀个分割点进⾏分类,使得两类纯度最⼤化;如果预测变量为分类变量,则对各类别进⾏合并再分类。
(2)对每⼀个⼦类别继续执⾏步骤(1)
(3)重复(1)~(2),直到⼦类别中所含的样本单元过少,或者没有分类能将不纯度下降到⼀个给定阈值以下。
(4)对任⼀样本执⾏决策树,得到其终端节点(terminal node),即可根据模型预测其所属类别。
其中熵定义为:
基尼系数:
当接近0或1时,D和G都接近于0,纯度最⼤;接近0.5时,纯度最⼩,信息最混乱。
注:上述算法可能会得到⼀颗过⼤的树,可采⽤10折交叉验证选择预测误差最⼩的树,即剪枝。
R中rpart包的rpart()函数⽤于构造决策树,prune()函数⽤于剪枝。
##经典决策树
library(rpart)
t.ed(1234)#设置随机种⼦
dtree"class",parms=list(split="information"))#创建决策树
dtree$cptable#返回不同⼤⼩树对应的预测误差
dtree.pruned#剪枝
library(rpart.plot)
prp(dtree.pruned,type=2,extra=104,fallen.leaves=TRUE,main="Decision Tree")画出树
dtree.predtype="class")我的幸福生活
dtree.perf$class,dtree.pred,dnn=c("Actual","Predicted"))
dtree.perf#得出预测矩阵
⾸先查看cptable内容:
> 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
二方连续cptable包含不同⼤⼩的树对应的预测误差,可以⽤来辅助设定最终的树的⼤⼩。复杂度参数(cp)⽤于惩罚过⼤的树,树的⼤⼩即分⽀数(nsplit),有n个分⽀的树将有n+1个终端节点;real error为训练集中各种树对应的误差,xerror是交叉验证误差。
查看dtree.perf预测矩阵:
> dtree.perf
Predicted
Actual benign malignant
benign 129 10
malignant 2 69
准确率(129+69)/210=94.2%,与逻辑回归不同的是,验证集中的210个样本都可以由最终决策树分类,
但是对于⽔平数很多或缺失值很多的预测变量,决策树可能有偏。
下⾯是最终⽣成的决策树:上图中,每⼀个节点处都有对应类别的概率以及样本单元的占⽐,⽐如最顶端的根节点,100%的样本单元中,有85%的单元良性,35%恶性。从树的顶端开始,若满⾜条件sizeUniformity<3,则从左枝往下,否则右枝往下重复这个过程直到碰到⼀个终端节点为⽌,该终端节点即为这⼀观测点的所属类别。
3.2 条件决策树
条件决策树与经典决策树类似,但变量与分割的选取是基于显著性检验的,⽽不是纯净度或同质性⼀类的度量,⽤到的显著性检验是置换检验。条件推断树算法如下:
(1)对输出变量与每个预测变量间的关系计算p值;
(2)选取p值最⼩的变量;
(3)在因变量与被选变量间尝试所有可能的⼆元分割(通过排列检验),并选取最显著的分割;
(4)将数据集分成两群,并对每个⼦群重复上述步骤;韩非之死
(5)重复直⾄所有分割都不显著或已达最⼩节点为⽌。
R中party包的ctree()函数可⽤于⽣成条件决策树:
##条件决策树####
library(party)怎样用英语骂人
<#plot()画出决策树,参数type="extended"表⽰展⽰条件推断树
,type="extended",main="Conditional Inference Tree")
ctree.predtype="respon")
赠刘景文宋苏轼
ctree.pref$class,ctree.pred,dnn=c("Actual","Predicted"))
ctree.pref
> ctree.pref
Predicted
Actual benign malignant
benign 131 8
malignant 4 67
上述条件决策树准确率为(131+67)/210=94.2%,下图展⽰了⼀棵条件推断树,每个节点中的阴影区域为这个节点处对应的恶性肿瘤⽐
例。
4 随机森林
随机森林是⼀种组成式的有监督学习⽅法,在随机森林中,同时⽣成多个预测模型,并将模型的结果汇总以提升准确率。
随机森林算法涉及对样本单元和变量进⾏抽样,从⽽⽣成⼤量决策树,对每个样本单元来说,所有决策树依次对其进⾏分类,所有决策树预测类别中的众数即为随机森林所预测的这⼀样本单元的类别。
对于N个样本单元,M个变量,其算法如下:
从训练集中随机有放回地抽取N个单元,⽣成⼤量决策树;
在每⼀个节点随机抽取m
完整⽣成所有决策树,⽆需剪枝(最⼩节点为1);
终端节点的所属类别由节点对应的众数类别决定;
对于新的观测点,⽤所有的树对其进⾏分类,其类别由多数决定原则⽣成。注:⽣成树没有⽤到的样
本点所对应的类别可由⽣成的树估计,与真实类别⽐较即可得到预测误差(也称为袋外预测,out-of-bag,OOB),这⼀特性在⽆法获得验证集时,是⼀⼤优势。
R中randomForest包中的randomForest()函数可⽤于⽣成随机森林,函数默认⽣成500棵树,每个节点处抽取个变量,最⼩节点为1。
####随机森林###
library("randomForest")
t.ed(1234)
fit.forest#na.ughfix:可将变量中缺失值换成对应的中位数,importance=TRUE度量变量重要性
fit.forest
importance(fit.forest,type=2)#输出变量重要性
##type=2:得到的变量相对重要性,就是分割该变量时节点不纯度的下降总量对所有树取平均
#节点不纯度由Gini系数确定
forest.predforest.pref$class,forest.pred,dnn=c("Actual","Predicted"))
forest.pref
plot(fit.forest)
> forest.pref
Predicted
周末语录Actual benign malignant
benign 128 7
malignant 2 68