决策树分析主要是根据数据的属性建立决策模型。此模型经常被用来解决回归问题和分类问题。常见的算法包括ID3,C4.5,随机森林和CART。其中ID3主要对可选值多的属性具有一定的偏向性;相反,C4.5则主要对可选值少的属性具有一定的偏向性。最终便设计了CART算法来中和这两个极端。CART在特征选取的时候引入了基尼指数,此指数主要是数据纯度的度量方法。所谓数据纯度,就其表面意思便是指的通过特征选择获取的分类结果的纯度情况。当然还有其它的纯度评价函数,那就是信息增益,这个参数可以度量某个特征对分类结果影像的大小,从而确定可以使得模型得到高纯度分类结果的特征属性。接下来我们看下在R中如何实现决策树的分析。实现的包不止一个,包括rpat,party等。我们今天主要介绍party的使用。首先看下包的安装:
代码语言:javascript复制install.packages(“party”)
install.packages("mlbench")
在此包中决策树分类模型分为两种:一种针对连续性变量的回归模型;一种是针对分类变量的分类模型。我们直接利用实例对两种模型进行展示:
代码语言:javascript复制##载入包
library(party)
library(mlbench)
1. 回归模型的构建:其中包括了线性回归,逻辑回归等
代码语言:javascript复制##回归模型
data("BostonHousing", package ="mlbench")
代码语言:javascript复制##数据转化
BostonHousing$lstat <-log(BostonHousing$lstat)
BostonHousing$rm <- BostonHousing$rm^2
BostonHousing$chas <-factor(BostonHousing$chas, levels = 0:1, labels = c("no","yes"))
BostonHousing$rad <-factor(BostonHousing$rad, ordered = TRUE)
代码语言:javascript复制##参数设置,线性模型构建。通过model参数进行设置。
ctrl <- mob_control(alpha = 0.05,bonferroni = TRUE, minsplit = 40, objfun = deviance, verbose = TRUE)
fmBH <- mob(medv ~lstat rm | zn indus chas nox age dis rad tax crim ,data =BostonHousing, control = ctrl, model = linearModel)
从上图可以看出基于|右边变量进行对数据进行纯化,左边的数据用来构建回归模型。最终在每个节点进行对以lstat或者rm作为X轴以medv作为Y轴进行散点图的绘制。并可以看出每个最后节点对应的可以评估的数量。从而进行回归模型的评估。
为了进一步评估模型的可靠性,我们可以查看我们觉得靠谱的各节点的模型构建情况:
代码语言:javascript复制# 单节点查看
summary(fmBH, node = 12)
图中画横线的部分可以提供评价模型的依据。其中Adjusted R-squared为负无穷到1的范围,值越大越好。
代码语言:javascript复制##查看模型参数
coef(fmBH)
此处列出的便是对应节点的模型参数表。
代码语言:javascript复制##单节点分类变量统计结果
sctest(fmBH, node = 7)
这里主要是对在对应的节点中每个分类变量进行结构改变分析。所谓结构改变分析指的是某个分类变量中值的差异是否影响模型预测。通俗点讲就是模型是否对所有的属性都是一致的。此处进行的检验结果中如果P<0.05那么就是模型会有差异的,也就是说模型并不是最优的。
2. 分类模型的构建:
代码语言:javascript复制##数据创建
ls <- data.frame(y = gl(3, 50, labels =c("A", "B", "C")), x1 = rnorm(150) rep(c(1, 0, 50)),x2 = runif(150))
ctree(y ~ x1 x2, data = ls)
当然在这里也有对应的ctree_control函数对模型进行参数的设置。我们直接看下在e1071包中的鸢尾花数据集的实例:
代码语言:javascript复制library(e1071)
trainData <- iris
myFormula <- Species ~ Sepal.Length Sepal.Width Petal.Length Petal.Width
iris_ctree <- ctree(myFormula,data=trainData)
plot(iris_ctree)
其解释和前面的其实差不多,在这里最后只是换成来的对应的各分类的比例柱状图。同样我们也可以看下其详细的各节点信息。
代码语言:javascript复制##单节点信息
nodes(iris_ctree, 4)
代码语言:javascript复制##简化决策树的展示
plot(iris_ctree, type="simple")
当然接下来就是对分类模型的预测水平进行评价,在这里就不进行赘述了,应该在很多分类算法都进行了详细的介绍。
欢迎大家学习交流!