登录
首页精彩阅读R语言实现决策树算法
R语言实现决策树算法
2018-06-11
收藏

R语言实现决策树算法

决策树算法的R实现
根据ppvk上的文章《基于 R 语言和 SPSS 的决策树算法介绍及应用》,只简单跑了关于R部分的代码,实验成功,简单记录下。
    决策树算法简介
    R语言实现
决策树算法
决策树算法是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。
一个简单的决策树示例(图片来源网络):

决策树由节点和有向边组成,内部节点代表了特征属性,外部节点(叶子节点)代表了类别,根据一步步地属性分类可以将整个特征空间进行划分,从而区别出不同的分类样本。好的决策树不仅对训练样本有着很好的分类效果,对于测试集也有着较低的误差率。
数据集纯度函数

信息增益
信息熵表示的是不确定度。均匀分布时,不确定度最大,此时熵就最大。当选择某个特征对数据集进行分类时,分类后的数据集信息熵会比分类前的小,其差值表示为信息增益。
假设在样本数据集 D 中,混有 c 种类别的数据。构建决策树时,根据给定的样本数据集选择某个特征值作为树的节点。
在数据集中,可以计算出该数据中的信息熵:其中 D 表示训练数据集,c 表示数据类别数,Pi 表示类别 i 样本数量占所有样本的比例。
作用前的信息熵公式

对应数据集 D,选择特征 A 作为决策树判断节点时,在特征 A 作用后的信息熵的为 Info(D),其中 k 表示样本 D 被分为 k 个部分。


信息增益表示数据集 D 在特征 A 的作用后,其信息熵减少的值
Gain\left ( A \right )=Info\left ( D \right ) - Info_{A}\left ( D \right )
对于决策树节点最合适的特征选择,就是 Gain(A) 值最大的特征

基尼指数

对于给定的样本集合D, c 表示数据集中类别的数量,Pi 表示类别 i 样


选取的属性为 A,那么分裂后的数据集 D 的基尼指数的计算公式,其中 k 表示样本 D 被分为 k 个部分,数据集 D 分裂成为 k 个 Dj 数据集。


对于特征选取,需要选择最小的分裂后的基尼指数。也可以用基尼指数增益值作为决策树选择特征的依据

R语言实现决策树算法
实现决策树算法之前首先确保自己已经安装了所需相应的语言包。安装方法有两种。
方法一:使用 install.packages( ) ,括号内填写要安装的包。例如
install.packages("rpart")
方法二:自己在官网下载好语言包,手动安装。使用方法一安装时,如果自己安装的R的版本过低,而R在执行 install.packages( )命令时,会自动下载最新版本,可能与计算机上安装的R的版本不符合,导致运行不成功等问题,这时需要自己去官网上下载与本机上R版本相符的语言包进行安装。安装方法如下:

点击按键,弹出页面

点击browse,浏览你所保存的r语言包,选中后,点击install,即可安装。

使用rpart包

# 导入构建决策树所需要的库   
library("rpart")
library("rpart.plot")
library("survival")
#--------------------------------------------------------------------------#
# A查看本次构建决策树所用的数据源  stagec
stagec
# 通过 rpart 函数构建决策树
fit <- rpart(Surv(pgtime,pgstat)~age+eet+g2+grade+gleason+ploidy,stagec,method="exp")
# 查看决策树的具体信息
print(fit)
printcp(fit)
# 绘制构建完的决策树
plot(fit, uniform=T, branch=0.6, compress=T)
text(fit, use.n=T)
# 通过 prune 函数剪枝
fit2 <- prune(fit, cp=0.016)
# 绘制剪枝完后的决策树
plot(fit2, uniform=T, branch=0.6, compress=T)
text(fit2, use.n=T)

#-------------------------------------------------------------------------#
#B(rpart包)使用TH.data包中的bodyfat数据集
str(TH.data::bodyfat)
dim(TH.data::bodyfat)
head(TH.data::bodyfat)
# 分别选取训练样本(70%)和测试样本(30%)
 set.seed(1234)
 indexa <- sample(2,nrow(TH.data::bodyfat),replace = TRUE,prob=c(0.7,0.3))
 bodyfat_train <- TH.data::bodyfat[indexa==1,]
 bodyfat_test <- TH.data::bodyfat[indexa==2,]
# 使用age、waistcirc等五个变量进行决策树分类
myFormulaa <- DEXfat ~ age + waistcirc + hipcirc + elbowbreadth + kneebreadth
# minsplit为最小分支节点数
bodyfat_rpart <- rpart(myFormulaa, data = bodyfat_train,  control = rpart.control(minsplit = 10))
# cptable: a matrix of information on the optimal prunings based on a complexity parameter.
 print(bodyfat_rpart$cptable)
 # 输出具体的决策树模型结果
 bodyfat_rpart
 # 可视化展示
 rpart.plot::rpart.plot(bodyfat_rpart)
 # 对决策树进行剪枝处理(prune),防止过度拟合
 opt <- which.min(bodyfat_rpart$cptable[,"xerror"])
 cp <- bodyfat_rpart$cptable[opt, "CP"]
 bodyfat_prune <- prune(bodyfat_rpart, cp = cp)
 plot(bodyfat_prune)
 text(bodyfat_prune,use.n=T)
 # 使用调整过后的决策树进行预测
 DEXfat_pred <- predict(bodyfat_prune, newdata=bodyfat_test)
 xlim <- range(TH.data::bodyfat$DEXfat)
 plot(DEXfat_pred ~ DEXfat, data=bodyfat_test, xlab="Observed", ylab="Predicted", ylim=xlim, xlim=xlim)
 # 为图形添加回归线,点的分布越靠近该线,则表示使用算法预测的精度越高
 abline(a=0,b=1)
使用party包

# 载入所用的包,使用ctree()函数
library(party)
#本次构建决策树所用的数据源 iris
str(iris)
set.seed(1234)
#分别选取训练样本(70%)和测试样本(30%)
indexb <- sample(2, nrow(iris), replace = TRUE, prob = c(0.7,0.3))
traindata <- iris[indexb == 1,]
testdata <- iris[indexb == 2,]
# 构建模型
myFormulab <- Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
iris_ctree <- ctree(myFormulab, data=traindata)
# 决策树模型的判断结果
table(predict(iris_ctree), traindata$Species)
# 输出具体的决策树模型结果
print(iris_ctree)
# 可视化展示
plot(iris_ctree)
plot(iris_ctree,type='simple')
# predict on test data
testpred <- predict(iris_ctree,newdata=testdata)
table(testpred,testdata$Species)

数据分析咨询请扫描二维码

客服在线
立即咨询