《R语言实战》第二版碎碎念之七:逻辑回归和决策树

需要三个包。

pkgs <- c("rpart", "rpart.plot", "party","randomForest", "e1071")

install.packages(pkgs, depend=TRUE)

(1)逻辑回归,应用glm()建立模型,建立模型前,记得用factor(df$class,levels=c(),labels=c())把需要分类的列因子化,用logit.fit.reduced <- step(fit.logit)得到一个精简的模型。predict(fitmodel,data.validate,type="“)预测。

(2)决策树

经典决策树,以一个二元输出变量和一组预测变量为基础。

1) 选定一个最佳预测变量将全部样本单元分为两类,实现两类中的纯度最大化。如果预测变量连续,则选定一个分割点进行分类,使得两类纯度最大化;如果预测变量为分类变量,则对各类别进行合并再分类。

2) 对每一个子类别继续执行步骤(1)。

3) 重复步骤1)~2),直到子类别中所含的样本单元数过少,或者没有分类法能将不纯度下降到一个给定阈值以下。最终集中的子类别即终端节点(terminal node)。根据每一个终端节点中样本单元的类别数众数来判别这一终端节点的所属类别。

4) 对任一样本单元执行决策树,得到其终端节点,即可根据步骤3得到模型预测的所属类别。上述算法通常会得到一棵过大的树,从而出现过拟合现象。结果就是,对于训练集外单元的分类性能较差。为解决这一问题,可采用10折交叉验证法选择预测误差最小的树。这一剪枝后的树即可用于预测。

R中的rpart包支持rpart()函数构造决策树, prune()函数对决策树进行剪枝。

library(rpart)

dtree <- rpart(class~.,data=df.train,method = "class",parms = list(split="information"))

rpart(formula, data, weights, subset, na.action = na.rpart, method, model = FALSE, x = FALSE, y = TRUE, parms, control, cost, ...)

dtree$cptable

rpart()返回的cptable值中包括不同大小的树对应的预测误差,因此可用于辅助设定最终的树的大小。其中,复杂度参数(cp)用于惩罚过大的树;树的大小即分支数(nsplit),有n个分支的树将有n+1个终端节点; rel error栏即训练集中各种树对应的误差;交叉验证误差(xerror)即基于训练样本所得的10折交叉验证误差; xstd栏为交叉验证误差的标准差。

plotcp(dtree)

dtree.pruned <- prune(dtree,cp=0.0125)

这里的cp可从前面的dtree$cptable里查询到。

library(rpart.plot)

prp(dtree.pruned,type=2,extra = 104,fallen.leaves = TRUE,main="Decision Tree")

dtree.pred <- predict(dtree.pruned,df.validate,type="class")

dtree.perf <- table(df.validate$class,dtree.pred,dnn=c("Actual","Predicted"))

dtree.perf

(3)条件推断树

条件推断树(conditionalinference tree)。条件推断树与传统决策树类似,但变量和分割的选取是基于显著性检验的,而不是纯净度或同质性一类的度量。显著性检验是置换检验。1) 对输出变量与每个预测变量间的关系计算p值。2) 选取p值最小的变量。3) 在因变量与被选中的变量间尝试所有可能的二元分割(通过排列检验),并选取最显著的分割。4) 将数据集分成两群,并对每个子群重复上述步骤。5) 重复直至所有分割都不显著或已到达最小节点为止。

条件推断树可由party包中的ctree()函数获得,对于条件推断树来说,剪枝不是必需的,其生成过程相对更自动化一些。

library(party)

fit.ctree <- ctree(class~.,data=df.train)

plot(fit.ctree,main="Conditional Inference Tree")

ctree.pred <- predict(fit.ctree,df.validate,type="response")

ctree.perf <- table(df.validate$class,ctree.pred,dnn=c("Actual","Predicted"))

ctree.perf

party包里绘制的条件推断树,每个节点中的阴影区域代表这个节点对应的(哪个的)比例。用形如ctree()的图展示rpart()生成的决策树。如果通过rpart()函数得到一棵经典决策树,但想要以图party的形式展示这棵决策树,则可借助partykit包。安装并载入这个包后,可通过plot(as.party(dtree.pruned))绘制想要的图。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注